diff options
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.java | 67 |
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 | */ |
6 | package tools.refinery.language.scoping; | 6 | package tools.refinery.language.scoping; |
7 | 7 | ||
8 | import java.util.List; | 8 | import com.google.inject.Inject; |
9 | 9 | import com.google.inject.name.Named; | |
10 | import org.eclipse.emf.ecore.EObject; | 10 | import org.eclipse.emf.ecore.EObject; |
11 | import org.eclipse.emf.ecore.EReference; | ||
11 | import org.eclipse.emf.ecore.resource.Resource; | 12 | import org.eclipse.emf.ecore.resource.Resource; |
13 | import org.eclipse.xtext.naming.IQualifiedNameProvider; | ||
12 | import org.eclipse.xtext.naming.QualifiedName; | 14 | import org.eclipse.xtext.naming.QualifiedName; |
13 | import org.eclipse.xtext.resource.IResourceDescriptions; | ||
14 | import org.eclipse.xtext.resource.IResourceDescriptionsProvider; | 15 | import org.eclipse.xtext.resource.IResourceDescriptionsProvider; |
15 | import org.eclipse.xtext.resource.ISelectable; | 16 | import org.eclipse.xtext.resource.ISelectable; |
16 | import org.eclipse.xtext.scoping.impl.ImportNormalizer; | 17 | import org.eclipse.xtext.scoping.IScope; |
17 | import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider; | 18 | import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider; |
19 | import org.eclipse.xtext.util.IResourceScopeCache; | ||
20 | import tools.refinery.language.naming.ProblemQualifiedNameProvider; | ||
18 | 21 | ||
19 | import com.google.inject.Inject; | 22 | public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScopeProvider { |
23 | private static final String CACHE_KEY = "tools.refinery.language.scoping.ProblemLocalScopeProvider.CACHE_KEY"; | ||
20 | 24 | ||
21 | import tools.refinery.language.utils.ProblemUtil; | 25 | @Inject |
22 | 26 | @Named(ProblemQualifiedNameProvider.NAMED_DELEGATE) | |
23 | public 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 | } |