aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-10-19 03:36:26 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-10-19 03:36:26 +0200
commit663274763e56b228efe07363b8ede4ce7bebc251 (patch)
treeda6f8e0404cc03152cad84d8b9dfc8c63f7a6dbf
parentnodeIter moved from private field inside the method (diff)
downloadrefinery-663274763e56b228efe07363b8ede4ce7bebc251.tar.gz
refinery-663274763e56b228efe07363b8ede4ce7bebc251.tar.zst
refinery-663274763e56b228efe07363b8ede4ce7bebc251.zip
chore: remove builtin library xtext dependency
-rw-r--r--gradle.properties1
-rw-r--r--language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java2
-rw-r--r--language-model/build.gradle2
-rw-r--r--language-model/plugin.xml7
-rw-r--r--language-model/src/main/java/tools/refinery/language/model/ProblemEMFSetup.java34
-rw-r--r--language-model/src/main/java/tools/refinery/language/model/ProblemUtil.java (renamed from language/src/main/java/tools/refinery/language/ProblemUtil.java)32
-rw-r--r--language-model/src/main/resources/model/builtin.problem_xmi67
-rw-r--r--language-model/src/main/resources/model/problem.ecore3
-rw-r--r--language-model/src/main/resources/model/problem.genmodel4
-rw-r--r--language-model/src/testFixtures/java/tools/refinery/language/model/tests/ProblemTestUtil.java154
-rw-r--r--language-to-store/src/main/java/tools/refinery/language/mapping/PartialModelMapper.java2
-rw-r--r--language-to-store/src/test/java/tools/refinery/language/mapping/tests/PartialModelMapperTest.xtend1
-rw-r--r--language-to-store/src/test/java/tools/refinery/language/mapping/tests/ProblemTestUtil.xtend114
-rw-r--r--language/build.gradle1
-rw-r--r--language/src/main/java/tools/refinery/language/ProblemStandaloneSetup.java30
-rw-r--r--language/src/main/java/tools/refinery/language/ProblemXmiRuntimeModule.java35
-rw-r--r--language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java2
-rw-r--r--language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java2
-rw-r--r--language/src/main/java/tools/refinery/language/resource/ProblemXmiResourceFactory.java16
-rw-r--r--language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java13
-rw-r--r--language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java4
-rw-r--r--language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java2
-rw-r--r--language/src/main/resources/tools/refinery/builtin.problem21
-rw-r--r--language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.xtend5
-rw-r--r--language/src/test/java/tools/refinery/language/tests/ProblemTestUtil.xtend114
-rw-r--r--language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.xtend2
26 files changed, 376 insertions, 294 deletions
diff --git a/gradle.properties b/gradle.properties
index c4d174df..5c0df1d3 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,5 +1,6 @@
1ecoreVersion=2.25.0 1ecoreVersion=2.25.0
2ecoreCodegenVersion=2.27.0 2ecoreCodegenVersion=2.27.0
3ecoreXmiVersion=2.16.0
3hamcrestVersion=2.2 4hamcrestVersion=2.2
4jettyVersion=11.0.6 5jettyVersion=11.0.6
5jmhVersion=1.32 6jmhVersion=1.32
diff --git a/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
index b2e3c90b..76a67f96 100644
--- a/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
+++ b/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
@@ -15,7 +15,7 @@ import org.eclipse.xtext.util.CancelIndicator;
15import com.google.common.collect.ImmutableList; 15import com.google.common.collect.ImmutableList;
16import com.google.inject.Inject; 16import com.google.inject.Inject;
17 17
18import tools.refinery.language.ProblemUtil; 18import tools.refinery.language.model.ProblemUtil;
19import tools.refinery.language.model.problem.ClassDeclaration; 19import tools.refinery.language.model.problem.ClassDeclaration;
20import tools.refinery.language.model.problem.EnumDeclaration; 20import tools.refinery.language.model.problem.EnumDeclaration;
21import tools.refinery.language.model.problem.NamedElement; 21import tools.refinery.language.model.problem.NamedElement;
diff --git a/language-model/build.gradle b/language-model/build.gradle
index d01f8dfc..46ae839b 100644
--- a/language-model/build.gradle
+++ b/language-model/build.gradle
@@ -1,9 +1,11 @@
1apply plugin: 'java-library' 1apply plugin: 'java-library'
2apply plugin: 'java-test-fixtures'
2apply from: "${rootDir}/gradle/java-common.gradle" 3apply from: "${rootDir}/gradle/java-common.gradle"
3apply from: "${rootDir}/gradle/mwe2.gradle" 4apply from: "${rootDir}/gradle/mwe2.gradle"
4 5
5dependencies { 6dependencies {
6 api "org.eclipse.emf:org.eclipse.emf.ecore:${ecoreVersion}" 7 api "org.eclipse.emf:org.eclipse.emf.ecore:${ecoreVersion}"
8 api "org.eclipse.emf:org.eclipse.emf.ecore.xmi:${ecoreXmiVersion}"
7 mwe2 "org.eclipse.emf:org.eclipse.emf.codegen.ecore:${ecoreCodegenVersion}" 9 mwe2 "org.eclipse.emf:org.eclipse.emf.codegen.ecore:${ecoreCodegenVersion}"
8 mwe2 "org.eclipse.emf:org.eclipse.emf.mwe.utils:${mweVersion}" 10 mwe2 "org.eclipse.emf:org.eclipse.emf.mwe.utils:${mweVersion}"
9 mwe2 "org.eclipse.emf:org.eclipse.emf.mwe2.lib:${mwe2Version}" 11 mwe2 "org.eclipse.emf:org.eclipse.emf.mwe2.lib:${mwe2Version}"
diff --git a/language-model/plugin.xml b/language-model/plugin.xml
index 1e1a246e..4ca005a8 100644
--- a/language-model/plugin.xml
+++ b/language-model/plugin.xml
@@ -14,4 +14,11 @@
14 genModel="src/main/resources/model/problem.genmodel"/> 14 genModel="src/main/resources/model/problem.genmodel"/>
15 </extension> 15 </extension>
16 16
17 <extension point="org.eclipse.emf.ecore.extension_parser">
18 <!-- @generated problem -->
19 <parser
20 type="problem_xmi"
21 class="tools.refinery.language.model.problem.util.ProblemResourceFactoryImpl"/>
22 </extension>
23
17</plugin> 24</plugin>
diff --git a/language-model/src/main/java/tools/refinery/language/model/ProblemEMFSetup.java b/language-model/src/main/java/tools/refinery/language/model/ProblemEMFSetup.java
new file mode 100644
index 00000000..9383098b
--- /dev/null
+++ b/language-model/src/main/java/tools/refinery/language/model/ProblemEMFSetup.java
@@ -0,0 +1,34 @@
1package tools.refinery.language.model;
2
3import org.eclipse.emf.ecore.EPackage;
4import org.eclipse.emf.ecore.resource.Resource;
5
6import tools.refinery.language.model.problem.ProblemPackage;
7import tools.refinery.language.model.problem.impl.ProblemFactoryImpl;
8
9public class ProblemEMFSetup {
10 public static final String XMI_RESOURCE_EXTENSION = "problem_xmi";
11
12 private ProblemEMFSetup() {
13 throw new IllegalStateException("This is a static utility class and should not be instantiated directly");
14 }
15
16 // Here we can't rely on java.util.HashMap#putIfAbsent, because
17 // org.eclipse.emf.ecore.impl.EPackageRegistryImpl#containsKey is overridden
18 // without also overriding putIfAbsent. We must make sure to call the
19 // overridden containsKey implementation.
20 @SuppressWarnings("squid:S3824")
21 public static void doEMFRegistration() {
22 if (!EPackage.Registry.INSTANCE.containsKey(ProblemPackage.eNS_URI)) {
23 EPackage.Registry.INSTANCE.put(ProblemPackage.eNS_URI, ProblemPackage.eINSTANCE);
24 }
25
26 // This Resource.Factory is not actually used once
27 // tools.refinery.language.ProblemStandaloneSetup.createInjectorAndDoEMFRegistration()
28 // is called, because if will be replaced by
29 // tools.refinery.language.resource.ProblemXmiResourceFactory, which implements
30 // org.eclipse.xtext.resource.IResourceFactory as required by Xtext.
31 Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().putIfAbsent(XMI_RESOURCE_EXTENSION,
32 new ProblemFactoryImpl());
33 }
34}
diff --git a/language/src/main/java/tools/refinery/language/ProblemUtil.java b/language-model/src/main/java/tools/refinery/language/model/ProblemUtil.java
index ae2efc3d..b6b199f8 100644
--- a/language/src/main/java/tools/refinery/language/ProblemUtil.java
+++ b/language-model/src/main/java/tools/refinery/language/model/ProblemUtil.java
@@ -1,4 +1,4 @@
1package tools.refinery.language; 1package tools.refinery.language.model;
2 2
3import java.util.ArrayDeque; 3import java.util.ArrayDeque;
4import java.util.Collection; 4import java.util.Collection;
@@ -7,11 +7,10 @@ import java.util.HashSet;
7import java.util.Optional; 7import java.util.Optional;
8import java.util.Set; 8import java.util.Set;
9 9
10import org.eclipse.emf.common.util.URI;
10import org.eclipse.emf.ecore.EObject; 11import org.eclipse.emf.ecore.EObject;
11import org.eclipse.emf.ecore.resource.Resource; 12import org.eclipse.emf.ecore.resource.Resource;
12 13
13import com.google.common.collect.ImmutableList;
14
15import tools.refinery.language.model.problem.ClassDeclaration; 14import tools.refinery.language.model.problem.ClassDeclaration;
16import tools.refinery.language.model.problem.Node; 15import tools.refinery.language.model.problem.Node;
17import tools.refinery.language.model.problem.Problem; 16import tools.refinery.language.model.problem.Problem;
@@ -19,15 +18,18 @@ import tools.refinery.language.model.problem.ProblemPackage;
19import tools.refinery.language.model.problem.ReferenceDeclaration; 18import tools.refinery.language.model.problem.ReferenceDeclaration;
20import tools.refinery.language.model.problem.Relation; 19import tools.refinery.language.model.problem.Relation;
21import tools.refinery.language.model.problem.Variable; 20import tools.refinery.language.model.problem.Variable;
22import tools.refinery.language.scoping.ProblemGlobalScopeProvider;
23 21
24public final class ProblemUtil { 22public final class ProblemUtil {
23 public static final String BUILTIN_LIBRARY_NAME = "builtin";
24
25 public static final URI BUILTIN_LIBRARY_URI = getLibraryUri(BUILTIN_LIBRARY_NAME);
26
27 public static final String NODE_CLASS_NAME = "node";
28
25 private ProblemUtil() { 29 private ProblemUtil() {
26 throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); 30 throw new IllegalStateException("This is a static utility class and should not be instantiated directly");
27 } 31 }
28 32
29 public static final String NODE_CLASS_NAME = "node";
30
31 public static boolean isSingletonVariable(Variable variable) { 33 public static boolean isSingletonVariable(Variable variable) {
32 return variable.eContainingFeature() == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__SINGLETON_VARIABLE; 34 return variable.eContainingFeature() == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__SINGLETON_VARIABLE;
33 } 35 }
@@ -44,8 +46,8 @@ public final class ProblemUtil {
44 46
45 public static Optional<Problem> getBuiltInLibrary(EObject context) { 47 public static Optional<Problem> getBuiltInLibrary(EObject context) {
46 return Optional.ofNullable(context.eResource()).map(Resource::getResourceSet) 48 return Optional.ofNullable(context.eResource()).map(Resource::getResourceSet)
47 .map(resourceSet -> resourceSet.getResource(ProblemGlobalScopeProvider.BULTIN_LIBRARY_URI, true)) 49 .map(resourceSet -> resourceSet.getResource(BUILTIN_LIBRARY_URI, true)).map(Resource::getContents)
48 .map(Resource::getContents).filter(contents -> !contents.isEmpty()).map(contents -> contents.get(0)) 50 .filter(contents -> !contents.isEmpty()).map(contents -> contents.get(0))
49 .filter(Problem.class::isInstance).map(Problem.class::cast); 51 .filter(Problem.class::isInstance).map(Problem.class::cast);
50 } 52 }
51 53
@@ -53,7 +55,7 @@ public final class ProblemUtil {
53 if (eObject != null) { 55 if (eObject != null) {
54 var eResource = eObject.eResource(); 56 var eResource = eObject.eResource();
55 if (eResource != null) { 57 if (eResource != null) {
56 return ProblemGlobalScopeProvider.BULTIN_LIBRARY_URI.equals(eResource.getURI()); 58 return BUILTIN_LIBRARY_URI.equals(eResource.getURI());
57 } 59 }
58 } 60 }
59 return false; 61 return false;
@@ -85,10 +87,16 @@ public final class ProblemUtil {
85 } 87 }
86 88
87 public static Collection<ReferenceDeclaration> getAllReferenceDeclarations(ClassDeclaration classDeclaration) { 89 public static Collection<ReferenceDeclaration> getAllReferenceDeclarations(ClassDeclaration classDeclaration) {
88 ImmutableList.Builder<ReferenceDeclaration> builder = ImmutableList.builder(); 90 Set<ReferenceDeclaration> referenceDeclarations = new HashSet<>();
89 for (ClassDeclaration superclass : getSuperclassesAndSelf(classDeclaration)) { 91 for (ClassDeclaration superclass : getSuperclassesAndSelf(classDeclaration)) {
90 builder.addAll(superclass.getReferenceDeclarations()); 92 referenceDeclarations.addAll(superclass.getReferenceDeclarations());
91 } 93 }
92 return builder.build(); 94 return referenceDeclarations;
95 }
96
97 private static URI getLibraryUri(String libraryName) {
98 return URI.createURI(ProblemUtil.class.getClassLoader()
99 .getResource("model/" + libraryName + "." + ProblemEMFSetup.XMI_RESOURCE_EXTENSION)
100 .toString());
93 } 101 }
94} 102}
diff --git a/language-model/src/main/resources/model/builtin.problem_xmi b/language-model/src/main/resources/model/builtin.problem_xmi
new file mode 100644
index 00000000..9255ab66
--- /dev/null
+++ b/language-model/src/main/resources/model/builtin.problem_xmi
@@ -0,0 +1,67 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<problem:Problem
3 xmi:version="2.0"
4 xmlns:xmi="http://www.omg.org/XMI"
5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6 xmlns:problem="https://refinery.tools/emf/2021/Problem"
7 xsi:schemaLocation="https://refinery.tools/emf/2021/Problem problem.ecore"
8 name="builtin">
9 <statements
10 xsi:type="problem:ClassDeclaration"
11 name="node"
12 abstract="true">
13 <referenceDeclarations
14 name="equals"
15 referenceType="//@statements.0"
16 opposite="//@statements.0/@referenceDeclarations.0">
17 <multiplicity
18 xsi:type="problem:UnboundedMultiplicity"/>
19 </referenceDeclarations>
20 </statements>
21 <statements
22 xsi:type="problem:PredicateDefinition"
23 name="exists">
24 <parameters
25 name="node"
26 parameterType="//@statements.0"/>
27 </statements>
28 <statements
29 xsi:type="problem:ClassDeclaration"
30 name="domain"
31 abstract="true"
32 superTypes="//@statements.0"/>
33 <statements
34 xsi:type="problem:ClassDeclaration"
35 name="data"
36 abstract="true"
37 superTypes="//@statements.0"/>
38 <statements
39 xsi:type="problem:EnumDeclaration"
40 name="bool">
41 <literals
42 name="false"/>
43 <literals
44 name="true"/>
45 </statements>
46 <statements
47 xsi:type="problem:ClassDeclaration"
48 name="real"
49 superTypes="//@statements.3">
50 <newNode
51 name="new"/>
52 </statements>
53 <statements
54 xsi:type="problem:ClassDeclaration"
55 name="int"
56 superTypes="//@statements.3">
57 <newNode
58 name="new"/>
59 </statements>
60 <statements
61 xsi:type="problem:ClassDeclaration"
62 name="string"
63 superTypes="//@statements.3">
64 <newNode
65 name="new"/>
66 </statements>
67</problem:Problem>
diff --git a/language-model/src/main/resources/model/problem.ecore b/language-model/src/main/resources/model/problem.ecore
index a62590ac..e86f0afd 100644
--- a/language-model/src/main/resources/model/problem.ecore
+++ b/language-model/src/main/resources/model/problem.ecore
@@ -1,7 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?> 1<?xml version="1.0" encoding="UTF-8"?>
2<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="problem" nsURI="https://refinery.tools/emf/2021/Problem" 3 xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="problem" nsURI="https://refinery.tools/emf/2021/Problem" nsPrefix="problem">
4 nsPrefix="problem">
5 <eClassifiers xsi:type="ecore:EClass" name="Problem" eSuperTypes="#//NamedElement"> 4 <eClassifiers xsi:type="ecore:EClass" name="Problem" eSuperTypes="#//NamedElement">
6 <eStructuralFeatures xsi:type="ecore:EReference" name="nodes" upperBound="-1" 5 <eStructuralFeatures xsi:type="ecore:EReference" name="nodes" upperBound="-1"
7 eType="#//Node" containment="true"/> 6 eType="#//Node" containment="true"/>
diff --git a/language-model/src/main/resources/model/problem.genmodel b/language-model/src/main/resources/model/problem.genmodel
index e529977f..057b4917 100644
--- a/language-model/src/main/resources/model/problem.genmodel
+++ b/language-model/src/main/resources/model/problem.genmodel
@@ -8,8 +8,8 @@
8 copyrightFields="false" operationReflection="true" importOrganizing="true"> 8 copyrightFields="false" operationReflection="true" importOrganizing="true">
9 <foreignModel>problem.ecore</foreignModel> 9 <foreignModel>problem.ecore</foreignModel>
10 <testsDirectory xsi:nil="true"/> 10 <testsDirectory xsi:nil="true"/>
11 <genPackages prefix="Problem" basePackage="tools.refinery.language.model" 11 <genPackages prefix="Problem" basePackage="tools.refinery.language.model" resource="XMI"
12 disposableProviderFactory="true" ecorePackage="problem.ecore#/"> 12 disposableProviderFactory="true" fileExtensions="problem_xmi" ecorePackage="problem.ecore#/">
13 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//LogicValue"> 13 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//LogicValue">
14 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/TRUE"/> 14 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/TRUE"/>
15 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/FALSE"/> 15 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/FALSE"/>
diff --git a/language-model/src/testFixtures/java/tools/refinery/language/model/tests/ProblemTestUtil.java b/language-model/src/testFixtures/java/tools/refinery/language/model/tests/ProblemTestUtil.java
new file mode 100644
index 00000000..b412ed1f
--- /dev/null
+++ b/language-model/src/testFixtures/java/tools/refinery/language/model/tests/ProblemTestUtil.java
@@ -0,0 +1,154 @@
1package tools.refinery.language.model.tests;
2
3import java.util.List;
4import java.util.stream.Stream;
5
6import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
7import org.eclipse.emf.ecore.util.EcoreUtil;
8
9import tools.refinery.language.model.ProblemUtil;
10import tools.refinery.language.model.problem.Argument;
11import tools.refinery.language.model.problem.Assertion;
12import tools.refinery.language.model.problem.AssertionArgument;
13import tools.refinery.language.model.problem.Atom;
14import tools.refinery.language.model.problem.ClassDeclaration;
15import tools.refinery.language.model.problem.Conjunction;
16import tools.refinery.language.model.problem.EnumDeclaration;
17import tools.refinery.language.model.problem.Literal;
18import tools.refinery.language.model.problem.NamedElement;
19import tools.refinery.language.model.problem.NegativeLiteral;
20import tools.refinery.language.model.problem.Node;
21import tools.refinery.language.model.problem.NodeAssertionArgument;
22import tools.refinery.language.model.problem.NodeValueAssertion;
23import tools.refinery.language.model.problem.Parameter;
24import tools.refinery.language.model.problem.PredicateDefinition;
25import tools.refinery.language.model.problem.Problem;
26import tools.refinery.language.model.problem.ReferenceDeclaration;
27import tools.refinery.language.model.problem.Relation;
28import tools.refinery.language.model.problem.Statement;
29import tools.refinery.language.model.problem.UniqueDeclaration;
30import tools.refinery.language.model.problem.Variable;
31import tools.refinery.language.model.problem.VariableOrNode;
32import tools.refinery.language.model.problem.VariableOrNodeArgument;
33
34public class ProblemTestUtil {
35 public Problem builtin(Problem problem) {
36 return ProblemUtil.getBuiltInLibrary(problem).get();
37 }
38
39 public List<Diagnostic> errors(Problem problem) {
40 EcoreUtil.resolveAll(problem);
41 return problem.eResource().getErrors();
42 }
43
44 public List<String> nodeNames(Problem problem) {
45 return problem.getNodes().stream().map(node -> node.getName()).toList();
46 }
47
48 public PredicateDefinition pred(Problem problem, String name) {
49 return namedStatementOfType(problem, PredicateDefinition.class, name);
50 }
51
52 public Parameter param(PredicateDefinition definition, int i) {
53 return definition.getParameters().get(i);
54 }
55
56 public Conjunction conj(PredicateDefinition definition, int i) {
57 return definition.getBodies().get(i);
58 }
59
60 public Literal lit(Conjunction conjunction, int i) {
61 return conjunction.getLiterals().get(i);
62 }
63
64 public Atom negated(Literal literal) {
65 return ((NegativeLiteral) literal).getAtom();
66 }
67
68 public Relation relation(Literal literal) {
69 return ((Atom) literal).getRelation();
70 }
71
72 public Argument arg(Atom atom, int i) {
73 return atom.getArguments().get(i);
74 }
75
76 public Argument arg(Literal literal, int i) {
77 return arg((Atom) literal, i);
78 }
79
80 public VariableOrNode variableOrNode(Argument argument) {
81 return ((VariableOrNodeArgument) argument).getVariableOrNode();
82 }
83
84 public Variable variable(Argument argument) {
85 return (Variable) variableOrNode(argument);
86 }
87
88 public Node node(Argument argument) {
89 return (Node) variableOrNode(argument);
90 }
91
92 public Assertion assertion(Problem problem, int i) {
93 return nthStatementOfType(problem, Assertion.class, i);
94 }
95
96 public AssertionArgument arg(Assertion assertion, int i) {
97 return assertion.getArguments().get(i);
98 }
99
100 public Node node(AssertionArgument argument) {
101 return ((NodeAssertionArgument) argument).getNode();
102 }
103
104 public Node node(Problem problem, String name) {
105 return named(problem.getNodes(), name);
106 }
107
108 public Node uniqueNode(Problem problem, String name) {
109 var uniqueNodes = statementsOfType(problem, UniqueDeclaration.class)
110 .flatMap(declaration -> declaration.getNodes().stream());
111 return named(uniqueNodes, name);
112 }
113
114 public NodeValueAssertion nodeValueAssertion(Problem problem, int i) {
115 return nthStatementOfType(problem, NodeValueAssertion.class, i);
116 }
117
118 public ClassDeclaration findClass(Problem problem, String name) {
119 return namedStatementOfType(problem, ClassDeclaration.class, name);
120 }
121
122 public ReferenceDeclaration reference(ClassDeclaration declaration, String name) {
123 return named(declaration.getReferenceDeclarations(), name);
124 }
125
126 public EnumDeclaration findEnum(Problem problem, String name) {
127 return namedStatementOfType(problem, EnumDeclaration.class, name);
128 }
129
130 public Node literal(EnumDeclaration declaration, String name) {
131 return named(declaration.getLiterals(), name);
132 }
133
134 private <T extends NamedElement> T named(Stream<? extends T> stream, String name) {
135 return stream.filter(statement -> name.equals(statement.getName())).findAny().get();
136 }
137
138 private <T extends NamedElement> T named(List<? extends T> list, String name) {
139 return named(list.stream(), name);
140 }
141
142 private <T extends Statement> Stream<T> statementsOfType(Problem problem, Class<? extends T> type) {
143 return problem.getStatements().stream().filter(type::isInstance).map(type::cast);
144 }
145
146 private <T extends Statement & NamedElement> T namedStatementOfType(Problem problem, Class<? extends T> type,
147 String name) {
148 return named(statementsOfType(problem, type), name);
149 }
150
151 private <T extends Statement> T nthStatementOfType(Problem problem, Class<? extends T> type, int n) {
152 return statementsOfType(problem, type).skip(n).findFirst().get();
153 }
154}
diff --git a/language-to-store/src/main/java/tools/refinery/language/mapping/PartialModelMapper.java b/language-to-store/src/main/java/tools/refinery/language/mapping/PartialModelMapper.java
index 2ace27f4..d37c9ec7 100644
--- a/language-to-store/src/main/java/tools/refinery/language/mapping/PartialModelMapper.java
+++ b/language-to-store/src/main/java/tools/refinery/language/mapping/PartialModelMapper.java
@@ -7,7 +7,7 @@ import java.util.Optional;
7 7
8import org.eclipse.emf.common.util.EList; 8import org.eclipse.emf.common.util.EList;
9 9
10import tools.refinery.language.ProblemUtil; 10import tools.refinery.language.model.ProblemUtil;
11import tools.refinery.language.model.problem.Assertion; 11import tools.refinery.language.model.problem.Assertion;
12import tools.refinery.language.model.problem.AssertionArgument; 12import tools.refinery.language.model.problem.AssertionArgument;
13import tools.refinery.language.model.problem.ClassDeclaration; 13import tools.refinery.language.model.problem.ClassDeclaration;
diff --git a/language-to-store/src/test/java/tools/refinery/language/mapping/tests/PartialModelMapperTest.xtend b/language-to-store/src/test/java/tools/refinery/language/mapping/tests/PartialModelMapperTest.xtend
index 86dd47ae..dcdea332 100644
--- a/language-to-store/src/test/java/tools/refinery/language/mapping/tests/PartialModelMapperTest.xtend
+++ b/language-to-store/src/test/java/tools/refinery/language/mapping/tests/PartialModelMapperTest.xtend
@@ -10,6 +10,7 @@ import org.junit.jupiter.api.Test
10import org.junit.jupiter.api.^extension.ExtendWith 10import org.junit.jupiter.api.^extension.ExtendWith
11import tools.refinery.language.mapping.PartialModelMapper 11import tools.refinery.language.mapping.PartialModelMapper
12import tools.refinery.language.model.problem.Problem 12import tools.refinery.language.model.problem.Problem
13import tools.refinery.language.model.tests.ProblemTestUtil
13import tools.refinery.language.tests.ProblemInjectorProvider 14import tools.refinery.language.tests.ProblemInjectorProvider
14import tools.refinery.store.model.Tuple 15import tools.refinery.store.model.Tuple
15import tools.refinery.store.model.representation.TruthValue 16import tools.refinery.store.model.representation.TruthValue
diff --git a/language-to-store/src/test/java/tools/refinery/language/mapping/tests/ProblemTestUtil.xtend b/language-to-store/src/test/java/tools/refinery/language/mapping/tests/ProblemTestUtil.xtend
deleted file mode 100644
index b3b8145e..00000000
--- a/language-to-store/src/test/java/tools/refinery/language/mapping/tests/ProblemTestUtil.xtend
+++ /dev/null
@@ -1,114 +0,0 @@
1package tools.refinery.language.mapping.tests
2
3import tools.refinery.language.ProblemUtil
4import tools.refinery.language.model.problem.Argument
5import tools.refinery.language.model.problem.Assertion
6import tools.refinery.language.model.problem.AssertionArgument
7import tools.refinery.language.model.problem.Atom
8import tools.refinery.language.model.problem.ClassDeclaration
9import tools.refinery.language.model.problem.Conjunction
10import tools.refinery.language.model.problem.EnumDeclaration
11import tools.refinery.language.model.problem.Literal
12import tools.refinery.language.model.problem.NegativeLiteral
13import tools.refinery.language.model.problem.Node
14import tools.refinery.language.model.problem.NodeAssertionArgument
15import tools.refinery.language.model.problem.NodeValueAssertion
16import tools.refinery.language.model.problem.PredicateDefinition
17import tools.refinery.language.model.problem.Problem
18import tools.refinery.language.model.problem.UniqueDeclaration
19import tools.refinery.language.model.problem.Variable
20import tools.refinery.language.model.problem.VariableOrNodeArgument
21
22class ProblemTestUtil {
23 def builtin(Problem it) {
24 ProblemUtil.getBuiltInLibrary(it).get
25 }
26
27 def errors(Problem it) {
28 eResource.errors
29 }
30
31 def nodeNames(Problem it) {
32 nodes.map[name]
33 }
34
35 def pred(Problem it, String name) {
36 statements.filter(PredicateDefinition).findFirst[it.name == name]
37 }
38
39 def param(PredicateDefinition it, int i) {
40 parameters.get(i)
41 }
42
43 def conj(PredicateDefinition it, int i) {
44 bodies.get(i)
45 }
46
47 def lit(Conjunction it, int i) {
48 literals.get(i)
49 }
50
51 def negated(Literal it) {
52 (it as NegativeLiteral).atom
53 }
54
55 def relation(Literal it) {
56 (it as Atom).relation
57 }
58
59 def arg(Atom it, int i) {
60 it.arguments.get(i)
61 }
62
63 def arg(Literal it, int i) {
64 (it as Atom).arg(i)
65 }
66
67 def variable(Argument it) {
68 (it as VariableOrNodeArgument).variableOrNode as Variable
69 }
70
71 def node(Argument it) {
72 (it as VariableOrNodeArgument).variableOrNode as Node
73 }
74
75 def assertion(Problem it, int i) {
76 statements.filter(Assertion).get(i)
77 }
78
79 def nodeValueAssertion(Problem it, int i) {
80 statements.filter(NodeValueAssertion).get(i)
81 }
82
83 def arg(Assertion it, int i) {
84 arguments.get(i)
85 }
86
87 def node(AssertionArgument it) {
88 (it as NodeAssertionArgument).node
89 }
90
91 def node(Problem it, String name) {
92 nodes.findFirst[it.name == name]
93 }
94
95 def uniqueNode(Problem it, String name) {
96 statements.filter(UniqueDeclaration).flatMap[nodes].findFirst[it.name == name]
97 }
98
99 def findClass(Problem it, String name) {
100 statements.filter(ClassDeclaration).findFirst[it.name == name]
101 }
102
103 def reference(ClassDeclaration it, String name) {
104 it.referenceDeclarations.findFirst[it.name == name]
105 }
106
107 def findEnum(Problem it, String name) {
108 statements.filter(EnumDeclaration).findFirst[it.name == name]
109 }
110
111 def literal(EnumDeclaration it, String name) {
112 literals.findFirst[it.name == name]
113 }
114}
diff --git a/language/build.gradle b/language/build.gradle
index 85b0902f..f2b20ab5 100644
--- a/language/build.gradle
+++ b/language/build.gradle
@@ -12,6 +12,7 @@ dependencies {
12 api "org.eclipse.emf:org.eclipse.emf.ecore:${ecoreVersion}" 12 api "org.eclipse.emf:org.eclipse.emf.ecore:${ecoreVersion}"
13 api project(':refinery-language-model') 13 api project(':refinery-language-model')
14 testFixturesApi "org.eclipse.xtext:org.eclipse.xtext.testing:${xtextVersion}" 14 testFixturesApi "org.eclipse.xtext:org.eclipse.xtext.testing:${xtextVersion}"
15 testFixturesApi testFixtures(project(':refinery-language-model'))
15 mwe2 "org.eclipse.xtext:org.eclipse.xtext.common.types:${xtextVersion}" 16 mwe2 "org.eclipse.xtext:org.eclipse.xtext.common.types:${xtextVersion}"
16 mwe2 "org.eclipse.xtext:org.eclipse.xtext.xtext.generator:${xtextVersion}" 17 mwe2 "org.eclipse.xtext:org.eclipse.xtext.xtext.generator:${xtextVersion}"
17 mwe2 "org.eclipse.xtext:xtext-antlr-generator:${xtextAntlrGeneratorVersion}" 18 mwe2 "org.eclipse.xtext:xtext-antlr-generator:${xtextAntlrGeneratorVersion}"
diff --git a/language/src/main/java/tools/refinery/language/ProblemStandaloneSetup.java b/language/src/main/java/tools/refinery/language/ProblemStandaloneSetup.java
index f49069a5..d753a119 100644
--- a/language/src/main/java/tools/refinery/language/ProblemStandaloneSetup.java
+++ b/language/src/main/java/tools/refinery/language/ProblemStandaloneSetup.java
@@ -3,11 +3,14 @@
3 */ 3 */
4package tools.refinery.language; 4package tools.refinery.language;
5 5
6import org.eclipse.emf.ecore.EPackage; 6import org.eclipse.emf.ecore.resource.Resource;
7import org.eclipse.xtext.resource.IResourceFactory;
8import org.eclipse.xtext.resource.IResourceServiceProvider;
7 9
10import com.google.inject.Guice;
8import com.google.inject.Injector; 11import com.google.inject.Injector;
9 12
10import tools.refinery.language.model.problem.ProblemPackage; 13import tools.refinery.language.model.ProblemEMFSetup;
11 14
12/** 15/**
13 * Initialization support for running Xtext languages without Equinox extension 16 * Initialization support for running Xtext languages without Equinox extension
@@ -20,15 +23,22 @@ public class ProblemStandaloneSetup extends ProblemStandaloneSetupGenerated {
20 } 23 }
21 24
22 @Override 25 @Override
23 // Here we can't rely on java.util.HashMap#computeIfAbsent, because
24 // org.eclipse.emf.ecore.impl.EPackageRegistryImpl#containsKey is overridden
25 // without also overriding computeIfAbsent. We must make sure to call the
26 // overridden containsKey implementation.
27 @SuppressWarnings("squid:S3824")
28 public Injector createInjectorAndDoEMFRegistration() { 26 public Injector createInjectorAndDoEMFRegistration() {
29 if (!EPackage.Registry.INSTANCE.containsKey(ProblemPackage.eNS_URI)) { 27 ProblemEMFSetup.doEMFRegistration();
30 EPackage.Registry.INSTANCE.put(ProblemPackage.eNS_URI, ProblemPackage.eINSTANCE); 28 var xmiInjector = createXmiInjector();
31 } 29 registerXmiInjector(xmiInjector);
32 return super.createInjectorAndDoEMFRegistration(); 30 return super.createInjectorAndDoEMFRegistration();
33 } 31 }
32
33 protected Injector createXmiInjector() {
34 return Guice.createInjector(new ProblemXmiRuntimeModule());
35 }
36
37 protected void registerXmiInjector(Injector injector) {
38 IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class);
39 IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider.class);
40
41 Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(ProblemEMFSetup.XMI_RESOURCE_EXTENSION, resourceFactory);
42 IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put(ProblemEMFSetup.XMI_RESOURCE_EXTENSION, serviceProvider);
43 }
34} 44}
diff --git a/language/src/main/java/tools/refinery/language/ProblemXmiRuntimeModule.java b/language/src/main/java/tools/refinery/language/ProblemXmiRuntimeModule.java
new file mode 100644
index 00000000..03a33bee
--- /dev/null
+++ b/language/src/main/java/tools/refinery/language/ProblemXmiRuntimeModule.java
@@ -0,0 +1,35 @@
1package tools.refinery.language;
2
3import org.eclipse.xtext.naming.IQualifiedNameConverter;
4import org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy;
5import org.eclipse.xtext.resource.IResourceFactory;
6import org.eclipse.xtext.resource.generic.AbstractGenericResourceRuntimeModule;
7
8import tools.refinery.language.model.ProblemEMFSetup;
9import tools.refinery.language.naming.ProblemQualifiedNameConverter;
10import tools.refinery.language.resource.ProblemResourceDescriptionStrategy;
11import tools.refinery.language.resource.ProblemXmiResourceFactory;
12
13public class ProblemXmiRuntimeModule extends AbstractGenericResourceRuntimeModule {
14 @Override
15 protected String getLanguageName() {
16 return "tools.refinery.language.ProblemXmi";
17 }
18
19 @Override
20 protected String getFileExtensions() {
21 return ProblemEMFSetup.XMI_RESOURCE_EXTENSION;
22 }
23
24 public Class<? extends IResourceFactory> bindIResourceFactory() {
25 return ProblemXmiResourceFactory.class;
26 }
27
28 public Class<? extends IQualifiedNameConverter> bindIQualifiedNameConverter() {
29 return ProblemQualifiedNameConverter.class;
30 }
31
32 public Class<? extends IDefaultResourceDescriptionStrategy> bindIDefaultResourceDescriptionStrategy() {
33 return ProblemResourceDescriptionStrategy.class;
34 }
35}
diff --git a/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java b/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java
index f6a3ec75..b51de05d 100644
--- a/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java
+++ b/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java
@@ -4,7 +4,7 @@ import org.eclipse.emf.ecore.EObject;
4import org.eclipse.xtext.resource.DefaultLocationInFileProvider; 4import org.eclipse.xtext.resource.DefaultLocationInFileProvider;
5import org.eclipse.xtext.util.ITextRegion; 5import org.eclipse.xtext.util.ITextRegion;
6 6
7import tools.refinery.language.ProblemUtil; 7import tools.refinery.language.model.ProblemUtil;
8import tools.refinery.language.model.problem.ImplicitVariable; 8import tools.refinery.language.model.problem.ImplicitVariable;
9import tools.refinery.language.model.problem.Node; 9import tools.refinery.language.model.problem.Node;
10 10
diff --git a/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java b/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java
index c5dea671..e745b6a5 100644
--- a/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java
+++ b/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java
@@ -12,7 +12,7 @@ import org.eclipse.xtext.util.IAcceptor;
12import com.google.inject.Inject; 12import com.google.inject.Inject;
13import com.google.inject.Singleton; 13import com.google.inject.Singleton;
14 14
15import tools.refinery.language.ProblemUtil; 15import tools.refinery.language.model.ProblemUtil;
16import tools.refinery.language.model.problem.NamedElement; 16import tools.refinery.language.model.problem.NamedElement;
17import tools.refinery.language.model.problem.Node; 17import tools.refinery.language.model.problem.Node;
18import tools.refinery.language.model.problem.Problem; 18import tools.refinery.language.model.problem.Problem;
diff --git a/language/src/main/java/tools/refinery/language/resource/ProblemXmiResourceFactory.java b/language/src/main/java/tools/refinery/language/resource/ProblemXmiResourceFactory.java
new file mode 100644
index 00000000..68aa6016
--- /dev/null
+++ b/language/src/main/java/tools/refinery/language/resource/ProblemXmiResourceFactory.java
@@ -0,0 +1,16 @@
1package tools.refinery.language.resource;
2
3import org.eclipse.emf.common.util.URI;
4import org.eclipse.emf.ecore.resource.Resource;
5import org.eclipse.xtext.resource.IResourceFactory;
6
7import tools.refinery.language.model.problem.util.ProblemResourceFactoryImpl;
8
9public class ProblemXmiResourceFactory implements IResourceFactory {
10 private Resource.Factory problemResourceFactory = new ProblemResourceFactoryImpl();
11
12 @Override
13 public Resource createResource(URI uri) {
14 return problemResourceFactory.createResource(uri);
15 }
16}
diff --git a/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java b/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java
index a21c3bd2..b582d16b 100644
--- a/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java
+++ b/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java
@@ -6,20 +6,13 @@ import org.eclipse.emf.common.util.URI;
6import org.eclipse.emf.ecore.resource.Resource; 6import org.eclipse.emf.ecore.resource.Resource;
7import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider; 7import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider;
8 8
9public class ProblemGlobalScopeProvider extends ImportUriGlobalScopeProvider { 9import tools.refinery.language.model.ProblemUtil;
10 public static final String BUILTIN_LIBRARY_NAME = "builtin";
11
12 public static final URI BULTIN_LIBRARY_URI = getLibraryUri(BUILTIN_LIBRARY_NAME);
13 10
11public class ProblemGlobalScopeProvider extends ImportUriGlobalScopeProvider {
14 @Override 12 @Override
15 protected LinkedHashSet<URI> getImportedUris(Resource resource) { 13 protected LinkedHashSet<URI> getImportedUris(Resource resource) {
16 LinkedHashSet<URI> importedUris = new LinkedHashSet<>(); 14 LinkedHashSet<URI> importedUris = new LinkedHashSet<>();
17 importedUris.add(BULTIN_LIBRARY_URI); 15 importedUris.add(ProblemUtil.BUILTIN_LIBRARY_URI);
18 return importedUris; 16 return importedUris;
19 } 17 }
20
21 private static URI getLibraryUri(String libraryName) {
22 return URI.createURI(ProblemGlobalScopeProvider.class.getClassLoader()
23 .getResource("tools/refinery/" + libraryName + ".problem").toString());
24 }
25} 18}
diff --git a/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java b/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java
index 05a3bcf9..85797025 100644
--- a/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java
+++ b/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java
@@ -13,9 +13,11 @@ import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider;
13 13
14import com.google.inject.Inject; 14import com.google.inject.Inject;
15 15
16import tools.refinery.language.model.ProblemUtil;
17
16public class ProblemLocalScopeProvider extends ImportedNamespaceAwareLocalScopeProvider { 18public class ProblemLocalScopeProvider extends ImportedNamespaceAwareLocalScopeProvider {
17 private static final QualifiedName BUILTIN_LIBRARY_QUALIFIED_NAME = QualifiedName 19 private static final QualifiedName BUILTIN_LIBRARY_QUALIFIED_NAME = QualifiedName
18 .create(ProblemGlobalScopeProvider.BUILTIN_LIBRARY_NAME); 20 .create(ProblemUtil.BUILTIN_LIBRARY_NAME);
19 21
20 @Inject 22 @Inject
21 private IResourceDescriptionsProvider resourceDescriptionsProvider; 23 private IResourceDescriptionsProvider resourceDescriptionsProvider;
diff --git a/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java b/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java
index 61a3c8f9..86b39dbc 100644
--- a/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java
+++ b/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java
@@ -12,7 +12,7 @@ import org.eclipse.xtext.EcoreUtil2;
12import org.eclipse.xtext.scoping.IScope; 12import org.eclipse.xtext.scoping.IScope;
13import org.eclipse.xtext.scoping.Scopes; 13import org.eclipse.xtext.scoping.Scopes;
14 14
15import tools.refinery.language.ProblemUtil; 15import tools.refinery.language.model.ProblemUtil;
16import tools.refinery.language.model.problem.ClassDeclaration; 16import tools.refinery.language.model.problem.ClassDeclaration;
17import tools.refinery.language.model.problem.ExistentialQuantifier; 17import tools.refinery.language.model.problem.ExistentialQuantifier;
18import tools.refinery.language.model.problem.PredicateDefinition; 18import tools.refinery.language.model.problem.PredicateDefinition;
diff --git a/language/src/main/resources/tools/refinery/builtin.problem b/language/src/main/resources/tools/refinery/builtin.problem
deleted file mode 100644
index 7c4f6685..00000000
--- a/language/src/main/resources/tools/refinery/builtin.problem
+++ /dev/null
@@ -1,21 +0,0 @@
1problem builtin.
2
3abstract class node {
4 node[] equals opposite equals
5}
6
7pred exists(node node).
8
9abstract class domain extends node.
10
11abstract class data extends node.
12
13enum bool {
14 true, false
15}
16
17class real extends data.
18
19class int extends data.
20
21class string extends data.
diff --git a/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.xtend b/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.xtend
index 9bd728d6..99cf0a86 100644
--- a/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.xtend
+++ b/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.xtend
@@ -10,6 +10,7 @@ import org.eclipse.xtext.testing.util.ParseHelper
10import org.junit.jupiter.api.Test 10import org.junit.jupiter.api.Test
11import org.junit.jupiter.api.^extension.ExtendWith 11import org.junit.jupiter.api.^extension.ExtendWith
12import tools.refinery.language.model.problem.Problem 12import tools.refinery.language.model.problem.Problem
13import tools.refinery.language.model.tests.ProblemTestUtil
13 14
14import static org.hamcrest.MatcherAssert.assertThat 15import static org.hamcrest.MatcherAssert.assertThat
15import static org.hamcrest.Matchers.* 16import static org.hamcrest.Matchers.*
@@ -19,10 +20,10 @@ import static org.hamcrest.Matchers.*
19class ProblemParsingTest { 20class ProblemParsingTest {
20 @Inject 21 @Inject
21 ParseHelper<Problem> parseHelper 22 ParseHelper<Problem> parseHelper
22 23
23 @Inject 24 @Inject
24 extension ProblemTestUtil 25 extension ProblemTestUtil
25 26
26 @Test 27 @Test
27 def void exampleTest() { 28 def void exampleTest() {
28 val it = parseHelper.parse(''' 29 val it = parseHelper.parse('''
diff --git a/language/src/test/java/tools/refinery/language/tests/ProblemTestUtil.xtend b/language/src/test/java/tools/refinery/language/tests/ProblemTestUtil.xtend
deleted file mode 100644
index 46418892..00000000
--- a/language/src/test/java/tools/refinery/language/tests/ProblemTestUtil.xtend
+++ /dev/null
@@ -1,114 +0,0 @@
1package tools.refinery.language.tests
2
3import tools.refinery.language.ProblemUtil
4import tools.refinery.language.model.problem.Argument
5import tools.refinery.language.model.problem.Assertion
6import tools.refinery.language.model.problem.AssertionArgument
7import tools.refinery.language.model.problem.Atom
8import tools.refinery.language.model.problem.ClassDeclaration
9import tools.refinery.language.model.problem.Conjunction
10import tools.refinery.language.model.problem.EnumDeclaration
11import tools.refinery.language.model.problem.Literal
12import tools.refinery.language.model.problem.NegativeLiteral
13import tools.refinery.language.model.problem.Node
14import tools.refinery.language.model.problem.NodeAssertionArgument
15import tools.refinery.language.model.problem.NodeValueAssertion
16import tools.refinery.language.model.problem.PredicateDefinition
17import tools.refinery.language.model.problem.Problem
18import tools.refinery.language.model.problem.UniqueDeclaration
19import tools.refinery.language.model.problem.Variable
20import tools.refinery.language.model.problem.VariableOrNodeArgument
21
22class ProblemTestUtil {
23 def builtin(Problem it) {
24 ProblemUtil.getBuiltInLibrary(it).get
25 }
26
27 def errors(Problem it) {
28 eResource.errors
29 }
30
31 def nodeNames(Problem it) {
32 nodes.map[name]
33 }
34
35 def pred(Problem it, String name) {
36 statements.filter(PredicateDefinition).findFirst[it.name == name]
37 }
38
39 def param(PredicateDefinition it, int i) {
40 parameters.get(i)
41 }
42
43 def conj(PredicateDefinition it, int i) {
44 bodies.get(i)
45 }
46
47 def lit(Conjunction it, int i) {
48 literals.get(i)
49 }
50
51 def negated(Literal it) {
52 (it as NegativeLiteral).atom
53 }
54
55 def relation(Literal it) {
56 (it as Atom).relation
57 }
58
59 def arg(Atom it, int i) {
60 it.arguments.get(i)
61 }
62
63 def arg(Literal it, int i) {
64 (it as Atom).arg(i)
65 }
66
67 def variable(Argument it) {
68 (it as VariableOrNodeArgument).variableOrNode as Variable
69 }
70
71 def node(Argument it) {
72 (it as VariableOrNodeArgument).variableOrNode as Node
73 }
74
75 def assertion(Problem it, int i) {
76 statements.filter(Assertion).get(i)
77 }
78
79 def nodeValueAssertion(Problem it, int i) {
80 statements.filter(NodeValueAssertion).get(i)
81 }
82
83 def arg(Assertion it, int i) {
84 arguments.get(i)
85 }
86
87 def node(AssertionArgument it) {
88 (it as NodeAssertionArgument).node
89 }
90
91 def node(Problem it, String name) {
92 nodes.findFirst[it.name == name]
93 }
94
95 def uniqueNode(Problem it, String name) {
96 statements.filter(UniqueDeclaration).flatMap[nodes].findFirst[it.name == name]
97 }
98
99 def findClass(Problem it, String name) {
100 statements.filter(ClassDeclaration).findFirst[it.name == name]
101 }
102
103 def reference(ClassDeclaration it, String name) {
104 it.referenceDeclarations.findFirst[it.name == name]
105 }
106
107 def findEnum(Problem it, String name) {
108 statements.filter(EnumDeclaration).findFirst[it.name == name]
109 }
110
111 def literal(EnumDeclaration it, String name) {
112 literals.findFirst[it.name == name]
113 }
114}
diff --git a/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.xtend b/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.xtend
index ab3e325f..5ff7a2c9 100644
--- a/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.xtend
+++ b/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.xtend
@@ -12,8 +12,8 @@ import org.junit.jupiter.params.provider.Arguments
12import org.junit.jupiter.params.provider.MethodSource 12import org.junit.jupiter.params.provider.MethodSource
13import org.junit.jupiter.params.provider.ValueSource 13import org.junit.jupiter.params.provider.ValueSource
14import tools.refinery.language.model.problem.Problem 14import tools.refinery.language.model.problem.Problem
15import tools.refinery.language.model.tests.ProblemTestUtil
15import tools.refinery.language.tests.ProblemInjectorProvider 16import tools.refinery.language.tests.ProblemInjectorProvider
16import tools.refinery.language.tests.ProblemTestUtil
17 17
18import static org.hamcrest.MatcherAssert.assertThat 18import static org.hamcrest.MatcherAssert.assertThat
19import static org.hamcrest.Matchers.* 19import static org.hamcrest.Matchers.*