diff options
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.java | 27 |
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; | |||
20 | import org.eclipse.xtext.linking.impl.XtextLinkingDiagnostic; | 20 | import org.eclipse.xtext.linking.impl.XtextLinkingDiagnostic; |
21 | import org.eclipse.xtext.linking.lazy.LazyLinkingResource; | 21 | import org.eclipse.xtext.linking.lazy.LazyLinkingResource; |
22 | import org.eclipse.xtext.nodemodel.INode; | 22 | import org.eclipse.xtext.nodemodel.INode; |
23 | import org.eclipse.xtext.parser.IParseResult; | ||
23 | import org.eclipse.xtext.resource.DerivedStateAwareResource; | 24 | import org.eclipse.xtext.resource.DerivedStateAwareResource; |
24 | import org.eclipse.xtext.util.Triple; | 25 | import org.eclipse.xtext.util.Triple; |
25 | import org.jetbrains.annotations.Nullable; | 26 | import org.jetbrains.annotations.Nullable; |
27 | import tools.refinery.language.model.problem.Problem; | ||
28 | import tools.refinery.language.utils.ProblemUtil; | ||
26 | 29 | ||
27 | import java.util.Arrays; | 30 | import java.util.Arrays; |
28 | import java.util.List; | 31 | import 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> |