aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java')
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java67
1 files changed, 44 insertions, 23 deletions
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 229960a0..0067bf94 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
@@ -1,47 +1,68 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.language.scoping; 6package tools.refinery.language.scoping;
7 7
8import java.util.List; 8import com.google.inject.Inject;
9 9import com.google.inject.name.Named;
10import org.eclipse.emf.ecore.EObject; 10import org.eclipse.emf.ecore.EObject;
11import org.eclipse.emf.ecore.EReference;
11import org.eclipse.emf.ecore.resource.Resource; 12import org.eclipse.emf.ecore.resource.Resource;
13import org.eclipse.xtext.naming.IQualifiedNameProvider;
12import org.eclipse.xtext.naming.QualifiedName; 14import org.eclipse.xtext.naming.QualifiedName;
13import org.eclipse.xtext.resource.IResourceDescriptions;
14import org.eclipse.xtext.resource.IResourceDescriptionsProvider; 15import org.eclipse.xtext.resource.IResourceDescriptionsProvider;
15import org.eclipse.xtext.resource.ISelectable; 16import org.eclipse.xtext.resource.ISelectable;
16import org.eclipse.xtext.scoping.impl.ImportNormalizer; 17import org.eclipse.xtext.scoping.IScope;
17import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider; 18import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider;
19import org.eclipse.xtext.util.IResourceScopeCache;
20import tools.refinery.language.naming.ProblemQualifiedNameProvider;
18 21
19import com.google.inject.Inject; 22public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScopeProvider {
23 private static final String CACHE_KEY = "tools.refinery.language.scoping.ProblemLocalScopeProvider.CACHE_KEY";
20 24
21import tools.refinery.language.utils.ProblemUtil; 25 @Inject
22 26 @Named(ProblemQualifiedNameProvider.NAMED_DELEGATE)
23public class ProblemLocalScopeProvider extends ImportedNamespaceAwareLocalScopeProvider { 27 private IQualifiedNameProvider delegateQualifiedNameProvider;
24 private static final QualifiedName BUILTIN_LIBRARY_QUALIFIED_NAME = QualifiedName
25 .create(ProblemUtil.BUILTIN_LIBRARY_NAME);
26 28
27 @Inject 29 @Inject
28 private IResourceDescriptionsProvider resourceDescriptionsProvider; 30 private IResourceDescriptionsProvider resourceDescriptionsProvider;
29 31
30 @Override 32 @Inject
31 protected List<ImportNormalizer> getImplicitImports(boolean ignoreCase) { 33 private IResourceScopeCache cache;
32 return List.of(doCreateImportNormalizer(BUILTIN_LIBRARY_QUALIFIED_NAME, true, ignoreCase));
33 }
34 34
35 @Override 35 @Override
36 protected List<ImportNormalizer> getImportedNamespaceResolvers(EObject context, boolean ignoreCase) { 36 public IScope getScope(EObject context, EReference reference) {
37 return List.of(); 37 var resource = context.eResource();
38 if (resource == null) {
39 return IScope.NULLSCOPE;
40 }
41 var globalScope = getGlobalScope(resource, reference);
42 var localImports = cache.get(CACHE_KEY, resource, () -> computeLocalImports(resource));
43 if (localImports == null) {
44 return globalScope;
45 }
46 var type = reference.getEReferenceType();
47 boolean ignoreCase = isIgnoreCase(reference);
48 return ShadowingKeyAwareSelectableBasedScope.createScope(globalScope, localImports, type, ignoreCase);
38 } 49 }
39 50
40 @Override 51 protected ISelectable computeLocalImports(Resource resource) {
41 protected ISelectable internalGetAllDescriptions(Resource resource) {
42 // Force the use of ProblemResourceDescriptionStrategy to include all QualifiedNames of objects. 52 // Force the use of ProblemResourceDescriptionStrategy to include all QualifiedNames of objects.
43 IResourceDescriptions resourceDescriptions = resourceDescriptionsProvider 53 var resourceDescriptions = resourceDescriptionsProvider.getResourceDescriptions(resource.getResourceSet());
44 .getResourceDescriptions(resource.getResourceSet()); 54 var resourceDescription = resourceDescriptions.getResourceDescription(resource.getURI());
45 return resourceDescriptions.getResourceDescription(resource.getURI()); 55 if (resourceDescription == null) {
56 return null;
57 }
58 var rootElement = resource.getContents().getFirst();
59 if (rootElement == null) {
60 return new NoFullyQualifiedNamesSelectable(resourceDescription);
61 }
62 var rootName = delegateQualifiedNameProvider.getFullyQualifiedName(rootElement);
63 if (rootName == null) {
64 return new NoFullyQualifiedNamesSelectable(resourceDescription);
65 }
66 return new NormalizedSelectable(resourceDescription, rootName, QualifiedName.EMPTY);
46 } 67 }
47} 68}