diff options
Diffstat (limited to 'subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java')
-rw-r--r-- | subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java | 86 |
1 files changed, 76 insertions, 10 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 4d2dd772..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 | |||
@@ -5,19 +5,85 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.language.scoping; | 6 | package tools.refinery.language.scoping; |
7 | 7 | ||
8 | import java.util.LinkedHashSet; | 8 | import com.google.common.base.Predicate; |
9 | 9 | import com.google.inject.Inject; | |
10 | import org.eclipse.emf.common.util.URI; | 10 | import com.google.inject.Provider; |
11 | import org.eclipse.emf.ecore.EClass; | ||
11 | import org.eclipse.emf.ecore.resource.Resource; | 12 | import org.eclipse.emf.ecore.resource.Resource; |
12 | import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider; | 13 | import org.eclipse.xtext.naming.QualifiedName; |
14 | import org.eclipse.xtext.resource.IEObjectDescription; | ||
15 | import org.eclipse.xtext.resource.ISelectable; | ||
16 | import org.eclipse.xtext.scoping.IScope; | ||
17 | import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeProvider; | ||
18 | import org.eclipse.xtext.util.IResourceScopeCache; | ||
19 | import tools.refinery.language.resource.LoadOnDemandResourceDescriptionProvider; | ||
20 | import tools.refinery.language.scoping.imports.ImportCollector; | ||
21 | import tools.refinery.language.scoping.imports.NamedImport; | ||
22 | |||
23 | import java.util.ArrayList; | ||
24 | import java.util.Collection; | ||
25 | import java.util.List; | ||
26 | |||
27 | public class ProblemGlobalScopeProvider extends AbstractGlobalScopeProvider { | ||
28 | private static final String CACHE_KEY = "tools.refinery.language.scoping.ProblemGlobalScopeProvider.CACHE_KEY"; | ||
13 | 29 | ||
14 | import tools.refinery.language.utils.ProblemUtil; | 30 | @Inject |
31 | private ImportCollector importCollector; | ||
15 | 32 | ||
16 | public class ProblemGlobalScopeProvider extends ImportUriGlobalScopeProvider { | 33 | @Inject |
34 | private Provider<LoadOnDemandResourceDescriptionProvider> loadOnDemandProvider; | ||
35 | |||
36 | @Inject | ||
37 | private IResourceScopeCache cache; | ||
38 | |||
39 | // {@link com.google.common.base.Predicate} required by Xtext API. | ||
40 | @SuppressWarnings("squid:S4738") | ||
17 | @Override | 41 | @Override |
18 | protected LinkedHashSet<URI> getImportedUris(Resource resource) { | 42 | protected IScope getScope(Resource resource, boolean ignoreCase, EClass type, |
19 | LinkedHashSet<URI> importedUris = new LinkedHashSet<>(); | 43 | Predicate<IEObjectDescription> filter) { |
20 | importedUris.add(ProblemUtil.BUILTIN_LIBRARY_URI); | 44 | var loadedImports = cache.get(CACHE_KEY, resource, () -> computeLoadedImports(resource)); |
21 | return importedUris; | 45 | var qualifiedScope = createScope(IScope.NULLSCOPE, loadedImports.qualifiedImports(), type, filter, ignoreCase); |
46 | var implicitScope = createScope(qualifiedScope, loadedImports.implicitImports(), type, filter, ignoreCase); | ||
47 | return createScope(implicitScope, loadedImports.explicitImports(), type, filter, ignoreCase); | ||
48 | } | ||
49 | |||
50 | protected LoadedImports computeLoadedImports(Resource resource) { | ||
51 | var imports = importCollector.getAllImports(resource); | ||
52 | var loadOnDemand = loadOnDemandProvider.get(); | ||
53 | loadOnDemand.setContext(resource); | ||
54 | var qualifiedImports = new ArrayList<ISelectable>(); | ||
55 | var implicitImports = new ArrayList<ISelectable>(); | ||
56 | var explicitImports = new ArrayList<ISelectable>(); | ||
57 | for (var importEntry : imports.toList()) { | ||
58 | var uri = importEntry.uri(); | ||
59 | var resourceDescription = loadOnDemand.getResourceDescription(uri); | ||
60 | if (resourceDescription == null) { | ||
61 | continue; | ||
62 | } | ||
63 | qualifiedImports.add(resourceDescription); | ||
64 | if (importEntry instanceof NamedImport namedImport) { | ||
65 | var qualifiedName = namedImport.qualifiedName(); | ||
66 | if (namedImport.alsoImplicit()) { | ||
67 | implicitImports.add(new NormalizedSelectable(resourceDescription, qualifiedName, | ||
68 | QualifiedName.EMPTY)); | ||
69 | } | ||
70 | for (var alias : namedImport.aliases()) { | ||
71 | explicitImports.add(new NormalizedSelectable(resourceDescription, qualifiedName, alias)); | ||
72 | } | ||
73 | } | ||
74 | } | ||
75 | return new LoadedImports(qualifiedImports, implicitImports, explicitImports); | ||
76 | } | ||
77 | |||
78 | // {@link com.google.common.base.Predicate} required by Xtext API. | ||
79 | @SuppressWarnings("squid:S4738") | ||
80 | protected IScope createScope(IScope parent, Collection<? extends ISelectable> children, EClass type, | ||
81 | Predicate<IEObjectDescription> filter, boolean ignoreCase) { | ||
82 | var selectable = CompositeSelectable.of(children); | ||
83 | return ShadowingKeyAwareSelectableBasedScope.createScope(parent, selectable, filter, type, ignoreCase); | ||
84 | } | ||
85 | |||
86 | protected record LoadedImports(List<ISelectable> qualifiedImports, List<ISelectable> implicitImports, | ||
87 | List<ISelectable> explicitImports) { | ||
22 | } | 88 | } |
23 | } | 89 | } |