From c3e27396c62f191b4343df151e5a86bfa63a32f3 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 5 Oct 2021 00:36:47 +0200 Subject: chore: change package name --- .../refinery/language/ide/ProblemIdeModule.java | 18 +++ .../refinery/language/ide/ProblemIdeSetup.java | 24 ++++ .../ProblemSemanticHighlightingCalculator.java | 151 +++++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeModule.java create mode 100644 language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeSetup.java create mode 100644 language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java (limited to 'language-ide/src/main/java/tools') diff --git a/language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeModule.java b/language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeModule.java new file mode 100644 index 00000000..5327f7b4 --- /dev/null +++ b/language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeModule.java @@ -0,0 +1,18 @@ +/* + * generated by Xtext 2.25.0 + */ +package tools.refinery.language.ide; + +import org.eclipse.xtext.ide.editor.syntaxcoloring.ISemanticHighlightingCalculator; + +import tools.refinery.language.ide.syntaxcoloring.ProblemSemanticHighlightingCalculator; + +/** + * Use this class to register ide components. + */ +public class ProblemIdeModule extends AbstractProblemIdeModule { + + public Class bindISemanticHighlightingCalculator() { + return ProblemSemanticHighlightingCalculator.class; + } +} diff --git a/language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeSetup.java b/language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeSetup.java new file mode 100644 index 00000000..5b88d41f --- /dev/null +++ b/language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeSetup.java @@ -0,0 +1,24 @@ +/* + * generated by Xtext 2.25.0 + */ +package tools.refinery.language.ide; + +import org.eclipse.xtext.util.Modules2; + +import com.google.inject.Guice; +import com.google.inject.Injector; + +import tools.refinery.language.ProblemRuntimeModule; +import tools.refinery.language.ProblemStandaloneSetup; + +/** + * Initialization support for running Xtext languages as language servers. + */ +public class ProblemIdeSetup extends ProblemStandaloneSetup { + + @Override + public Injector createInjector() { + return Guice.createInjector(Modules2.mixin(new ProblemRuntimeModule(), new ProblemIdeModule())); + } + +} 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 new file mode 100644 index 00000000..b2e3c90b --- /dev/null +++ b/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java @@ -0,0 +1,151 @@ +package tools.refinery.language.ide.syntaxcoloring; + +import java.util.List; + +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.xtext.ide.editor.syntaxcoloring.DefaultSemanticHighlightingCalculator; +import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; +import org.eclipse.xtext.service.OperationCanceledManager; +import org.eclipse.xtext.util.CancelIndicator; + +import com.google.common.collect.ImmutableList; +import com.google.inject.Inject; + +import tools.refinery.language.ProblemUtil; +import tools.refinery.language.model.problem.ClassDeclaration; +import tools.refinery.language.model.problem.EnumDeclaration; +import tools.refinery.language.model.problem.NamedElement; +import tools.refinery.language.model.problem.Node; +import tools.refinery.language.model.problem.Parameter; +import tools.refinery.language.model.problem.PredicateDefinition; +import tools.refinery.language.model.problem.ProblemPackage; +import tools.refinery.language.model.problem.ReferenceDeclaration; +import tools.refinery.language.model.problem.Variable; + +public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighlightingCalculator { + private static final String BUILTIN_CLASS = "cm-keyword"; + private static final String CLASS_CLASS = "problem-class"; + private static final String ABSTRACT_CLASS = "problem-abstract"; + private static final String ENUM_CLASS = "problem-enum"; + private static final String REFERENCE_CLASS = "problem-reference"; + private static final String CONTAINMENT_CLASS = "problem-containment"; + private static final String PREDICATE_CLASS = "problem-predicate"; + private static final String ERROR_CLASS = "problem-error"; + private static final String NODE_CLASS = "problem-node"; + private static final String UNIQUE_NODE_CLASS = "problem-unique-node"; + private static final String NEW_NODE_CLASS = "problem-new-node"; + private static final String PARAMETER_CLASS = "problem-parameter"; + private static final String VARIABLE_CLASS = "problem-variable"; + private static final String SINGLETON_VARIABLE_CLASS = "problem-singleton-variable"; + + @Inject + private OperationCanceledManager operationCanceledManager; + + @Override + protected boolean highlightElement(EObject object, IHighlightedPositionAcceptor acceptor, + CancelIndicator cancelIndicator) { + highlightName(object, acceptor); + highlightCrossReferences(object, acceptor, cancelIndicator); + return false; + } + + protected void highlightName(EObject object, IHighlightedPositionAcceptor acceptor) { + if (!(object instanceof NamedElement)) { + return; + } + String[] highlightClass = getHighlightClass(object); + if (highlightClass.length > 0) { + highlightFeature(acceptor, object, ProblemPackage.Literals.NAMED_ELEMENT__NAME, highlightClass); + } + } + + protected void highlightCrossReferences(EObject object, IHighlightedPositionAcceptor acceptor, + CancelIndicator cancelIndicator) { + for (EReference reference : object.eClass().getEAllReferences()) { + if (reference.isContainment()) { + continue; + } + operationCanceledManager.checkCanceled(cancelIndicator); + if (reference.isMany()) { + highlightManyValues(object, reference, acceptor); + } else { + highlightSingleValue(object, reference, acceptor); + } + } + } + + protected void highlightSingleValue(EObject object, EReference reference, IHighlightedPositionAcceptor acceptor) { + EObject valueObj = (EObject) object.eGet(reference); + String[] highlightClass = getHighlightClass(valueObj); + if (highlightClass.length > 0) { + highlightFeature(acceptor, object, reference, highlightClass); + } + } + + protected void highlightManyValues(EObject object, EReference reference, IHighlightedPositionAcceptor acceptor) { + @SuppressWarnings("unchecked") + EList values = (EList) object.eGet(reference); + List nodes = NodeModelUtils.findNodesForFeature(object, reference); + int size = Math.min(values.size(), nodes.size()); + for (var i = 0; i < size; i++) { + EObject valueInList = values.get(i); + INode node = nodes.get(i); + String[] highlightClass = getHighlightClass(valueInList); + if (highlightClass.length > 0) { + highlightNode(acceptor, node, highlightClass); + } + } + } + + protected String[] getHighlightClass(EObject eObject) { + if (ProblemUtil.isBuiltIn(eObject)) { + return new String[] { BUILTIN_CLASS }; + } + ImmutableList.Builder classesBuilder = ImmutableList.builder(); + if (eObject instanceof ClassDeclaration classDeclaration) { + classesBuilder.add(CLASS_CLASS); + if (classDeclaration.isAbstract()) { + classesBuilder.add(ABSTRACT_CLASS); + } + } + if (eObject instanceof EnumDeclaration) { + classesBuilder.add(ENUM_CLASS); + } + if (eObject instanceof ReferenceDeclaration referenceDeclaration) { + classesBuilder.add(REFERENCE_CLASS); + if (referenceDeclaration.isContainment()) { + classesBuilder.add(CONTAINMENT_CLASS); + } + } + if (eObject instanceof PredicateDefinition predicateDefinition) { + classesBuilder.add(PREDICATE_CLASS); + if (predicateDefinition.isError()) { + classesBuilder.add(ERROR_CLASS); + } + } + if (eObject instanceof Node node) { + classesBuilder.add(NODE_CLASS); + if (ProblemUtil.isUniqueNode(node)) { + classesBuilder.add(UNIQUE_NODE_CLASS); + } + if (ProblemUtil.isNewNode(node)) { + classesBuilder.add(NEW_NODE_CLASS); + } + } + if (eObject instanceof Parameter) { + classesBuilder.add(PARAMETER_CLASS); + } + if (eObject instanceof Variable variable) { + classesBuilder.add(VARIABLE_CLASS); + if (ProblemUtil.isSingletonVariable(variable)) { + classesBuilder.add(SINGLETON_VARIABLE_CLASS); + } + } + List classes = classesBuilder.build(); + return classes.toArray(new String[0]); + } +} -- cgit v1.2.3-70-g09d2