aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-web
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-28 19:43:52 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-28 21:44:58 +0200
commit6095f6eca9ae96f94d1afdcba9971ac2ec4d8c5b (patch)
tree1ed444c895dd6b383299397b5a97acc11aea5a33 /subprojects/language-web
parentrefactor: show semantics even if propagation fails (diff)
downloadrefinery-6095f6eca9ae96f94d1afdcba9971ac2ec4d8c5b.tar.gz
refinery-6095f6eca9ae96f94d1afdcba9971ac2ec4d8c5b.tar.zst
refinery-6095f6eca9ae96f94d1afdcba9971ac2ec4d8c5b.zip
refactor: improve propagation traceability
Diffstat (limited to 'subprojects/language-web')
-rw-r--r--subprojects/language-web/build.gradle.kts1
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsResult.java4
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java65
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;
18import tools.refinery.generator.ModelSemantics; 18import tools.refinery.generator.ModelSemantics;
19import tools.refinery.generator.ModelSemanticsFactory; 19import tools.refinery.generator.ModelSemanticsFactory;
20import tools.refinery.language.model.problem.Problem; 20import tools.refinery.language.model.problem.Problem;
21import tools.refinery.language.web.semantics.metadata.MetadataCreator; 21import tools.refinery.language.model.problem.ScopeDeclaration;
22import tools.refinery.language.semantics.TracedException; 22import tools.refinery.language.semantics.TracedException;
23import tools.refinery.language.web.semantics.metadata.MetadataCreator;
24import tools.refinery.store.dse.propagation.PropagationRejectedResult;
25import tools.refinery.store.dse.propagation.PropagationResult;
23import tools.refinery.store.reasoning.literal.Concreteness; 26import tools.refinery.store.reasoning.literal.Concreteness;
24import tools.refinery.store.reasoning.seed.PropagatedModel; 27import tools.refinery.store.reasoning.scope.ScopePropagator;
25import tools.refinery.store.reasoning.translator.TranslationException; 28import tools.refinery.store.reasoning.translator.TranslationException;
26import tools.refinery.store.util.CancellationToken; 29import tools.refinery.store.util.CancellationToken;
27 30
28import java.util.ArrayList; 31import java.util.ArrayList;
32import java.util.List;
29import java.util.concurrent.Callable; 33import java.util.concurrent.Callable;
30 34
31class SemanticsWorker implements Callable<SemanticsResult> { 35class 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}