Skip to content

Commit

Permalink
Merge 4b86cde into 951d2fd
Browse files Browse the repository at this point in the history
  • Loading branch information
goto40 committed Jun 18, 2019
2 parents 951d2fd + 4b86cde commit cbd95d7
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,23 @@ def test_flow_dsl_types_validation(clear_all):
Test flow model including error raises error.
"""

# print("-----------------------------------1---")
# print(metamodel_for_language('flow-dsl')._tx_model_repository.all_models.filename_to_model.keys())
# print("----------------- #={}".format(
# len(metamodel_for_language('flow-dsl')._tx_model_repository.all_models.filename_to_model.keys())))
mmF = metamodel_for_language('flow-dsl')
with pytest.raises(TextXSyntaxError,
match=r'.*lowercase.*'):
mmF.model_from_file(os.path.join(current_dir,
'models',
'data_flow_including_error.eflow'))

# print("-----------------------------------2---")
# print(metamodel_for_language('flow-dsl')._tx_model_repository.all_models.filename_to_model.keys())
# print("----------------- #={}".format(
# len(metamodel_for_language('flow-dsl')._tx_model_repository.all_models.filename_to_model.keys())))
with pytest.raises(TextXSyntaxError,
match=r'.*lowercase.*'):
mmF.model_from_file(os.path.join(current_dir,
'models',
'data_flow_including_error.eflow'))
2 changes: 1 addition & 1 deletion textx/metamodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ def _pre_ref_resolution_callback(other_model):
from textx.scoping import GlobalModelRepository
filename = other_model._tx_filename
assert filename
# print("METAMODEL PRE-CALLBACK{}".format(filename))
# print("METAMODEL PRE-CALLBACK => {}".format(filename))
other_model._tx_model_repository = GlobalModelRepository(
self._tx_model_repository.all_models)
self._tx_model_repository.all_models\
Expand Down
20 changes: 19 additions & 1 deletion textx/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,7 @@ def call_obj_processors(metamodel, model_obj,
del m._tx_reference_resolver

# final check that everything went ok
first_error = None
for m in models:
assert 0 == len(get_children_of_type(Postponed.__class__, m))

Expand All @@ -670,7 +671,24 @@ def call_obj_processors(metamodel, model_obj,
if m._tx_metamodel.obj_processors:
if parser.debug:
parser.dprint("CALLING OBJECT PROCESSORS")
call_obj_processors(m._tx_metamodel, m)
try:
call_obj_processors(m._tx_metamodel, m)
except BaseException as e:
# print("OBJ PROCESSOR ERROR {}".format(str(e)))
if first_error is None:
first_error = e

if first_error is not None:
# remove all processed models from (global) repo (if present)
# (remove all of them, not only the model with errors,
# since, models with errors may be included in other models)
for m in models:
for m2 in models:
if hasattr(m2._tx_metamodel, "_tx_model_repository"):
m2._tx_metamodel._tx_model_repository.remove_model(m)
if hasattr(m2, "_tx_model_repository"):
m2._tx_model_repository.remove_model(m)
raise first_error

if metamodel.textx_tools_support \
and type(model) not in PRIMITIVE_PYTHON_TYPES:
Expand Down
23 changes: 22 additions & 1 deletion textx/scoping/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,15 @@ def __init__(self):
def has_model(self, filename):
return filename in self.filename_to_model

def remove_model(self, model):
filename = None
for f, m in self.filename_to_model.items():
if m == model:
filename = f
if filename:
# print("*** delete {}".format(filename))
del self.filename_to_model[filename]


class GlobalModelRepository(object):
"""
Expand Down Expand Up @@ -82,6 +91,10 @@ def __init__(self, all_models=None):
else:
self.all_models = ModelRepository()

def remove_model(self, model):
self.all_models.remove_model(model)
self.local_models.remove_model(model)

def load_models_using_filepattern(
self, filename_pattern, model, glob_args, is_main_model=False,
encoding='utf-8', add_to_local_models=True):
Expand Down Expand Up @@ -170,6 +183,7 @@ def load_model(

if not self.local_models.has_model(filename):
if self.all_models.has_model(filename):
# print("CACHED {}".format(filename))
new_model = self.all_models.filename_to_model[filename]
else:
# print("LOADING {}".format(filename))
Expand All @@ -183,11 +197,16 @@ def load_model(
# print("ADDING {}".format(filename))
if add_to_local_models:
self.local_models.filename_to_model[filename] = new_model
else:
# print("LOCALLY CACHED {}".format(filename))
pass

assert self.all_models.has_model(filename) # to be sure...
return self.all_models.filename_to_model[filename]

def _add_model(self, model):
filename = self.update_model_in_repo_based_on_filename(model)
# print("ADDED {}".format(filename))
self.local_models.filename_to_model[filename] = model

def update_model_in_repo_based_on_filename(self, model):
Expand All @@ -204,6 +223,7 @@ def update_model_in_repo_based_on_filename(self, model):
if model._tx_filename is None:
for fn in self.all_models.filename_to_model:
if self.all_models.filename_to_model[fn] == model:
# print("UPDATED/CACHED {}".format(fn))
return fn
i = 0
while self.all_models.has_model("anonymous{}".format(i)):
Expand All @@ -214,6 +234,7 @@ def update_model_in_repo_based_on_filename(self, model):
myfilename = model._tx_filename
if (not self.all_models.has_model(myfilename)):
self.all_models.filename_to_model[myfilename] = model
# print("UPDATED/ADDED/CACHED {}".format(myfilename))
return myfilename

def pre_ref_resolution_callback(self, other_model):
Expand All @@ -226,8 +247,8 @@ def pre_ref_resolution_callback(self, other_model):
Returns:
nothing
"""
# print("PRE-CALLBACK{}".format(filename))
filename = other_model._tx_filename
# print("PRE-CALLBACK -> {}".format(filename))
assert (filename)
other_model._tx_model_repository = \
GlobalModelRepository(self.all_models)
Expand Down
2 changes: 1 addition & 1 deletion textx/scoping/providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ def _load_referenced_models(self, model, encoding):
add_to_local_models = True
if self.importURI_to_scope_name is not None:
obj.name = self.importURI_to_scope_name(obj)
print("setting name to {}".format(obj.name))
# print("setting name to {}".format(obj.name))
if hasattr(obj, "name"):
if obj.name is not None and obj.name != "":
add_to_local_models = not self.importAs
Expand Down
2 changes: 1 addition & 1 deletion textx/scoping/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ def get_unique_named_object_in_all_models(root, name):

a = []
for m in src:
print("analyzing {}".format(m._tx_filename))
# print("analyzing {}".format(m._tx_filename))
a = a + get_children(
lambda x: hasattr(x, 'name') and x.name == name, m)

Expand Down

0 comments on commit cbd95d7

Please sign in to comment.