From 2dfcb286216419976368ad926f8ac7f018aa2bf9 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 2 Feb 2024 16:28:19 +0100 Subject: refactor(language): name disambiguation * Use fully qualified names starting with :: (as in C++) to unambiguously refer to an element. * Name shadowing within modules. --- .../ProblemCrossrefProposalProvider.java | 22 +++++++++++++--------- .../ProblemSemanticHighlightingCalculator.java | 2 +- 2 files changed, 14 insertions(+), 10 deletions(-) (limited to 'subprojects/language-ide/src') 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 166b4400..fa04a012 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 @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -15,13 +15,14 @@ import org.eclipse.xtext.EcoreUtil2; import org.eclipse.xtext.GrammarUtil; import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext; 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 org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.xtext.CurrentTypeFinder; import org.jetbrains.annotations.Nullable; import tools.refinery.language.model.problem.*; +import tools.refinery.language.naming.NamingUtil; +import tools.refinery.language.naming.ProblemQualifiedNameConverter; import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; import tools.refinery.language.utils.BuiltinSymbols; import tools.refinery.language.utils.ProblemDesugarer; @@ -46,14 +47,12 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider @Override protected Iterable queryScope(IScope scope, CrossReference crossReference, ContentAssistContext context) { - var eObjectDescriptionsByName = new HashMap>(); + var eObjectDescriptionsByName = new HashMap>(); for (var candidate : super.queryScope(scope, crossReference, context)) { if (isExistingObject(candidate, crossReference, context)) { - // {@code getQualifiedName()} will refer to the full name for objects that are loaded from the global - // scope, but {@code getName()} returns the qualified name that we set in - // {@code ProblemResourceDescriptionStrategy}. - var qualifiedName = candidate.getName(); - var candidateList = eObjectDescriptionsByName.computeIfAbsent(qualifiedName, + var shadowingKey = ProblemResourceDescriptionStrategy.getShadowingKey(candidate); + var candidateList = eObjectDescriptionsByName.computeIfAbsent(shadowingKey, ignored -> new ArrayList<>()); candidateList.add(candidate); } @@ -61,7 +60,7 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider var eObjectDescriptions = new ArrayList(); for (var candidates : eObjectDescriptionsByName.values()) { if (candidates.size() == 1) { - var candidate = candidates.get(0); + var candidate = candidates.getFirst(); if (shouldBeVisible(candidate, crossReference, context)) { eObjectDescriptions.add(candidate); } @@ -96,6 +95,11 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider protected boolean shouldBeVisible(IEObjectDescription candidate, CrossReference crossReference, ContentAssistContext context) { + if (NamingUtil.isFullyQualified(candidate.getName()) && + !context.getPrefix().startsWith(ProblemQualifiedNameConverter.DELIMITER)) { + // Do not propose names with a root prefix unless explicitly asked for. + return false; + } var errorPredicate = candidate.getUserData(ProblemResourceDescriptionStrategy.ERROR_PREDICATE); if (ProblemResourceDescriptionStrategy.ERROR_PREDICATE_TRUE.equals(errorPredicate)) { return false; 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 94a61c4f..891c73c7 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 @@ -99,7 +99,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli protected String[] getHighlightClass(EObject eObject, EReference reference) { boolean isError = ProblemUtil.isError(eObject); - if (ProblemUtil.isBuiltIn(eObject)) { + if (ProblemUtil.isBuiltIn(eObject) && !(eObject instanceof Problem)) { var className = isError ? ERROR_CLASS : BUILTIN_CLASS; return new String[]{className}; } -- cgit v1.2.3-54-g00ecf