eolian: add a way to query the builtin type of a type

This commit is contained in:
Daniel Kolesa 2017-09-22 20:38:17 +02:00
parent 9009d3dae4
commit c146d6f877
4 changed files with 83 additions and 0 deletions

View File

@ -231,6 +231,67 @@ typedef enum
EOLIAN_TYPE_UNDEFINED
} Eolian_Type_Type;
typedef enum
{
EOLIAN_TYPE_BUILTIN_INVALID = 0,
EOLIAN_TYPE_BUILTIN_BYTE,
EOLIAN_TYPE_BUILTIN_UBYTE,
EOLIAN_TYPE_BUILTIN_CHAR,
EOLIAN_TYPE_BUILTIN_SHORT,
EOLIAN_TYPE_BUILTIN_USHORT,
EOLIAN_TYPE_BUILTIN_INT,
EOLIAN_TYPE_BUILTIN_UINT,
EOLIAN_TYPE_BUILTIN_LONG,
EOLIAN_TYPE_BUILTIN_ULONG,
EOLIAN_TYPE_BUILTIN_LLONG,
EOLIAN_TYPE_BUILTIN_ULLONG,
EOLIAN_TYPE_BUILTIN_INT8,
EOLIAN_TYPE_BUILTIN_UINT8,
EOLIAN_TYPE_BUILTIN_INT16,
EOLIAN_TYPE_BUILTIN_UINT16,
EOLIAN_TYPE_BUILTIN_INT32,
EOLIAN_TYPE_BUILTIN_UINT32,
EOLIAN_TYPE_BUILTIN_INT64,
EOLIAN_TYPE_BUILTIN_UINT64,
EOLIAN_TYPE_BUILTIN_INT128,
EOLIAN_TYPE_BUILTIN_UINT128,
EOLIAN_TYPE_BUILTIN_SIZE,
EOLIAN_TYPE_BUILTIN_SSIZE,
EOLIAN_TYPE_BUILTIN_INTPTR,
EOLIAN_TYPE_BUILTIN_UINTPTR,
EOLIAN_TYPE_BUILTIN_PTRDIFF,
EOLIAN_TYPE_BUILTIN_TIME,
EOLIAN_TYPE_BUILTIN_FLOAT,
EOLIAN_TYPE_BUILTIN_DOUBLE,
EOLIAN_TYPE_BUILTIN_BOOL,
EOLIAN_TYPE_BUILTIN_VOID,
EOLIAN_TYPE_BUILTIN_ACCESSOR,
EOLIAN_TYPE_BUILTIN_ARRAY,
EOLIAN_TYPE_BUILTIN_ITERATOR,
EOLIAN_TYPE_BUILTIN_HASH,
EOLIAN_TYPE_BUILTIN_LIST,
EOLIAN_TYPE_BUILTIN_FUTURE,
EOLIAN_TYPE_BUILTIN_ANY_VALUE,
EOLIAN_TYPE_BUILTIN_ANY_VALUE_PTR,
EOLIAN_TYPE_BUILTIN_MSTRING,
EOLIAN_TYPE_BUILTIN_STRING,
EOLIAN_TYPE_BUILTIN_STRINGSHARE,
EOLIAN_TYPE_BUILTIN_VOID_PTR,
EOLIAN_TYPE_BUILTIN_FREE_CB
} Eolian_Type_Builtin_Type;
typedef enum
{
EOLIAN_C_TYPE_DEFAULT = 0,
@ -1745,6 +1806,19 @@ EAPI const Eolian_Function *eolian_typedecl_function_pointer_get(const Eolian_Ty
*/
EAPI Eolian_Type_Type eolian_type_type_get(const Eolian_Type *tp);
/*
* @brief Get the builtin type of a type.
*
* @param[in] tp the type.
* @return an Eolian_Type_Builtin_Type.
*
* If the input type is NULL or it's not a builtin, EOLIAN_TYPE_BUILTIN_INVALID
* is returned.
*
* @ingroup Eolian
*/
EAPI Eolian_Type_Builtin_Type eolian_type_builtin_type_get(const Eolian_Type *tp);
/*
* @brief Get the filename of a type.
*

View File

@ -103,6 +103,13 @@ eolian_type_type_get(const Eolian_Type *tp)
return tp->type;
}
EAPI Eolian_Type_Builtin_Type
eolian_type_builtin_type_get(const Eolian_Type *tp)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EOLIAN_TYPE_BUILTIN_INVALID);
return tp->btype;
}
EAPI Eolian_Typedecl_Type
eolian_typedecl_type_get(const Eolian_Typedecl *tp)
{

View File

@ -757,6 +757,7 @@ parse_type_void(Eo_Lexer *ls, Eina_Bool allow_ref)
check(ls, TOK_VALUE);
if (eo_lexer_is_type_keyword(ls->t.kw))
{
def->btype = ls->t.kw - KW_byte + 1;
_fill_name(eina_stringshare_ref(ls->t.value.s), &def->full_name,
&def->name, &def->namespaces);
eo_lexer_get(ls);

View File

@ -156,6 +156,7 @@ struct _Eolian_Type
{
Eolian_Object base;
Eolian_Type_Type type;
Eolian_Type_Builtin_Type btype;
Eolian_Type *base_type;
Eolian_Type *next_type;
Eina_Stringshare *name;