def __call__(self, obj, attr, obj_ref): from textx.scoping.tools import get_referenced_object, \ get_list_of_concatenated_objects from textx.scoping import Postponed from textx import get_model try: # print("DEBUG: ExtRelativeName.__call__(...{})". # format(obj_ref.obj_name)) one_def_obj = get_referenced_object(None, obj, self.path_to_definition_object) def_obj_list = get_list_of_concatenated_objects( one_def_obj, self.path_to_extension, []) # print("DEBUG: {}".format(def_obj_list)) for def_obj in def_obj_list: if type(def_obj) is Postponed: self.postponed_counter += 1 return def_obj res = get_referenced_object( None, def_obj, self.path_to_target + "." + obj_ref.obj_name, obj_ref.cls) if res: return res # may be Postponed return None except TypeError as e: from textx.scoping.tools import get_parser line, col = get_parser(obj).pos_to_linecol(obj_ref.position) raise TextXSemanticError('ExtRelativeName: {}'.format(str(e)), line=line, col=col, filename=get_model(obj)._tx_filename)
def __call__(self, parser, obj, attr, obj_ref): from textx.scoping.tools import get_referenced_object, \ get_list_of_concatenated_objects from textx.scoping import Postponed try: one_def_obj = get_referenced_object(None, obj, self.path_to_definition_object, parser) def_obj_list = get_list_of_concatenated_objects( one_def_obj, self.path_to_extension, parser, []) for def_obj in def_obj_list: if type(def_obj) is Postponed: self.postponed_counter += 1 return def_obj res = get_referenced_object( None, def_obj, self.path_to_target + "." + obj_ref.obj_name, parser, obj_ref.cls) if res: return res # may be Postponed return None except TypeError as e: line, col = parser.pos_to_linecol(obj_ref.position) raise TextXSemanticError('ExtRelativeName: {}'.format(str(e)), line=line, col=col)
def ref_scope(refItem, attr, attr_ref): from textx.scoping.tools import get_referenced_object from textx.scoping import Postponed reference = refItem.parent if reference is None: return Postponed() index = reference.refs.index(refItem) assert (index >= 0) if index == 0: return get_referenced_object( None, reference, "instance.type.vals.{}".format(attr_ref.obj_name), attr_ref.cls) else: return get_referenced_object( None, reference.refs[index - 1], "valref.type.vals.{}".format(attr_ref.obj_name), attr_ref.cls)
def test_get_referenced_object(): ################################# # META MODEL DEF ################################# my_meta_model = metamodel_from_file( abspath(dirname(__file__)) + '/components_model1/Components.tx') my_meta_model.register_scope_providers({ "*.*": scoping_providers.FQN(), "Connection.from_port": scoping_providers.ExtRelativeName("from_inst.component", "slots", "extends"), "Connection.to_port": scoping_providers.ExtRelativeName("to_inst.component", "slots", "extends"), }) ################################# # MODEL PARSING ################################# my_model = my_meta_model.model_from_file( abspath(dirname(__file__)) + "/components_model1/example_inherit2.components") ################################# # TEST MODEL ################################# action2a = get_referenced_object( None, my_model, "packages.usage.instances.action2") action2b = get_unique_named_object(my_model, "action2") assert action2a is action2b middle_a = get_referenced_object( None, my_model, "packages.base.components.Middle") middle_b = get_unique_named_object(my_model, "Middle") assert middle_a is middle_b
def __call__(self, parser, obj, attr, obj_ref): from textx.scoping.tools import get_referenced_object from textx.scoping import Postponed try: res = get_referenced_object( None, obj, self.path_to_container_object + "." + obj_ref.obj_name, parser, obj_ref.cls) if type(res) is Postponed: self.postponed_counter += 1 return res except TypeError as e: line, col = parser.pos_to_linecol(obj_ref.position) raise TextXSemanticError('{}'.format(str(e)), line=line, col=col)