From c4757c72887d0d83a51099c9f33d3e027f55a4e6 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 15 Aug 2023 12:35:06 +0200 Subject: refactor(language): invalid multiplicity trace Also simplifies attributes and flags for now, as we don't translate them to abstractions. --- .../ProblemCrossrefProposalProvider.java | 49 ++++++++++++++++------ .../ProblemSemanticHighlightingCalculator.java | 13 ++++-- 2 files changed, 46 insertions(+), 16 deletions(-) (limited to 'subprojects/language-ide/src/main/java/tools') diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java index e194ee31..ce5e7dad 100644 --- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java +++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java @@ -5,39 +5,57 @@ */ package tools.refinery.language.ide.contentassist; -import java.util.Objects; - +import com.google.inject.Inject; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.CrossReference; import org.eclipse.xtext.GrammarUtil; import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext; -import org.eclipse.xtext.ide.editor.contentassist.ContentAssistEntry; import org.eclipse.xtext.ide.editor.contentassist.IdeCrossrefProposalProvider; +import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import org.eclipse.xtext.resource.IEObjectDescription; - -import com.google.inject.Inject; - +import org.eclipse.xtext.scoping.IScope; import tools.refinery.language.model.problem.Problem; +import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; import tools.refinery.language.resource.ReferenceCounter; import tools.refinery.language.utils.ProblemUtil; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider { @Inject private ReferenceCounter referenceCounter; @Override - protected ContentAssistEntry createProposal(IEObjectDescription candidate, CrossReference crossRef, - ContentAssistContext context) { - if (!shouldCreateProposal(candidate, crossRef, context)) { - return null; + protected Iterable queryScope(IScope scope, CrossReference crossReference, + ContentAssistContext context) { + var eObjectDescriptionsByName = new HashMap>(); + for (var candidate : super.queryScope(scope, crossReference, context)) { + if (isExistingObject(candidate, crossReference, context)) { + var qualifiedName = candidate.getQualifiedName(); + var candidateList = eObjectDescriptionsByName.computeIfAbsent(qualifiedName, + ignored -> new ArrayList<>()); + candidateList.add(candidate); + } } - return super.createProposal(candidate, crossRef, context); + var eObjectDescriptions = new ArrayList(); + for (var candidates : eObjectDescriptionsByName.values()) { + if (candidates.size() == 1) { + var candidate = candidates.get(0); + if (shouldBeVisible(candidate)) { + eObjectDescriptions.add(candidate); + } + } + } + return eObjectDescriptions; } - protected boolean shouldCreateProposal(IEObjectDescription candidate, CrossReference crossRef, - ContentAssistContext context) { + protected boolean isExistingObject(IEObjectDescription candidate, CrossReference crossRef, + ContentAssistContext context) { var rootModel = context.getRootModel(); var eObjectOrProxy = candidate.getEObjectOrProxy(); if (!Objects.equals(rootModel.eResource(), eObjectOrProxy.eResource())) { @@ -60,6 +78,11 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider return true; } + protected boolean shouldBeVisible(IEObjectDescription candidate) { + var errorPredicate = candidate.getUserData(ProblemResourceDescriptionStrategy.ERROR_PREDICATE); + return !ProblemResourceDescriptionStrategy.ERROR_PREDICATE_TRUE.equals(errorPredicate); + } + protected EObject getCurrentValue(CrossReference crossRef, ContentAssistContext context) { var value = getCurrentValue(crossRef, context.getCurrentModel()); if (value != null) { diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java index e8f97d51..08747ec5 100644 --- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java +++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java @@ -16,6 +16,7 @@ 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 org.jetbrains.annotations.NotNull; import tools.refinery.language.model.problem.*; import tools.refinery.language.utils.ProblemDesugarer; import tools.refinery.language.utils.ProblemUtil; @@ -94,9 +95,16 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli } protected String[] getHighlightClass(EObject eObject, EReference reference) { + boolean isError = eObject instanceof PredicateDefinition predicateDefinition && predicateDefinition.isError(); if (ProblemUtil.isBuiltIn(eObject)) { - return new String[] { BUILTIN_CLASS }; + var className = isError ? ERROR_CLASS : BUILTIN_CLASS; + return new String[] { className }; } + return getUserDefinedElementHighlightClass(eObject, reference, isError); + } + + @NotNull + private String[] getUserDefinedElementHighlightClass(EObject eObject, EReference reference, boolean isError) { ImmutableList.Builder classesBuilder = ImmutableList.builder(); if (eObject instanceof ClassDeclaration classDeclaration && classDeclaration.isAbstract()) { classesBuilder.add(ABSTRACT_CLASS); @@ -105,8 +113,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli && desugarer.isContainmentReference(referenceDeclaration)) { classesBuilder.add(CONTAINMENT_CLASS); } - if (eObject instanceof PredicateDefinition predicateDefinition - && predicateDefinition.getKind() == PredicateKind.ERROR) { + if (isError) { classesBuilder.add(ERROR_CLASS); } if (eObject instanceof Node node) { -- cgit v1.2.3-70-g09d2