From 663274763e56b228efe07363b8ede4ce7bebc251 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 19 Oct 2021 03:36:26 +0200 Subject: chore: remove builtin library xtext dependency --- language/build.gradle | 1 + .../refinery/language/ProblemStandaloneSetup.java | 30 ++++-- .../java/tools/refinery/language/ProblemUtil.java | 94 ----------------- .../refinery/language/ProblemXmiRuntimeModule.java | 35 +++++++ .../resource/ProblemLocationInFileProvider.java | 2 +- .../ProblemResourceDescriptionStrategy.java | 2 +- .../resource/ProblemXmiResourceFactory.java | 16 +++ .../scoping/ProblemGlobalScopeProvider.java | 13 +-- .../scoping/ProblemLocalScopeProvider.java | 4 +- .../language/scoping/ProblemScopeProvider.java | 2 +- .../main/resources/tools/refinery/builtin.problem | 21 ---- .../language/tests/ProblemParsingTest.xtend | 5 +- .../refinery/language/tests/ProblemTestUtil.xtend | 114 --------------------- .../language/tests/scoping/NodeScopingTest.xtend | 2 +- 14 files changed, 85 insertions(+), 256 deletions(-) delete mode 100644 language/src/main/java/tools/refinery/language/ProblemUtil.java create mode 100644 language/src/main/java/tools/refinery/language/ProblemXmiRuntimeModule.java create mode 100644 language/src/main/java/tools/refinery/language/resource/ProblemXmiResourceFactory.java delete mode 100644 language/src/main/resources/tools/refinery/builtin.problem delete mode 100644 language/src/test/java/tools/refinery/language/tests/ProblemTestUtil.xtend (limited to 'language') 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 { api "org.eclipse.emf:org.eclipse.emf.ecore:${ecoreVersion}" api project(':refinery-language-model') testFixturesApi "org.eclipse.xtext:org.eclipse.xtext.testing:${xtextVersion}" + testFixturesApi testFixtures(project(':refinery-language-model')) mwe2 "org.eclipse.xtext:org.eclipse.xtext.common.types:${xtextVersion}" mwe2 "org.eclipse.xtext:org.eclipse.xtext.xtext.generator:${xtextVersion}" 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 @@ */ package tools.refinery.language; -import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.xtext.resource.IResourceFactory; +import org.eclipse.xtext.resource.IResourceServiceProvider; +import com.google.inject.Guice; import com.google.inject.Injector; -import tools.refinery.language.model.problem.ProblemPackage; +import tools.refinery.language.model.ProblemEMFSetup; /** * Initialization support for running Xtext languages without Equinox extension @@ -20,15 +23,22 @@ public class ProblemStandaloneSetup extends ProblemStandaloneSetupGenerated { } @Override - // Here we can't rely on java.util.HashMap#computeIfAbsent, because - // org.eclipse.emf.ecore.impl.EPackageRegistryImpl#containsKey is overridden - // without also overriding computeIfAbsent. We must make sure to call the - // overridden containsKey implementation. - @SuppressWarnings("squid:S3824") public Injector createInjectorAndDoEMFRegistration() { - if (!EPackage.Registry.INSTANCE.containsKey(ProblemPackage.eNS_URI)) { - EPackage.Registry.INSTANCE.put(ProblemPackage.eNS_URI, ProblemPackage.eINSTANCE); - } + ProblemEMFSetup.doEMFRegistration(); + var xmiInjector = createXmiInjector(); + registerXmiInjector(xmiInjector); return super.createInjectorAndDoEMFRegistration(); } + + protected Injector createXmiInjector() { + return Guice.createInjector(new ProblemXmiRuntimeModule()); + } + + protected void registerXmiInjector(Injector injector) { + IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class); + IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider.class); + + Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(ProblemEMFSetup.XMI_RESOURCE_EXTENSION, resourceFactory); + IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put(ProblemEMFSetup.XMI_RESOURCE_EXTENSION, serviceProvider); + } } diff --git a/language/src/main/java/tools/refinery/language/ProblemUtil.java b/language/src/main/java/tools/refinery/language/ProblemUtil.java deleted file mode 100644 index ae2efc3d..00000000 --- a/language/src/main/java/tools/refinery/language/ProblemUtil.java +++ /dev/null @@ -1,94 +0,0 @@ -package tools.refinery.language; - -import java.util.ArrayDeque; -import java.util.Collection; -import java.util.Deque; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; - -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.resource.Resource; - -import com.google.common.collect.ImmutableList; - -import tools.refinery.language.model.problem.ClassDeclaration; -import tools.refinery.language.model.problem.Node; -import tools.refinery.language.model.problem.Problem; -import tools.refinery.language.model.problem.ProblemPackage; -import tools.refinery.language.model.problem.ReferenceDeclaration; -import tools.refinery.language.model.problem.Relation; -import tools.refinery.language.model.problem.Variable; -import tools.refinery.language.scoping.ProblemGlobalScopeProvider; - -public final class ProblemUtil { - private ProblemUtil() { - throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); - } - - public static final String NODE_CLASS_NAME = "node"; - - public static boolean isSingletonVariable(Variable variable) { - return variable.eContainingFeature() == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__SINGLETON_VARIABLE; - } - - public static boolean isUniqueNode(Node node) { - var containingFeature = node.eContainingFeature(); - return containingFeature == ProblemPackage.Literals.UNIQUE_DECLARATION__NODES - || containingFeature == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS; - } - - public static boolean isNewNode(Node node) { - return node.eContainingFeature() == ProblemPackage.Literals.CLASS_DECLARATION__NEW_NODE; - } - - public static Optional getBuiltInLibrary(EObject context) { - return Optional.ofNullable(context.eResource()).map(Resource::getResourceSet) - .map(resourceSet -> resourceSet.getResource(ProblemGlobalScopeProvider.BULTIN_LIBRARY_URI, true)) - .map(Resource::getContents).filter(contents -> !contents.isEmpty()).map(contents -> contents.get(0)) - .filter(Problem.class::isInstance).map(Problem.class::cast); - } - - public static boolean isBuiltIn(EObject eObject) { - if (eObject != null) { - var eResource = eObject.eResource(); - if (eResource != null) { - return ProblemGlobalScopeProvider.BULTIN_LIBRARY_URI.equals(eResource.getURI()); - } - } - return false; - } - - public static Optional getNodeClassDeclaration(EObject context) { - return getBuiltInLibrary(context).flatMap(problem -> problem.getStatements().stream() - .filter(ClassDeclaration.class::isInstance).map(ClassDeclaration.class::cast) - .filter(declaration -> NODE_CLASS_NAME.equals(declaration.getName())).findFirst()); - } - - public static Collection getSuperclassesAndSelf(ClassDeclaration classDeclaration) { - Set found = new HashSet<>(); - getNodeClassDeclaration(classDeclaration).ifPresent(found::add); - Deque queue = new ArrayDeque<>(); - queue.addLast(classDeclaration); - while (!queue.isEmpty()) { - ClassDeclaration current = queue.removeFirst(); - if (!found.contains(current)) { - found.add(current); - for (Relation superType : current.getSuperTypes()) { - if (superType instanceof ClassDeclaration superDeclaration) { - queue.addLast(superDeclaration); - } - } - } - } - return found; - } - - public static Collection getAllReferenceDeclarations(ClassDeclaration classDeclaration) { - ImmutableList.Builder builder = ImmutableList.builder(); - for (ClassDeclaration superclass : getSuperclassesAndSelf(classDeclaration)) { - builder.addAll(superclass.getReferenceDeclarations()); - } - return builder.build(); - } -} 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 @@ +package tools.refinery.language; + +import org.eclipse.xtext.naming.IQualifiedNameConverter; +import org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy; +import org.eclipse.xtext.resource.IResourceFactory; +import org.eclipse.xtext.resource.generic.AbstractGenericResourceRuntimeModule; + +import tools.refinery.language.model.ProblemEMFSetup; +import tools.refinery.language.naming.ProblemQualifiedNameConverter; +import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; +import tools.refinery.language.resource.ProblemXmiResourceFactory; + +public class ProblemXmiRuntimeModule extends AbstractGenericResourceRuntimeModule { + @Override + protected String getLanguageName() { + return "tools.refinery.language.ProblemXmi"; + } + + @Override + protected String getFileExtensions() { + return ProblemEMFSetup.XMI_RESOURCE_EXTENSION; + } + + public Class bindIResourceFactory() { + return ProblemXmiResourceFactory.class; + } + + public Class bindIQualifiedNameConverter() { + return ProblemQualifiedNameConverter.class; + } + + public Class bindIDefaultResourceDescriptionStrategy() { + return ProblemResourceDescriptionStrategy.class; + } +} 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; import org.eclipse.xtext.resource.DefaultLocationInFileProvider; import org.eclipse.xtext.util.ITextRegion; -import tools.refinery.language.ProblemUtil; +import tools.refinery.language.model.ProblemUtil; import tools.refinery.language.model.problem.ImplicitVariable; import tools.refinery.language.model.problem.Node; 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; import com.google.inject.Inject; import com.google.inject.Singleton; -import tools.refinery.language.ProblemUtil; +import tools.refinery.language.model.ProblemUtil; import tools.refinery.language.model.problem.NamedElement; import tools.refinery.language.model.problem.Node; import 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 @@ +package tools.refinery.language.resource; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.xtext.resource.IResourceFactory; + +import tools.refinery.language.model.problem.util.ProblemResourceFactoryImpl; + +public class ProblemXmiResourceFactory implements IResourceFactory { + private Resource.Factory problemResourceFactory = new ProblemResourceFactoryImpl(); + + @Override + public Resource createResource(URI uri) { + return problemResourceFactory.createResource(uri); + } +} 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; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider; -public class ProblemGlobalScopeProvider extends ImportUriGlobalScopeProvider { - public static final String BUILTIN_LIBRARY_NAME = "builtin"; - - public static final URI BULTIN_LIBRARY_URI = getLibraryUri(BUILTIN_LIBRARY_NAME); +import tools.refinery.language.model.ProblemUtil; +public class ProblemGlobalScopeProvider extends ImportUriGlobalScopeProvider { @Override protected LinkedHashSet getImportedUris(Resource resource) { LinkedHashSet importedUris = new LinkedHashSet<>(); - importedUris.add(BULTIN_LIBRARY_URI); + importedUris.add(ProblemUtil.BUILTIN_LIBRARY_URI); return importedUris; } - - private static URI getLibraryUri(String libraryName) { - return URI.createURI(ProblemGlobalScopeProvider.class.getClassLoader() - .getResource("tools/refinery/" + libraryName + ".problem").toString()); - } } 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; import com.google.inject.Inject; +import tools.refinery.language.model.ProblemUtil; + public class ProblemLocalScopeProvider extends ImportedNamespaceAwareLocalScopeProvider { private static final QualifiedName BUILTIN_LIBRARY_QUALIFIED_NAME = QualifiedName - .create(ProblemGlobalScopeProvider.BUILTIN_LIBRARY_NAME); + .create(ProblemUtil.BUILTIN_LIBRARY_NAME); @Inject 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; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.Scopes; -import tools.refinery.language.ProblemUtil; +import tools.refinery.language.model.ProblemUtil; import tools.refinery.language.model.problem.ClassDeclaration; import tools.refinery.language.model.problem.ExistentialQuantifier; import 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 @@ -problem builtin. - -abstract class node { - node[] equals opposite equals -} - -pred exists(node node). - -abstract class domain extends node. - -abstract class data extends node. - -enum bool { - true, false -} - -class real extends data. - -class int extends data. - -class 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 import org.junit.jupiter.api.Test import org.junit.jupiter.api.^extension.ExtendWith import tools.refinery.language.model.problem.Problem +import tools.refinery.language.model.tests.ProblemTestUtil import static org.hamcrest.MatcherAssert.assertThat import static org.hamcrest.Matchers.* @@ -19,10 +20,10 @@ import static org.hamcrest.Matchers.* class ProblemParsingTest { @Inject ParseHelper parseHelper - + @Inject extension ProblemTestUtil - + @Test def void exampleTest() { 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 @@ -package tools.refinery.language.tests - -import tools.refinery.language.ProblemUtil -import tools.refinery.language.model.problem.Argument -import tools.refinery.language.model.problem.Assertion -import tools.refinery.language.model.problem.AssertionArgument -import tools.refinery.language.model.problem.Atom -import tools.refinery.language.model.problem.ClassDeclaration -import tools.refinery.language.model.problem.Conjunction -import tools.refinery.language.model.problem.EnumDeclaration -import tools.refinery.language.model.problem.Literal -import tools.refinery.language.model.problem.NegativeLiteral -import tools.refinery.language.model.problem.Node -import tools.refinery.language.model.problem.NodeAssertionArgument -import tools.refinery.language.model.problem.NodeValueAssertion -import tools.refinery.language.model.problem.PredicateDefinition -import tools.refinery.language.model.problem.Problem -import tools.refinery.language.model.problem.UniqueDeclaration -import tools.refinery.language.model.problem.Variable -import tools.refinery.language.model.problem.VariableOrNodeArgument - -class ProblemTestUtil { - def builtin(Problem it) { - ProblemUtil.getBuiltInLibrary(it).get - } - - def errors(Problem it) { - eResource.errors - } - - def nodeNames(Problem it) { - nodes.map[name] - } - - def pred(Problem it, String name) { - statements.filter(PredicateDefinition).findFirst[it.name == name] - } - - def param(PredicateDefinition it, int i) { - parameters.get(i) - } - - def conj(PredicateDefinition it, int i) { - bodies.get(i) - } - - def lit(Conjunction it, int i) { - literals.get(i) - } - - def negated(Literal it) { - (it as NegativeLiteral).atom - } - - def relation(Literal it) { - (it as Atom).relation - } - - def arg(Atom it, int i) { - it.arguments.get(i) - } - - def arg(Literal it, int i) { - (it as Atom).arg(i) - } - - def variable(Argument it) { - (it as VariableOrNodeArgument).variableOrNode as Variable - } - - def node(Argument it) { - (it as VariableOrNodeArgument).variableOrNode as Node - } - - def assertion(Problem it, int i) { - statements.filter(Assertion).get(i) - } - - def nodeValueAssertion(Problem it, int i) { - statements.filter(NodeValueAssertion).get(i) - } - - def arg(Assertion it, int i) { - arguments.get(i) - } - - def node(AssertionArgument it) { - (it as NodeAssertionArgument).node - } - - def node(Problem it, String name) { - nodes.findFirst[it.name == name] - } - - def uniqueNode(Problem it, String name) { - statements.filter(UniqueDeclaration).flatMap[nodes].findFirst[it.name == name] - } - - def findClass(Problem it, String name) { - statements.filter(ClassDeclaration).findFirst[it.name == name] - } - - def reference(ClassDeclaration it, String name) { - it.referenceDeclarations.findFirst[it.name == name] - } - - def findEnum(Problem it, String name) { - statements.filter(EnumDeclaration).findFirst[it.name == name] - } - - def literal(EnumDeclaration it, String name) { - literals.findFirst[it.name == name] - } -} 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 import org.junit.jupiter.params.provider.MethodSource import org.junit.jupiter.params.provider.ValueSource import tools.refinery.language.model.problem.Problem +import tools.refinery.language.model.tests.ProblemTestUtil import tools.refinery.language.tests.ProblemInjectorProvider -import tools.refinery.language.tests.ProblemTestUtil import static org.hamcrest.MatcherAssert.assertThat import static org.hamcrest.Matchers.* -- cgit v1.2.3-54-g00ecf