aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java
diff options
context:
space:
mode:
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.java86
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 */
6package tools.refinery.language.scoping; 6package tools.refinery.language.scoping;
7 7
8import java.util.LinkedHashSet; 8import com.google.common.base.Predicate;
9 9import com.google.inject.Inject;
10import org.eclipse.emf.common.util.URI; 10import com.google.inject.Provider;
11import org.eclipse.emf.ecore.EClass;
11import org.eclipse.emf.ecore.resource.Resource; 12import org.eclipse.emf.ecore.resource.Resource;
12import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider; 13import org.eclipse.xtext.naming.QualifiedName;
14import org.eclipse.xtext.resource.IEObjectDescription;
15import org.eclipse.xtext.resource.ISelectable;
16import org.eclipse.xtext.scoping.IScope;
17import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeProvider;
18import org.eclipse.xtext.util.IResourceScopeCache;
19import tools.refinery.language.resource.LoadOnDemandResourceDescriptionProvider;
20import tools.refinery.language.scoping.imports.ImportCollector;
21import tools.refinery.language.scoping.imports.NamedImport;
22
23import java.util.ArrayList;
24import java.util.Collection;
25import java.util.List;
26
27public class ProblemGlobalScopeProvider extends AbstractGlobalScopeProvider {
28 private static final String CACHE_KEY = "tools.refinery.language.scoping.ProblemGlobalScopeProvider.CACHE_KEY";
13 29
14import tools.refinery.language.utils.ProblemUtil; 30 @Inject
31 private ImportCollector importCollector;
15 32
16public 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}