aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-web/src
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <marussy@mit.bme.hu>2024-01-04 18:29:13 +0100
committerLibravatar GitHub <noreply@github.com>2024-01-04 18:29:13 +0100
commit667045429b1d7fdc49d7ecae75b7673d7a2c240e (patch)
tree76daca5944872f0b21d6cef472c5cb0b393dff8b /subprojects/language-web/src
parentMerge pull request #50 from kris7t/generator-roundtrip (diff)
parentfeat(web): toggle identifier coloring (diff)
downloadrefinery-667045429b1d7fdc49d7ecae75b7673d7a2c240e.tar.gz
refinery-667045429b1d7fdc49d7ecae75b7673d7a2c240e.tar.zst
refinery-667045429b1d7fdc49d7ecae75b7673d7a2c240e.zip
Merge pull request #51 from kris7t/color-identifiers
Color identifiers
Diffstat (limited to 'subprojects/language-web/src')
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java7
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java5
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java31
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadata.java4
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadataFactory.java89
5 files changed, 114 insertions, 22 deletions
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java
index a3b6ca82..7febce7d 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/generator/ModelGenerationWorker.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
@@ -17,6 +17,7 @@ import tools.refinery.generator.ValidationErrorsException;
17import tools.refinery.language.web.semantics.PartialInterpretation2Json; 17import tools.refinery.language.web.semantics.PartialInterpretation2Json;
18import tools.refinery.language.web.xtext.server.ThreadPoolExecutorServiceProvider; 18import tools.refinery.language.web.xtext.server.ThreadPoolExecutorServiceProvider;
19import tools.refinery.language.web.xtext.server.push.PushWebDocument; 19import tools.refinery.language.web.xtext.server.push.PushWebDocument;
20import tools.refinery.store.reasoning.literal.Concreteness;
20import tools.refinery.store.util.CancellationToken; 21import tools.refinery.store.util.CancellationToken;
21 22
22import java.io.IOException; 23import java.io.IOException;
@@ -142,7 +143,7 @@ public class ModelGenerationWorker implements Runnable {
142 } catch (ValidationErrorsException e) { 143 } catch (ValidationErrorsException e) {
143 var errors = e.getErrors(); 144 var errors = e.getErrors();
144 if (errors != null && !errors.isEmpty()) { 145 if (errors != null && !errors.isEmpty()) {
145 return new ModelGenerationErrorResult(uuid, "Validation error: " + errors.get(0).getMessage()); 146 return new ModelGenerationErrorResult(uuid, "Validation error: " + errors.getFirst().getMessage());
146 } 147 }
147 throw e; 148 throw e;
148 } 149 }
@@ -154,7 +155,7 @@ public class ModelGenerationWorker implements Runnable {
154 notifyResult(new ModelGenerationStatusResult(uuid, "Saving generated model")); 155 notifyResult(new ModelGenerationStatusResult(uuid, "Saving generated model"));
155 cancellationToken.checkCancelled(); 156 cancellationToken.checkCancelled();
156 metadataCreator.setProblemTrace(generator.getProblemTrace()); 157 metadataCreator.setProblemTrace(generator.getProblemTrace());
157 var nodesMetadata = metadataCreator.getNodesMetadata(generator.getModel(), false); 158 var nodesMetadata = metadataCreator.getNodesMetadata(generator.getModel(), Concreteness.CANDIDATE);
158 cancellationToken.checkCancelled(); 159 cancellationToken.checkCancelled();
159 var relationsMetadata = metadataCreator.getRelationsMetadata(); 160 var relationsMetadata = metadataCreator.getRelationsMetadata();
160 cancellationToken.checkCancelled(); 161 cancellationToken.checkCancelled();
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 44974869..fed3c8a3 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
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
@@ -20,6 +20,7 @@ import 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.web.semantics.metadata.MetadataCreator;
22import tools.refinery.language.semantics.TracedException; 22import tools.refinery.language.semantics.TracedException;
23import tools.refinery.store.reasoning.literal.Concreteness;
23import tools.refinery.store.reasoning.translator.TranslationException; 24import tools.refinery.store.reasoning.translator.TranslationException;
24import tools.refinery.store.util.CancellationToken; 25import tools.refinery.store.util.CancellationToken;
25 26
@@ -73,7 +74,7 @@ class SemanticsWorker implements Callable<SemanticsResult> {
73 } 74 }
74 cancellationToken.checkCancelled(); 75 cancellationToken.checkCancelled();
75 metadataCreator.setProblemTrace(semantics.getProblemTrace()); 76 metadataCreator.setProblemTrace(semantics.getProblemTrace());
76 var nodesMetadata = metadataCreator.getNodesMetadata(semantics.getModel(), true); 77 var nodesMetadata = metadataCreator.getNodesMetadata(semantics.getModel(), Concreteness.PARTIAL);
77 cancellationToken.checkCancelled(); 78 cancellationToken.checkCancelled();
78 var relationsMetadata = metadataCreator.getRelationsMetadata(); 79 var relationsMetadata = metadataCreator.getRelationsMetadata();
79 cancellationToken.checkCancelled(); 80 cancellationToken.checkCancelled();
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
index 3fbc5d2d..f05abc45 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
@@ -1,11 +1,12 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.language.web.semantics.metadata; 6package tools.refinery.language.web.semantics.metadata;
7 7
8import com.google.inject.Inject; 8import com.google.inject.Inject;
9import com.google.inject.Provider;
9import org.eclipse.emf.ecore.EObject; 10import org.eclipse.emf.ecore.EObject;
10import org.eclipse.xtext.naming.IQualifiedNameConverter; 11import org.eclipse.xtext.naming.IQualifiedNameConverter;
11import org.eclipse.xtext.naming.IQualifiedNameProvider; 12import org.eclipse.xtext.naming.IQualifiedNameProvider;
@@ -18,6 +19,7 @@ import tools.refinery.language.semantics.TracedException;
18import tools.refinery.language.utils.ProblemUtil; 19import tools.refinery.language.utils.ProblemUtil;
19import tools.refinery.store.model.Model; 20import tools.refinery.store.model.Model;
20import tools.refinery.store.reasoning.ReasoningAdapter; 21import tools.refinery.store.reasoning.ReasoningAdapter;
22import tools.refinery.store.reasoning.literal.Concreteness;
21import tools.refinery.store.reasoning.representation.PartialRelation; 23import tools.refinery.store.reasoning.representation.PartialRelation;
22 24
23import java.util.ArrayList; 25import java.util.ArrayList;
@@ -35,10 +37,11 @@ public class MetadataCreator {
35 @Inject 37 @Inject
36 private IQualifiedNameConverter qualifiedNameConverter; 38 private IQualifiedNameConverter qualifiedNameConverter;
37 39
38 private ProblemTrace problemTrace; 40 @Inject
41 private Provider<NodeMetadataFactory> nodeMetadataFactoryProvider;
39 42
43 private ProblemTrace problemTrace;
40 private IScope nodeScope; 44 private IScope nodeScope;
41
42 private IScope relationScope; 45 private IScope relationScope;
43 46
44 public void setProblemTrace(ProblemTrace problemTrace) { 47 public void setProblemTrace(ProblemTrace problemTrace) {
@@ -51,37 +54,35 @@ public class MetadataCreator {
51 relationScope = scopeProvider.getScope(problem, ProblemPackage.Literals.ASSERTION__RELATION); 54 relationScope = scopeProvider.getScope(problem, ProblemPackage.Literals.ASSERTION__RELATION);
52 } 55 }
53 56
54 public static String unnamedNode(int nodeId) { 57 public List<NodeMetadata> getNodesMetadata(Model model, Concreteness concreteness) {
55 return "::" + nodeId;
56 }
57
58 public List<NodeMetadata> getNodesMetadata(Model model, boolean preserveNewNodes) {
59 int nodeCount = model.getAdapter(ReasoningAdapter.class).getNodeCount(); 58 int nodeCount = model.getAdapter(ReasoningAdapter.class).getNodeCount();
60 var nodeTrace = problemTrace.getNodeTrace(); 59 var nodeTrace = problemTrace.getNodeTrace();
61 var nodes = new NodeMetadata[Math.max(nodeTrace.size(), nodeCount)]; 60 var nodes = new NodeMetadata[Math.max(nodeTrace.size(), nodeCount)];
61 var nodeMetadataFactory = nodeMetadataFactoryProvider.get();
62 nodeMetadataFactory.initialize(problemTrace, concreteness, model);
63 boolean preserveNewNodes = concreteness == Concreteness.PARTIAL;
62 for (var entry : nodeTrace.keyValuesView()) { 64 for (var entry : nodeTrace.keyValuesView()) {
63 var node = entry.getOne(); 65 var node = entry.getOne();
64 var id = entry.getTwo(); 66 var id = entry.getTwo();
65 nodes[id] = getNodeMetadata(id, node, preserveNewNodes); 67 nodes[id] = getNodeMetadata(id, node, preserveNewNodes, nodeMetadataFactory);
66 } 68 }
67 for (int i = 0; i < nodes.length; i++) { 69 for (int i = 0; i < nodes.length; i++) {
68 if (nodes[i] == null) { 70 if (nodes[i] == null) {
69 var nodeName = unnamedNode(i); 71 nodes[i] = nodeMetadataFactory.createFreshlyNamedMetadata(i);
70 nodes[i] = new NodeMetadata(nodeName, nodeName, NodeKind.IMPLICIT);
71 } 72 }
72 } 73 }
73 return List.of(nodes); 74 return List.of(nodes);
74 } 75 }
75 76
76 private NodeMetadata getNodeMetadata(int nodeId, Node node, boolean preserveNewNodes) { 77 private NodeMetadata getNodeMetadata(int nodeId, Node node, boolean preserveNewNodes,
78 NodeMetadataFactory nodeMetadataFactory) {
77 var kind = getNodeKind(node); 79 var kind = getNodeKind(node);
78 if (!preserveNewNodes && kind == NodeKind.NEW) { 80 if (!preserveNewNodes && kind == NodeKind.NEW) {
79 var nodeName = unnamedNode(nodeId); 81 return nodeMetadataFactory.createFreshlyNamedMetadata(nodeId);
80 return new NodeMetadata(nodeName, nodeName, NodeKind.IMPLICIT);
81 } 82 }
82 var qualifiedName = getQualifiedName(node); 83 var qualifiedName = getQualifiedName(node);
83 var simpleName = getSimpleName(node, qualifiedName, nodeScope); 84 var simpleName = getSimpleName(node, qualifiedName, nodeScope);
84 return new NodeMetadata(qualifiedNameConverter.toString(qualifiedName), 85 return nodeMetadataFactory.doCreateMetadata(nodeId, qualifiedNameConverter.toString(qualifiedName),
85 qualifiedNameConverter.toString(simpleName), getNodeKind(node)); 86 qualifiedNameConverter.toString(simpleName), getNodeKind(node));
86 } 87 }
87 88
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadata.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadata.java
index 5da28acf..f3347eac 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadata.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadata.java
@@ -1,9 +1,9 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2023 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.language.web.semantics.metadata; 6package tools.refinery.language.web.semantics.metadata;
7 7
8public record NodeMetadata(String name, String simpleName, NodeKind kind) implements Metadata { 8public record NodeMetadata(String name, String simpleName, String typeHash, NodeKind kind) implements Metadata {
9} 9}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadataFactory.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadataFactory.java
new file mode 100644
index 00000000..ce0e50c1
--- /dev/null
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadataFactory.java
@@ -0,0 +1,89 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.web.semantics.metadata;
7
8import com.google.inject.Inject;
9import tools.refinery.language.ide.syntaxcoloring.TypeHashProvider;
10import tools.refinery.language.semantics.NodeNameProvider;
11import tools.refinery.language.semantics.ProblemTrace;
12import tools.refinery.store.model.Interpretation;
13import tools.refinery.store.model.Model;
14import tools.refinery.store.reasoning.ReasoningAdapter;
15import tools.refinery.store.reasoning.interpretation.PartialInterpretation;
16import tools.refinery.store.reasoning.literal.Concreteness;
17import tools.refinery.store.reasoning.representation.PartialRelation;
18import tools.refinery.store.reasoning.translator.typehierarchy.InferredType;
19import tools.refinery.store.reasoning.translator.typehierarchy.TypeHierarchyTranslator;
20import tools.refinery.store.representation.TruthValue;
21import tools.refinery.store.tuple.Tuple;
22
23public class NodeMetadataFactory {
24 @Inject
25 private NodeNameProvider nodeNameProvider;
26
27 @Inject
28 private TypeHashProvider typeHashProvider;
29
30 private ProblemTrace problemTrace;
31 private Concreteness concreteness;
32 private Interpretation<InferredType> typeInterpretation;
33 private PartialInterpretation<TruthValue, Boolean> existsInterpretation;
34
35 public void initialize(ProblemTrace problemTrace, Concreteness concreteness, Model model) {
36 this.problemTrace = problemTrace;
37 this.concreteness = concreteness;
38 typeInterpretation = model.getInterpretation(TypeHierarchyTranslator.TYPE_SYMBOL);
39 existsInterpretation = model.getAdapter(ReasoningAdapter.class).getPartialInterpretation(concreteness,
40 ReasoningAdapter.EXISTS_SYMBOL);
41 nodeNameProvider.setProblem(problemTrace.getProblem());
42 }
43
44 public NodeMetadata doCreateMetadata(int nodeId, String name, String simpleName, NodeKind kind) {
45 var type = getType(nodeId);
46 return doCreateMetadata(name, simpleName, type, kind);
47 }
48
49 public NodeMetadata createFreshlyNamedMetadata(int nodeId) {
50 var type = getType(nodeId);
51 var name = getName(type, nodeId);
52 return doCreateMetadata(name, name, type, NodeKind.IMPLICIT);
53 }
54
55 private PartialRelation getType(int nodeId) {
56 var inferredType = typeInterpretation.get(Tuple.of(nodeId));
57 if (inferredType == null) {
58 return null;
59 }
60 return inferredType.candidateType();
61 }
62
63 private String getName(PartialRelation type, int nodeId) {
64 if (concreteness == Concreteness.CANDIDATE && !existsInterpretation.get(Tuple.of(nodeId)).may()) {
65 // Do not increment the node name counter for non-existent nodes in the candidate interpretation.
66 // While non-existent nodes may appear in the partial interpretation, they are never displayed in the
67 // candidate interpretation.
68 return "::" + nodeId;
69 }
70 if (type == null) {
71 return nodeNameProvider.getNextName(null);
72 }
73 var relation = problemTrace.getRelation(type);
74 return nodeNameProvider.getNextName(relation.getName());
75 }
76
77 private NodeMetadata doCreateMetadata(String name, String simpleName, PartialRelation type, NodeKind kind) {
78 var typeHash = getTypeHash(type);
79 return new NodeMetadata(name, simpleName, typeHash, kind);
80 }
81
82 private String getTypeHash(PartialRelation type) {
83 if (type == null) {
84 return null;
85 }
86 var relation = problemTrace.getRelation(type);
87 return typeHashProvider.getTypeHash(relation);
88 }
89}