diff options
author | Kristóf Marussy <kristof@marussy.com> | 2024-06-28 19:43:52 +0200 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2024-06-28 21:44:58 +0200 |
commit | 6095f6eca9ae96f94d1afdcba9971ac2ec4d8c5b (patch) | |
tree | 1ed444c895dd6b383299397b5a97acc11aea5a33 /subprojects/language-web | |
parent | refactor: show semantics even if propagation fails (diff) | |
download | refinery-6095f6eca9ae96f94d1afdcba9971ac2ec4d8c5b.tar.gz refinery-6095f6eca9ae96f94d1afdcba9971ac2ec4d8c5b.tar.zst refinery-6095f6eca9ae96f94d1afdcba9971ac2ec4d8c5b.zip |
refactor: improve propagation traceability
Diffstat (limited to 'subprojects/language-web')
3 files changed, 56 insertions, 14 deletions
diff --git a/subprojects/language-web/build.gradle.kts b/subprojects/language-web/build.gradle.kts index 8bef0c12..73e80b1d 100644 --- a/subprojects/language-web/build.gradle.kts +++ b/subprojects/language-web/build.gradle.kts | |||
@@ -22,6 +22,7 @@ dependencies { | |||
22 | implementation(project(":refinery-generator")) | 22 | implementation(project(":refinery-generator")) |
23 | implementation(project(":refinery-language")) | 23 | implementation(project(":refinery-language")) |
24 | implementation(project(":refinery-language-ide")) | 24 | implementation(project(":refinery-language-ide")) |
25 | implementation(project(":refinery-store-reasoning-scope")) | ||
25 | implementation(libs.gson) | 26 | implementation(libs.gson) |
26 | implementation(libs.jetty.server) | 27 | implementation(libs.jetty.server) |
27 | implementation(libs.jetty.servlet) | 28 | implementation(libs.jetty.servlet) |
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsResult.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsResult.java index 16f25309..1b664ae8 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsResult.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsResult.java | |||
@@ -27,4 +27,8 @@ public record SemanticsResult(SemanticsModelResult model, String error, | |||
27 | public SemanticsResult(List<ValidationResult.Issue> issues) { | 27 | public SemanticsResult(List<ValidationResult.Issue> issues) { |
28 | this(null, null, issues); | 28 | this(null, null, issues); |
29 | } | 29 | } |
30 | |||
31 | public SemanticsResult(SemanticsModelResult model, List<ValidationResult.Issue> issues) { | ||
32 | this(model, null, issues); | ||
33 | } | ||
30 | } | 34 | } |
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java index 32791960..4ec11bb9 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java | |||
@@ -18,14 +18,18 @@ import org.eclipse.xtext.web.server.validation.ValidationResult; | |||
18 | import tools.refinery.generator.ModelSemantics; | 18 | import tools.refinery.generator.ModelSemantics; |
19 | import tools.refinery.generator.ModelSemanticsFactory; | 19 | import tools.refinery.generator.ModelSemanticsFactory; |
20 | import tools.refinery.language.model.problem.Problem; | 20 | import tools.refinery.language.model.problem.Problem; |
21 | import tools.refinery.language.web.semantics.metadata.MetadataCreator; | 21 | import tools.refinery.language.model.problem.ScopeDeclaration; |
22 | import tools.refinery.language.semantics.TracedException; | 22 | import tools.refinery.language.semantics.TracedException; |
23 | import tools.refinery.language.web.semantics.metadata.MetadataCreator; | ||
24 | import tools.refinery.store.dse.propagation.PropagationRejectedResult; | ||
25 | import tools.refinery.store.dse.propagation.PropagationResult; | ||
23 | import tools.refinery.store.reasoning.literal.Concreteness; | 26 | import tools.refinery.store.reasoning.literal.Concreteness; |
24 | import tools.refinery.store.reasoning.seed.PropagatedModel; | 27 | import tools.refinery.store.reasoning.scope.ScopePropagator; |
25 | import tools.refinery.store.reasoning.translator.TranslationException; | 28 | import tools.refinery.store.reasoning.translator.TranslationException; |
26 | import tools.refinery.store.util.CancellationToken; | 29 | import tools.refinery.store.util.CancellationToken; |
27 | 30 | ||
28 | import java.util.ArrayList; | 31 | import java.util.ArrayList; |
32 | import java.util.List; | ||
29 | import java.util.concurrent.Callable; | 33 | import java.util.concurrent.Callable; |
30 | 34 | ||
31 | class SemanticsWorker implements Callable<SemanticsResult> { | 35 | class SemanticsWorker implements Callable<SemanticsResult> { |
@@ -74,29 +78,62 @@ class SemanticsWorker implements Callable<SemanticsResult> { | |||
74 | return getTracedErrorResult(e.getSourceElement(), message); | 78 | return getTracedErrorResult(e.getSourceElement(), message); |
75 | } | 79 | } |
76 | cancellationToken.checkCancelled(); | 80 | cancellationToken.checkCancelled(); |
77 | metadataCreator.setProblemTrace(semantics.getProblemTrace()); | 81 | var modelResult = createSemanticsModelResult(semantics); |
78 | var nodesMetadata = metadataCreator.getNodesMetadata(semantics.getModel(), Concreteness.PARTIAL); | 82 | return createSemanticsResult(modelResult, semantics.getPropagationResult()); |
79 | cancellationToken.checkCancelled(); | ||
80 | var relationsMetadata = metadataCreator.getRelationsMetadata(); | ||
81 | cancellationToken.checkCancelled(); | ||
82 | var partialInterpretation = partialInterpretation2Json.getPartialInterpretation(semantics, cancellationToken); | ||
83 | var modelResult = new SemanticsModelResult(nodesMetadata, relationsMetadata, partialInterpretation); | ||
84 | var error = semantics.isRejected() ? PropagatedModel.PROPAGATION_FAILED_MESSAGE : null; | ||
85 | return new SemanticsResult(modelResult, error); | ||
86 | } | 83 | } |
87 | 84 | ||
85 | |||
88 | private SemanticsResult getTracedErrorResult(EObject sourceElement, String message) { | 86 | private SemanticsResult getTracedErrorResult(EObject sourceElement, String message) { |
89 | if (sourceElement == null || !problem.eResource().equals(sourceElement.eResource())) { | 87 | if (sourceElement == null || !problem.eResource().equals(sourceElement.eResource())) { |
90 | return new SemanticsResult(message); | 88 | return new SemanticsResult(message); |
91 | } | 89 | } |
92 | var diagnostic = new FeatureBasedDiagnostic(Diagnostic.ERROR, message, sourceElement, null, 0, | 90 | var diagnostic = new FeatureBasedDiagnostic(Diagnostic.ERROR, message, sourceElement, null, 0, |
93 | CheckType.EXPENSIVE, DIAGNOSTIC_ID); | 91 | CheckType.EXPENSIVE, DIAGNOSTIC_ID); |
92 | var issues = convertIssues(List.of(diagnostic)); | ||
93 | return new SemanticsResult(issues); | ||
94 | } | ||
95 | |||
96 | private List<ValidationResult.Issue> convertIssues(List<FeatureBasedDiagnostic> diagnostics) { | ||
94 | var xtextIssues = new ArrayList<Issue>(); | 97 | var xtextIssues = new ArrayList<Issue>(); |
95 | diagnosticConverter.convertValidatorDiagnostic(diagnostic, xtextIssues::add); | 98 | for (var diagnostic : diagnostics) { |
96 | var issues = xtextIssues.stream() | 99 | diagnosticConverter.convertValidatorDiagnostic(diagnostic, xtextIssues::add); |
100 | } | ||
101 | return xtextIssues.stream() | ||
97 | .map(issue -> new ValidationResult.Issue(issue.getMessage(), "error", issue.getLineNumber(), | 102 | .map(issue -> new ValidationResult.Issue(issue.getMessage(), "error", issue.getLineNumber(), |
98 | issue.getColumn(), issue.getOffset(), issue.getLength())) | 103 | issue.getColumn(), issue.getOffset(), issue.getLength())) |
99 | .toList(); | 104 | .toList(); |
100 | return new SemanticsResult(issues); | 105 | } |
106 | |||
107 | private SemanticsModelResult createSemanticsModelResult(ModelSemantics semantics) { | ||
108 | metadataCreator.setProblemTrace(semantics.getProblemTrace()); | ||
109 | var nodesMetadata = metadataCreator.getNodesMetadata(semantics.getModel(), Concreteness.PARTIAL); | ||
110 | cancellationToken.checkCancelled(); | ||
111 | var relationsMetadata = metadataCreator.getRelationsMetadata(); | ||
112 | cancellationToken.checkCancelled(); | ||
113 | var partialInterpretation = partialInterpretation2Json.getPartialInterpretation(semantics, cancellationToken); | ||
114 | return new SemanticsModelResult(nodesMetadata, relationsMetadata, partialInterpretation); | ||
115 | } | ||
116 | |||
117 | private SemanticsResult createSemanticsResult(SemanticsModelResult modelResult, | ||
118 | PropagationResult propagationResult) { | ||
119 | if (!(propagationResult instanceof PropagationRejectedResult rejectedResult)) { | ||
120 | return new SemanticsResult(modelResult); | ||
121 | } | ||
122 | var message = rejectedResult.formatMessage(); | ||
123 | if (!(rejectedResult.reason() instanceof ScopePropagator)) { | ||
124 | return new SemanticsResult(modelResult, message); | ||
125 | } | ||
126 | var diagnostics = new ArrayList<FeatureBasedDiagnostic>(); | ||
127 | for (var statement : problem.getStatements()) { | ||
128 | if (statement instanceof ScopeDeclaration scopeDeclaration) { | ||
129 | diagnostics.add(new FeatureBasedDiagnostic(Diagnostic.ERROR, message, scopeDeclaration, null, 0, | ||
130 | CheckType.EXPENSIVE, DIAGNOSTIC_ID)); | ||
131 | } | ||
132 | } | ||
133 | if (diagnostics.isEmpty()) { | ||
134 | return new SemanticsResult(modelResult, message); | ||
135 | } | ||
136 | var issues = convertIssues(diagnostics); | ||
137 | return new SemanticsResult(modelResult, issues); | ||
101 | } | 138 | } |
102 | } | 139 | } |