Pyolian: new APIs for typedecl lookups

This commit is contained in:
Davide Andreoli 2018-03-01 17:08:56 +01:00
parent 20f7d6f35f
commit 939cb26bd9
5 changed files with 140 additions and 92 deletions

View File

@ -139,7 +139,7 @@ if args.step in ('classes', None):
# render a page for each Enum
if args.step in ('enums', None):
t = Template('doc_enum.template')
for enum in eolian_db.typedecl_all_enums:
for enum in eolian_db.enums:
if enum.full_name.startswith(args.namespace):
output_file = page_path_for_object(enum)
t.render(output_file, args.verbose, enum=enum.full_name)
@ -147,7 +147,7 @@ if args.step in ('enums', None):
# render a page for each Struct
if args.step in ('structs', None):
t = Template('doc_struct.template')
for struct in eolian_db.typedecl_all_structs:
for struct in eolian_db.structs:
if struct.full_name.startswith(args.namespace):
output_file = page_path_for_object(struct)
t.render(output_file, args.verbose, struct=struct.full_name)
@ -155,7 +155,7 @@ if args.step in ('structs', None):
# render a page for each Alias
if args.step in ('aliases', None):
t = Template('doc_alias.template')
for alias in eolian_db.typedecl_all_aliases:
for alias in eolian_db.aliases:
if alias.full_name.startswith(args.namespace):
output_file = page_path_for_object(alias)
t.render(output_file, args.verbose, alias=alias.full_name)

View File

