aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java')
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java27
1 files changed, 27 insertions, 0 deletions
diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java
index 43239ffe..440a238e 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java
@@ -20,9 +20,12 @@ import org.eclipse.xtext.linking.impl.IllegalNodeException;
20import org.eclipse.xtext.linking.impl.XtextLinkingDiagnostic; 20import org.eclipse.xtext.linking.impl.XtextLinkingDiagnostic;
21import org.eclipse.xtext.linking.lazy.LazyLinkingResource; 21import org.eclipse.xtext.linking.lazy.LazyLinkingResource;
22import org.eclipse.xtext.nodemodel.INode; 22import org.eclipse.xtext.nodemodel.INode;
23import org.eclipse.xtext.parser.IParseResult;
23import org.eclipse.xtext.resource.DerivedStateAwareResource; 24import org.eclipse.xtext.resource.DerivedStateAwareResource;
24import org.eclipse.xtext.util.Triple; 25import org.eclipse.xtext.util.Triple;
25import org.jetbrains.annotations.Nullable; 26import org.jetbrains.annotations.Nullable;
27import tools.refinery.language.model.problem.Problem;
28import tools.refinery.language.utils.ProblemUtil;
26 29
27import java.util.Arrays; 30import java.util.Arrays;
28import java.util.List; 31import java.util.List;
@@ -40,6 +43,30 @@ public class ProblemResource extends DerivedStateAwareResource {
40 */ 43 */
41 private int cyclicLinkingDetectionCounter = 0; 44 private int cyclicLinkingDetectionCounter = 0;
42 45
46 @Override
47 protected void updateInternalState(IParseResult oldParseResult, IParseResult newParseResult) {
48 if (isNewRootElement(oldParseResult, newParseResult) &&
49 newParseResult.getRootASTElement() instanceof Problem newRootProblem &&
50 !newRootProblem.isExplicitKind()) {
51 // Post-process the parsed model to set its URI-dependent module kind.
52 // We can't set the default module kind in {@link tools.refinery.language.serializer
53 // .ProblemTransientValueService}, because the {@link Problem} does not get added into the EMF resource
54 // before parsing is fully completed.
55 var defaultModuleKind = ProblemUtil.getDefaultModuleKind(getURI());
56 newRootProblem.setKind(defaultModuleKind);
57 }
58 super.updateInternalState(oldParseResult, newParseResult);
59 }
60
61 private boolean isNewRootElement(IParseResult oldParseResult, IParseResult newParseResult) {
62 if (oldParseResult == null) {
63 return true;
64 }
65 var oldRootAstElement = oldParseResult.getRootASTElement();
66 var newRootAstElement = newParseResult.getRootASTElement();
67 return oldRootAstElement != newRootAstElement;
68 }
69
43 /** 70 /**
44 * Tries to resolve a reference and emits a diagnostic if the reference is unresolvable or ambiguous. 71 * Tries to resolve a reference and emits a diagnostic if the reference is unresolvable or ambiguous.
45 * <p> 72 * <p>