Skip to content

Commit

Permalink
164: listener is added on all packages at once
Browse files Browse the repository at this point in the history
  • Loading branch information
LorenzoBettini committed May 14, 2020
1 parent 912bf30 commit 8c7c28c
Showing 1 changed file with 42 additions and 26 deletions.
68 changes: 42 additions & 26 deletions edelta.parent/edelta/src/edelta/interpreter/EdeltaInterpreter.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@
import static org.eclipse.xtext.xbase.lib.IterableExtensions.filter;
import static org.eclipse.xtext.xbase.lib.IterableExtensions.forEach;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.eclipse.emf.ecore.ENamedElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
import org.eclipse.xtext.common.types.JvmField;
import org.eclipse.xtext.common.types.JvmFormalParameter;
Expand Down Expand Up @@ -128,47 +130,61 @@ public void setInterpreterTimeout(final int interpreterTimeout) {

public void evaluateModifyEcoreOperations(final EdeltaProgram program, final EdeltaCopiedEPackagesMap copiedEPackagesMap) {
this.currentProgram = program;
final Collection<EPackage> copiedEPackages = copiedEPackagesMap.values();
thisObject = new EdeltaInterpreterEdeltaImpl
(Lists.newArrayList(
Iterables.concat(copiedEPackagesMap.values(),
Iterables.concat(copiedEPackages,
program.getMetamodels())));
useAsFields = newHashMap();
List<EdeltaModifyEcoreOperation> filteredOperations =
edeltaInterpreterHelper.filterOperations(program.getModifyEcoreOperations());
for (final EdeltaModifyEcoreOperation op : filteredOperations) {
evaluateModifyEcoreOperation(op, copiedEPackagesMap);
final Resource eResource = program.eResource();
listener = new EdeltaInterpreterResourceListener(cache, eResource,
derivedStateHelper.getEnamedElementXExpressionMap(eResource));
try {
addResourceListener(copiedEPackages);
for (final EdeltaModifyEcoreOperation op : filteredOperations) {
evaluateModifyEcoreOperation(op, copiedEPackagesMap);
}
} finally {
removeResourceListener(copiedEPackages);
}
}

private void evaluateModifyEcoreOperation(final EdeltaModifyEcoreOperation op,
final EdeltaCopiedEPackagesMap copiedEPackagesMap) {
final EPackage ePackage = copiedEPackagesMap.
get(op.getEpackage().getName());
listener = new EdeltaInterpreterResourceListener(cache, op.eResource(),
derivedStateHelper.getEnamedElementXExpressionMap(op.eResource()));
private void removeResourceListener(final Collection<EPackage> copiedEPackages) {
// this will also trigger the last event caught by our adapter
// implying a final clearing, which is required to avoid
// duplicate errors
for (EPackage ePackage : copiedEPackages) {
ePackage.eAdapters().remove(listener);
}
}

private void addResourceListener(final Collection<EPackage> copiedEPackages) {
// The listener clears the cache as soon as the interpreter modifies
// the EPackage of the modifyEcore expression
// since new types might be available after the interpretation
// and existing types might have been modified or renamed
// this makes sure that scoping and the type computer
// is performed again
ePackage.eAdapters().add(listener);
try {
IEvaluationContext context = createContext();
context.newValue(IT_QUALIFIED_NAME, ePackage);
configureContextForJavaThis(context);
final IEvaluationResult result = evaluate(op.getBody(), context,
new EdeltaInterpreterCancelIndicator());
if (result == null) {
addTimeoutWarning(op);
} else {
handleResultException(result.getException());
}
} finally {
// this will also trigger the last event caught by our adapter
// implying a final clearing, which is required to avoid
// duplicate errors
ePackage.eAdapters().remove(listener);
for (EPackage ePackage : copiedEPackages) {
ePackage.eAdapters().add(listener);
}
}

private void evaluateModifyEcoreOperation(final EdeltaModifyEcoreOperation op,
final EdeltaCopiedEPackagesMap copiedEPackagesMap) {
final EPackage ePackage = copiedEPackagesMap.
get(op.getEpackage().getName());
IEvaluationContext context = createContext();
context.newValue(IT_QUALIFIED_NAME, ePackage);
configureContextForJavaThis(context);
final IEvaluationResult result = evaluate(op.getBody(), context,
new EdeltaInterpreterCancelIndicator());
if (result == null) {
addTimeoutWarning(op);
} else {
handleResultException(result.getException());
}
}

Expand Down

0 comments on commit 8c7c28c

Please sign in to comment.