Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
 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)
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
 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)