@ -365,6 +365,30 @@ class Eolian_Unit(EolianBaseObject):
c_var = lib.eolian_unit_global_by_name_get(self._obj, _str_to_bytes(name))
return Variable(c_var) if c_var else None
@property
def enums(self):
return Iterator(Typedecl, lib.eolian_unit_enums_get(self._obj))
def enum_by_name_get(self, name):
c_tdecl = lib.eolian_unit_enum_by_name_get(self._obj, _str_to_bytes(name))
return Typedecl(c_tdecl) if c_tdecl else None
@property
def structs(self):
return Iterator(Typedecl, lib.eolian_unit_structs_get(self._obj))
def struct_by_name_get(self, name):
c_tdecl = lib.eolian_unit_struct_by_name_get(self._obj, _str_to_bytes(name))
return Typedecl(c_tdecl) if c_tdecl else None
@property
def aliases(self):
return Iterator(Typedecl, lib.eolian_unit_aliases_get(self._obj))
def alias_by_name_get(self, name):
c_tdecl = lib.eolian_unit_alias_by_name_get(self._obj, _str_to_bytes(name))
return Typedecl(c_tdecl) if c_tdecl else None
@property
def all_namespaces(self):
@ -372,53 +396,17 @@ class Eolian_Unit(EolianBaseObject):
nspaces = set()
for obj in self.classes:
nspaces.add(Namespace(self, obj.namespace))
for obj in self.typedecl_all_aliases:
for obj in self.aliases:
nspaces.add(Namespace(self, obj.namespace))
for obj in self.typedecl_all_structs:
for obj in self.structs:
nspaces.add(Namespace(self, obj.namespace))
for obj in self.typedecl_all_enums:
for obj in self.enums:
nspaces.add(Namespace(self, obj.namespace))
return sorted(nspaces)
def namespace_get_by_name(self, name):
return Namespace(self, name)
@property
def typedecl_all_enums(self):
return Iterator(Typedecl, lib.eolian_typedecl_all_enums_get(self._obj))
def typedecl_enum_get_by_name(self, name):
c_tdecl = lib.eolian_typedecl_enum_get_by_name(self._obj, _str_to_bytes(name))
return Typedecl(c_tdecl) if c_tdecl else None
def typedecl_enums_get_by_file(self, fname):
return Iterator(Typedecl,
lib.eolian_typedecl_enums_get_by_file(self._obj, _str_to_bytes(fname)))
@property
def typedecl_all_structs(self):
return Iterator(Typedecl, lib.eolian_typedecl_all_structs_get(self._obj))
def typedecl_struct_get_by_name(self, name):
c_tdecl = lib.eolian_typedecl_struct_get_by_name(self._obj, _str_to_bytes(name))
return Typedecl(c_tdecl) if c_tdecl else None
def typedecl_structs_get_by_file(self, fname):
return Iterator(Typedecl,
lib.eolian_typedecl_structs_get_by_file(self._obj, _str_to_bytes(fname)))
@property
def typedecl_all_aliases(self):
return Iterator(Typedecl, lib.eolian_typedecl_all_aliases_get(self._obj))
def typedecl_alias_get_by_name(self, name):
c_tdecl = lib.eolian_typedecl_alias_get_by_name(self._obj, _str_to_bytes(name))
return Typedecl(c_tdecl) if c_tdecl else None
def typedecl_aliases_get_by_file(self, fname):
return Iterator(Typedecl,
lib.eolian_typedecl_aliases_get_by_file(self._obj, _str_to_bytes(fname)))
@property
def all_declarations(self):
return Iterator(Declaration, lib.eolian_all_declarations_get(self._obj))
@ -516,6 +504,42 @@ class Eolian_State(Eolian_Unit):
return Iterator(Variable,
lib.eolian_state_globals_by_file_get(self._obj, _str_to_bytes(file_name)))
@property
def aliases(self):
return Iterator(Typedecl, lib.eolian_state_aliases_get(self._obj))
def alias_by_name_get(self, name):
c_tdecl = lib.eolian_state_alias_by_name_get(self._obj, _str_to_bytes(name))
return Typedecl(c_tdecl) if c_tdecl else None
def aliases_by_file_get(self, file_name):
return Iterator(Typedecl,
lib.eolian_state_aliases_by_file_get(self._obj, _str_to_bytes(file_name)))
@property
def structs(self):
return Iterator(Typedecl, lib.eolian_state_structs_get(self._obj))
def struct_by_name_get(self, name):
c_tdecl = lib.eolian_state_struct_by_name_get(self._obj, _str_to_bytes(name))
return Typedecl(c_tdecl) if c_tdecl else None
def structs_by_file_get(self, file_name):
return Iterator(Typedecl,
lib.eolian_state_structs_by_file_get(self._obj, _str_to_bytes(file_name)))
@property
def enums(self):
return Iterator(Typedecl, lib.eolian_state_enums_get(self._obj))
def enum_by_name_get(self, name):
c_tdecl = lib.eolian_state_enum_by_name_get(self._obj, _str_to_bytes(name))
return Typedecl(c_tdecl) if c_tdecl else None
def enums_by_file_get(self, file_name):
return Iterator(Typedecl,
lib.eolian_state_enums_by_file_get(self._obj, _str_to_bytes(file_name)))
### Namespace Utility Class #################################################
@ -590,17 +614,17 @@ class Namespace(object):
@property
def aliases(self):
return sorted([ td for td in self._unit.typedecl_all_aliases
return sorted([ td for td in self._unit.aliases
if td.namespace == self._name])
@property
def structs(self):
return sorted([ td for td in self._unit.typedecl_all_structs
return sorted([ td for td in self._unit.structs
if td.namespace == self._name])
@property
def enums(self):
return sorted([ td for td in self._unit.typedecl_all_enums
return sorted([ td for td in self._unit.enums
if td.namespace == self._name])

View File

@ -129,6 +129,42 @@ lib.eolian_state_constants_get.restype = c_void_p
lib.eolian_state_globals_get.argtypes = [c_void_p,]
lib.eolian_state_globals_get.restype = c_void_p
# EAPI const Eolian_Typedecl *eolian_state_alias_by_name_get(const Eolian_State *state, const char *name);
lib.eolian_state_alias_by_name_get.argtypes = [c_void_p, c_char_p]
lib.eolian_state_alias_by_name_get.restype = c_void_p
# EAPI const Eolian_Typedecl *eolian_state_struct_by_name_get(const Eolian_State *state, const char *name);
lib.eolian_state_struct_by_name_get.argtypes = [c_void_p, c_char_p]
lib.eolian_state_struct_by_name_get.restype = c_void_p
# EAPI const Eolian_Typedecl *eolian_state_enum_by_name_get(const Eolian_State *state, const char *name);
lib.eolian_state_enum_by_name_get.argtypes = [c_void_p, c_char_p]
lib.eolian_state_enum_by_name_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_state_aliases_by_file_get(const Eolian_State *state, const char *file_name);
lib.eolian_state_aliases_by_file_get.argtypes = [c_void_p, c_char_p]
lib.eolian_state_aliases_by_file_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_state_structs_by_file_get(const Eolian_State *state, const char *file_name);
lib.eolian_state_structs_by_file_get.argtypes = [c_void_p, c_char_p]
lib.eolian_state_structs_by_file_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_state_enums_by_file_get(const Eolian_State *state, const char *file_name);
lib.eolian_state_enums_by_file_get.argtypes = [c_void_p, c_char_p]
lib.eolian_state_enums_by_file_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_state_aliases_get(const Eolian_State *state);
lib.eolian_state_aliases_get.argtypes = [c_void_p,]
lib.eolian_state_aliases_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_state_structs_get(const Eolian_State *state);
lib.eolian_state_structs_get.argtypes = [c_void_p,]
lib.eolian_state_structs_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_state_enums_get(const Eolian_State *state);
lib.eolian_state_enums_get.argtypes = [c_void_p,]
lib.eolian_state_enums_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_declarations_get_by_file(const Eolian_State *state, const char *fname);
lib.eolian_declarations_get_by_file.argtypes = [c_void_p, c_char_p]
lib.eolian_declarations_get_by_file.restype = c_void_p
@ -151,41 +187,29 @@ lib.eolian_unit_class_by_name_get.restype = c_void_p
lib.eolian_unit_classes_get.argtypes = [c_void_p,]
lib.eolian_unit_classes_get.restype = c_void_p
# EAPI const Eolian_Typedecl *eolian_typedecl_alias_get_by_name(const Eolian_Unit *unit, const char *name);
lib.eolian_typedecl_alias_get_by_name.argtypes = [c_void_p, c_char_p]
lib.eolian_typedecl_alias_get_by_name.restype = c_void_p
# EAPI const Eolian_Typedecl *eolian_unit_alias_by_name_get(const Eolian_Unit *unit, const char *name);
lib.eolian_unit_alias_by_name_get.argtypes = [c_void_p, c_char_p]
lib.eolian_unit_alias_by_name_get.restype = c_void_p
# EAPI const Eolian_Typedecl *eolian_typedecl_struct_get_by_name(const Eolian_Unit *unit, const char *name);
lib.eolian_typedecl_struct_get_by_name.argtypes = [c_void_p, c_char_p]
lib.eolian_typedecl_struct_get_by_name.restype = c_void_p
# EAPI const Eolian_Typedecl *eolian_unit_struct_by_name_get(const Eolian_Unit *unit, const char *name);
lib.eolian_unit_struct_by_name_get.argtypes = [c_void_p, c_char_p]
lib.eolian_unit_struct_by_name_get.restype = c_void_p
# EAPI const Eolian_Typedecl *eolian_typedecl_enum_get_by_name(const Eolian_Unit *unit, const char *name);
lib.eolian_typedecl_enum_get_by_name.argtypes = [c_void_p, c_char_p]
lib.eolian_typedecl_enum_get_by_name.restype = c_void_p
# EAPI const Eolian_Typedecl *eolian_unit_enum_by_name_get(const Eolian_Unit *unit, const char *name);
lib.eolian_unit_enum_by_name_get.argtypes = [c_void_p, c_char_p]
lib.eolian_unit_enum_by_name_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_typedecl_aliases_get_by_file(const Eolian_Unit *unit, const char *fname);
lib.eolian_typedecl_aliases_get_by_file.argtypes = [c_void_p, c_char_p]
lib.eolian_typedecl_aliases_get_by_file.restype = c_void_p
# EAPI Eina_Iterator *eolian_unit_aliases_get(const Eolian_Unit *unit);
lib.eolian_unit_aliases_get.argtypes = [c_void_p,]
lib.eolian_unit_aliases_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_typedecl_structs_get_by_file(const Eolian_Unit *unit, const char *fname);
lib.eolian_typedecl_structs_get_by_file.argtypes = [c_void_p, c_char_p]
lib.eolian_typedecl_structs_get_by_file.restype = c_void_p
# EAPI Eina_Iterator *eolian_unit_structs_get(const Eolian_Unit *unit);
lib.eolian_unit_structs_get.argtypes = [c_void_p,]
lib.eolian_unit_structs_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_typedecl_enums_get_by_file(const Eolian_Unit *unit, const char *fname);
lib.eolian_typedecl_enums_get_by_file.argtypes = [c_void_p, c_char_p]
lib.eolian_typedecl_enums_get_by_file.restype = c_void_p
# EAPI Eina_Iterator *eolian_typedecl_all_aliases_get(const Eolian_Unit *unit);
lib.eolian_typedecl_all_aliases_get.argtypes = [c_void_p,]
lib.eolian_typedecl_all_aliases_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_typedecl_all_structs_get(const Eolian_Unit *unit);
lib.eolian_typedecl_all_structs_get.argtypes = [c_void_p,]
lib.eolian_typedecl_all_structs_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_typedecl_all_enums_get(const Eolian_Unit *unit);
lib.eolian_typedecl_all_enums_get.argtypes = [c_void_p,]
lib.eolian_typedecl_all_enums_get.restype = c_void_p
# EAPI Eina_Iterator *eolian_unit_enums_get(const Eolian_Unit *unit);
lib.eolian_unit_enums_get.argtypes = [c_void_p,]
lib.eolian_unit_enums_get.restype = c_void_p
# EAPI const Eolian_Variable *eolian_unit_global_by_name_get(const Eolian_Unit *unit, const char *name);
lib.eolian_unit_global_by_name_get.argtypes = [c_void_p, c_char_p]

View File

@ -167,11 +167,11 @@ class Template(pyratemp.Template):
if ns:
ctx['namespace'] = eolian_db.namespace_get_by_name(ns)
if struct:
ctx['struct'] = eolian_db.typedecl_struct_get_by_name(struct)
ctx['struct'] = eolian_db.struct_by_name_get(struct)
if enum:
ctx['enum'] = eolian_db.typedecl_enum_get_by_name(enum)
ctx['enum'] = eolian_db.enum_by_name_get(enum)
if alias:
ctx['alias'] = eolian_db.typedecl_alias_get_by_name(alias)
ctx['alias'] = eolian_db.alias_by_name_get(alias)
if verbose and filename:
print("rendering: {} => {}".format(

View File

@ -37,8 +37,8 @@ class TestBaseObject(unittest.TestCase):
self.assertNotEqual(cls1, None)
self.assertNotEqual(cls1, 0)
enum1 = eolian_db.typedecl_enum_get_by_name('Efl.Ui.Focus.Direction')
enum2 = eolian_db.typedecl_enum_get_by_name('Efl.Ui.Focus.Direction')
enum1 = eolian_db.enum_by_name_get('Efl.Ui.Focus.Direction')
enum2 = eolian_db.enum_by_name_get('Efl.Ui.Focus.Direction')
self.assertIsInstance(enum1, eolian.Typedecl)
self.assertIsInstance(enum2, eolian.Typedecl)
self.assertEqual(enum1, enum2)
@ -95,20 +95,20 @@ class TestEolianUnit(unittest.TestCase):
self.assertTrue(l[0].endswith('.eot'))
def test_enum_listing(self):
l = list(eolian_db.typedecl_enums_get_by_file('efl_ui_win.eo'))
l = list(eolian_db.enums_by_file_get('efl_ui_win.eo'))
self.assertGreater(len(l), 5)
self.assertIsInstance(l[0], eolian.Typedecl)
self.assertEqual(l[0].type, eolian.Eolian_Typedecl_Type.ENUM)
all_count = 0
for enum in eolian_db.typedecl_all_enums:
for enum in eolian_db.enums:
self.assertIsInstance(enum, eolian.Typedecl)
self.assertEqual(enum.type, eolian.Eolian_Typedecl_Type.ENUM)
all_count += 1
self.assertGreater(all_count, 50)
def test_struct_listing(self):
l = list(eolian_db.typedecl_structs_get_by_file('eina_types.eot'))
l = list(eolian_db.structs_by_file_get('eina_types.eot'))
self.assertGreater(len(l), 10)
self.assertIsInstance(l[0], eolian.Typedecl)
self.assertIn(l[0].type, (
@ -116,7 +116,7 @@ class TestEolianUnit(unittest.TestCase):
eolian.Eolian_Typedecl_Type.STRUCT_OPAQUE))
all_count = 0
for struct in eolian_db.typedecl_all_structs:
for struct in eolian_db.structs:
self.assertIsInstance(struct, eolian.Typedecl)
self.assertIn(struct.type, (
eolian.Eolian_Typedecl_Type.STRUCT,
@ -125,12 +125,12 @@ class TestEolianUnit(unittest.TestCase):
self.assertGreater(all_count, 50)
def test_alias_listing(self):
l = list(eolian_db.typedecl_aliases_get_by_file('edje_types.eot'))
l = list(eolian_db.aliases_by_file_get('edje_types.eot'))
self.assertGreater(len(l), 5)
self.assertIsInstance(l[0], eolian.Typedecl)
all_count = 0
for alias in eolian_db.typedecl_all_aliases:
for alias in eolian_db.aliases:
self.assertIsInstance(alias, eolian.Typedecl)
self.assertIn(alias.type, (
eolian.Eolian_Typedecl_Type.ALIAS,
@ -422,7 +422,7 @@ class TestEolianVariable(unittest.TestCase):
class TestEolianTypedecl(unittest.TestCase):
def test_typedecl_enum(self):
td = eolian_db.typedecl_enum_get_by_name('Efl.Net.Http.Version')
td = eolian_db.enum_by_name_get('Efl.Net.Http.Version')
self.assertIsInstance(td, eolian.Typedecl)
self.assertEqual(td.name, 'Version')
self.assertEqual(td.full_name, 'Efl.Net.Http.Version')
@ -437,7 +437,7 @@ class TestEolianTypedecl(unittest.TestCase):
self.assertEqual(td.c_type, 'enum Efl_Net_Http_Version { v1_0 = 100, v1_1 = 101, v2_0 = 200 }')
def test_typedecl_enum_field(self):
td = eolian_db.typedecl_enum_get_by_name('Efl.Net.Http.Version')
td = eolian_db.enum_by_name_get('Efl.Net.Http.Version')
field = td.enum_field_get('v1_0')
self.assertIsInstance(field, eolian.Enum_Type_Field)
self.assertEqual(field.name, 'v1_0')
@ -446,7 +446,7 @@ class TestEolianTypedecl(unittest.TestCase):
self.assertIsInstance(field.value, eolian.Expression)
def test_typedecl_struct(self):
td = eolian_db.typedecl_struct_get_by_name('Efl.Gfx.Color32')
td = eolian_db.struct_by_name_get('Efl.Gfx.Color32')
self.assertIsInstance(td, eolian.Typedecl)
self.assertEqual(td.name, 'Color32')
self.assertEqual(td.full_name, 'Efl.Gfx.Color32')
@ -461,7 +461,7 @@ class TestEolianTypedecl(unittest.TestCase):
self.assertEqual(td.c_type, 'struct Efl_Gfx_Color32 { uint8_t r; uint8_t g; uint8_t b; uint8_t a; }')
def test_typedecl_struct_field(self):
td = eolian_db.typedecl_struct_get_by_name('Efl.Gfx.Color32')
td = eolian_db.struct_by_name_get('Efl.Gfx.Color32')
field = td.struct_field_get('b')
self.assertIsInstance(field, eolian.Struct_Type_Field)
self.assertEqual(field.name, 'b')
@ -469,7 +469,7 @@ class TestEolianTypedecl(unittest.TestCase):
self.assertIsInstance(field.documentation, eolian.Documentation)
def test_typedecl_alias(self):
alias = eolian_db.typedecl_alias_get_by_name('Eina.Error')
alias = eolian_db.alias_by_name_get('Eina.Error')
self.assertIsInstance(alias, eolian.Typedecl)
self.assertEqual(alias.type, eolian.Eolian_Typedecl_Type.ALIAS)
self.assertEqual(alias.name, 'Error')
@ -567,7 +567,7 @@ class TestEolianDeclaration(unittest.TestCase):
class TestEolianExpression(unittest.TestCase):
def test_expression_simple(self):
td = eolian_db.typedecl_enum_get_by_name('Efl.Net.Http.Version')
td = eolian_db.enum_by_name_get('Efl.Net.Http.Version')
field = td.enum_field_get('v1_0')
exp = field.value
self.assertIsInstance(exp, eolian.Expression)