aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language/src/main/java
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-02-11 22:08:00 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-02-11 22:08:00 +0100
commitfdfc79cb3cfcfb8405de8e1548d1b95a816f616a (patch)
tree41d6e249a576d34c22248c45ff101e73781b2bf1 /subprojects/language/src/main/java
parentrefactor(language): simplify default module kinds (diff)
downloadrefinery-fdfc79cb3cfcfb8405de8e1548d1b95a816f616a.tar.gz
refinery-fdfc79cb3cfcfb8405de8e1548d1b95a816f616a.tar.zst
refinery-fdfc79cb3cfcfb8405de8e1548d1b95a816f616a.zip
refactor(language): scope shadowing
Diffstat (limited to 'subprojects/language/src/main/java')
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java5
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java8
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/scoping/ShadowingKeyAwareSelectableBasedScope.java52
3 files changed, 58 insertions, 7 deletions
diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java
index dad4e5d0..65e80a7e 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java
@@ -15,10 +15,9 @@ import org.eclipse.xtext.resource.IEObjectDescription;
15import org.eclipse.xtext.resource.ISelectable; 15import org.eclipse.xtext.resource.ISelectable;
16import org.eclipse.xtext.scoping.IScope; 16import org.eclipse.xtext.scoping.IScope;
17import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeProvider; 17import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeProvider;
18import org.eclipse.xtext.scoping.impl.SelectableBasedScope;
19import org.eclipse.xtext.util.IResourceScopeCache; 18import org.eclipse.xtext.util.IResourceScopeCache;
20import tools.refinery.language.scoping.imports.ImportCollector;
21import tools.refinery.language.resource.LoadOnDemandResourceDescriptionProvider; 19import tools.refinery.language.resource.LoadOnDemandResourceDescriptionProvider;
20import tools.refinery.language.scoping.imports.ImportCollector;
22import tools.refinery.language.scoping.imports.NamedImport; 21import tools.refinery.language.scoping.imports.NamedImport;
23 22
24import java.util.ArrayList; 23import java.util.ArrayList;
@@ -81,7 +80,7 @@ public class ProblemGlobalScopeProvider extends AbstractGlobalScopeProvider {
81 protected IScope createScope(IScope parent, Collection<? extends ISelectable> children, EClass type, 80 protected IScope createScope(IScope parent, Collection<? extends ISelectable> children, EClass type,
82 Predicate<IEObjectDescription> filter, boolean ignoreCase) { 81 Predicate<IEObjectDescription> filter, boolean ignoreCase) {
83 var selectable = CompositeSelectable.of(children); 82 var selectable = CompositeSelectable.of(children);
84 return SelectableBasedScope.createScope(parent, selectable, filter, type, ignoreCase); 83 return ShadowingKeyAwareSelectableBasedScope.createScope(parent, selectable, filter, type, ignoreCase);
85 } 84 }
86 85
87 protected record LoadedImports(List<ISelectable> qualifiedImports, List<ISelectable> implicitImports, 86 protected record LoadedImports(List<ISelectable> qualifiedImports, List<ISelectable> implicitImports,
diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java
index 610efc03..1c0c1d86 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java
@@ -17,7 +17,6 @@ import org.eclipse.xtext.resource.IResourceDescriptionsProvider;
17import org.eclipse.xtext.resource.ISelectable; 17import org.eclipse.xtext.resource.ISelectable;
18import org.eclipse.xtext.scoping.IScope; 18import org.eclipse.xtext.scoping.IScope;
19import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider; 19import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider;
20import org.eclipse.xtext.scoping.impl.SelectableBasedScope;
21import org.eclipse.xtext.util.IResourceScopeCache; 20import org.eclipse.xtext.util.IResourceScopeCache;
22import tools.refinery.language.naming.ProblemQualifiedNameProvider; 21import tools.refinery.language.naming.ProblemQualifiedNameProvider;
23 22
@@ -47,12 +46,13 @@ public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScop
47 var globalScope = getGlobalScope(resource, reference); 46 var globalScope = getGlobalScope(resource, reference);
48 var type = reference.getEReferenceType(); 47 var type = reference.getEReferenceType();
49 boolean ignoreCase = isIgnoreCase(reference); 48 boolean ignoreCase = isIgnoreCase(reference);
50 var scope = SelectableBasedScope.createScope(globalScope, localImports.resourceDescription(), type, 49 var scope = ShadowingKeyAwareSelectableBasedScope.createScope(globalScope, localImports.resourceDescription(),
51 ignoreCase); 50 type, ignoreCase);
52 if (localImports.normalizedSelectable() == null) { 51 if (localImports.normalizedSelectable() == null) {
53 return scope; 52 return scope;
54 } 53 }
55 return SelectableBasedScope.createScope(scope, localImports.normalizedSelectable(), type, ignoreCase); 54 return ShadowingKeyAwareSelectableBasedScope.createScope(scope, localImports.normalizedSelectable(), type,
55 ignoreCase);
56 } 56 }
57 57
58 protected LocalImports computeLocalImports(Resource resource) { 58 protected LocalImports computeLocalImports(Resource resource) {
diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ShadowingKeyAwareSelectableBasedScope.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ShadowingKeyAwareSelectableBasedScope.java
new file mode 100644
index 00000000..cdef13ad
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ShadowingKeyAwareSelectableBasedScope.java
@@ -0,0 +1,52 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.scoping;
7
8import com.google.common.base.Predicate;
9import org.eclipse.emf.ecore.EClass;
10import org.eclipse.xtext.resource.IEObjectDescription;
11import org.eclipse.xtext.resource.ISelectable;
12import org.eclipse.xtext.scoping.IScope;
13import org.eclipse.xtext.scoping.impl.SelectableBasedScope;
14import tools.refinery.language.resource.ProblemResourceDescriptionStrategy;
15
16import java.util.Objects;
17
18public class ShadowingKeyAwareSelectableBasedScope extends SelectableBasedScope {
19 public static IScope createScope(IScope outer, ISelectable selectable, EClass type, boolean ignoreCase) {
20 return createScope(outer, selectable, null, type, ignoreCase);
21 }
22
23 // {@link com.google.common.base.Predicate} required by Xtext API.
24 @SuppressWarnings("squid:S4738")
25 public static IScope createScope(IScope outer, ISelectable selectable, Predicate<IEObjectDescription> filter,
26 EClass type, boolean ignoreCase) {
27 if (selectable == null || selectable.isEmpty())
28 return outer;
29 return new ShadowingKeyAwareSelectableBasedScope(outer, selectable, filter, type, ignoreCase);
30 }
31
32 // {@link com.google.common.base.Predicate} required by Xtext API.
33 @SuppressWarnings("squid:S4738")
34 protected ShadowingKeyAwareSelectableBasedScope(IScope outer, ISelectable selectable,
35 Predicate<IEObjectDescription> filter,
36 EClass type, boolean ignoreCase) {
37 super(outer, selectable, filter, type, ignoreCase);
38 }
39
40 @Override
41 protected boolean isShadowed(IEObjectDescription input) {
42 var shadowingKey = input.getUserData(ProblemResourceDescriptionStrategy.SHADOWING_KEY);
43 var localElements = getLocalElementsByName(input.getName());
44 for (var localElement : localElements) {
45 var localElementKey = localElement.getUserData(ProblemResourceDescriptionStrategy.SHADOWING_KEY);
46 if (Objects.equals(shadowingKey, localElementKey)) {
47 return true;
48 }
49 }
50 return false;
51 }
52}