diff options
author | Kristóf Marussy <kristof@marussy.com> | 2024-02-11 22:28:36 +0100 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2024-02-11 22:28:36 +0100 |
commit | 0b7b1b2b5a136e157b733e9d9c7e1d250efae15d (patch) | |
tree | 23bd350b9dd5966a69a8e4b1cc8066ed2e7090ff /subprojects | |
parent | refactor(language): scope shadowing (diff) | |
download | refinery-0b7b1b2b5a136e157b733e9d9c7e1d250efae15d.tar.gz refinery-0b7b1b2b5a136e157b733e9d9c7e1d250efae15d.tar.zst refinery-0b7b1b2b5a136e157b733e9d9c7e1d250efae15d.zip |
feat(language): filter content assist for imports
Diffstat (limited to 'subprojects')
2 files changed, 25 insertions, 1 deletions
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 fa04a012..a09a475b 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 | |||
@@ -24,6 +24,7 @@ import tools.refinery.language.model.problem.*; | |||
24 | import tools.refinery.language.naming.NamingUtil; | 24 | import tools.refinery.language.naming.NamingUtil; |
25 | import tools.refinery.language.naming.ProblemQualifiedNameConverter; | 25 | import tools.refinery.language.naming.ProblemQualifiedNameConverter; |
26 | import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; | 26 | import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; |
27 | import tools.refinery.language.scoping.imports.ImportCollector; | ||
27 | import tools.refinery.language.utils.BuiltinSymbols; | 28 | import tools.refinery.language.utils.BuiltinSymbols; |
28 | import tools.refinery.language.utils.ProblemDesugarer; | 29 | import tools.refinery.language.utils.ProblemDesugarer; |
29 | import tools.refinery.language.utils.ProblemUtil; | 30 | import tools.refinery.language.utils.ProblemUtil; |
@@ -44,6 +45,9 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider | |||
44 | @Inject | 45 | @Inject |
45 | private ProblemDesugarer desugarer; | 46 | private ProblemDesugarer desugarer; |
46 | 47 | ||
48 | @Inject | ||
49 | private ImportCollector importCollector; | ||
50 | |||
47 | @Override | 51 | @Override |
48 | protected Iterable<IEObjectDescription> queryScope(IScope scope, CrossReference crossReference, | 52 | protected Iterable<IEObjectDescription> queryScope(IScope scope, CrossReference crossReference, |
49 | ContentAssistContext context) { | 53 | ContentAssistContext context) { |
@@ -110,6 +114,10 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider | |||
110 | return true; | 114 | return true; |
111 | } | 115 | } |
112 | 116 | ||
117 | if (eReference == ProblemPackage.Literals.IMPORT_STATEMENT__IMPORTED_MODULE) { | ||
118 | return importedModuleShouldBeVisible(candidate, context); | ||
119 | } | ||
120 | |||
113 | var candidateEObjectOrProxy = candidate.getEObjectOrProxy(); | 121 | var candidateEObjectOrProxy = candidate.getEObjectOrProxy(); |
114 | 122 | ||
115 | if (eReference.equals(ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) && | 123 | if (eReference.equals(ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) && |
@@ -127,6 +135,20 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider | |||
127 | candidateEObjectOrProxy); | 135 | candidateEObjectOrProxy); |
128 | } | 136 | } |
129 | 137 | ||
138 | private boolean importedModuleShouldBeVisible(IEObjectDescription candidate, ContentAssistContext context) { | ||
139 | var moduleKind = candidate.getUserData(ProblemResourceDescriptionStrategy.MODULE_KIND); | ||
140 | if (!ModuleKind.MODULE.getName().equals(moduleKind)) { | ||
141 | return false; | ||
142 | } | ||
143 | var resource = context.getResource(); | ||
144 | var candidateResourceUri = candidate.getEObjectURI().trimFragment(); | ||
145 | if (candidateResourceUri.equals(resource.getURI())) { | ||
146 | return false; | ||
147 | } | ||
148 | var imports = importCollector.getDirectImports(resource); | ||
149 | return !imports.toUriSet().contains(candidateResourceUri); | ||
150 | } | ||
151 | |||
130 | private static boolean oppositeShouldBeVisible(ReferenceDeclaration candidateReferenceDeclaration, | 152 | private static boolean oppositeShouldBeVisible(ReferenceDeclaration candidateReferenceDeclaration, |
131 | ContentAssistContext context) { | 153 | ContentAssistContext context) { |
132 | var referenceDeclaration = EcoreUtil2.getContainerOfType(context.getCurrentModel(), | 154 | var referenceDeclaration = EcoreUtil2.getContainerOfType(context.getCurrentModel(), |
diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java index 7d90ea00..3080a78e 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java | |||
@@ -42,6 +42,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti | |||
42 | public static final String PREFERRED_NAME_TRUE = "true"; | 42 | public static final String PREFERRED_NAME_TRUE = "true"; |
43 | public static final String IMPORTS = DATA_PREFIX + "IMPORTS"; | 43 | public static final String IMPORTS = DATA_PREFIX + "IMPORTS"; |
44 | public static final String IMPORTS_SEPARATOR = "|"; | 44 | public static final String IMPORTS_SEPARATOR = "|"; |
45 | public static final String MODULE_KIND = DATA_PREFIX + "MODULE_KIND"; | ||
45 | public static final String COLOR_RELATION = DATA_PREFIX + "COLOR_RELATION"; | 46 | public static final String COLOR_RELATION = DATA_PREFIX + "COLOR_RELATION"; |
46 | public static final String COLOR_RELATION_TRUE = "true"; | 47 | public static final String COLOR_RELATION_TRUE = "true"; |
47 | 48 | ||
@@ -135,13 +136,14 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti | |||
135 | 136 | ||
136 | protected Map<String, String> getUserData(EObject eObject) { | 137 | protected Map<String, String> getUserData(EObject eObject) { |
137 | var builder = ImmutableMap.<String, String>builder(); | 138 | var builder = ImmutableMap.<String, String>builder(); |
138 | if (eObject instanceof Problem) { | 139 | if (eObject instanceof Problem problem) { |
139 | builder.put(SHADOWING_KEY, SHADOWING_KEY_PROBLEM); | 140 | builder.put(SHADOWING_KEY, SHADOWING_KEY_PROBLEM); |
140 | var explicitImports = importCollector.getDirectImports(eObject.eResource()); | 141 | var explicitImports = importCollector.getDirectImports(eObject.eResource()); |
141 | var importsString = explicitImports.toList().stream() | 142 | var importsString = explicitImports.toList().stream() |
142 | .map(importEntry -> importEntry.uri().toString()) | 143 | .map(importEntry -> importEntry.uri().toString()) |
143 | .collect(Collectors.joining(IMPORTS_SEPARATOR)); | 144 | .collect(Collectors.joining(IMPORTS_SEPARATOR)); |
144 | builder.put(IMPORTS, importsString); | 145 | builder.put(IMPORTS, importsString); |
146 | builder.put(MODULE_KIND, problem.getKind().getName()); | ||
145 | } else if (eObject instanceof Node) { | 147 | } else if (eObject instanceof Node) { |
146 | builder.put(SHADOWING_KEY, SHADOWING_KEY_NODE); | 148 | builder.put(SHADOWING_KEY, SHADOWING_KEY_NODE); |
147 | } else if (eObject instanceof Relation relation) { | 149 | } else if (eObject instanceof Relation relation) { |