LTDA: Add addition scope provider component for lazy resolve and create additional injector for REPL

This commit is contained in:
Nikolay Krasko
2014-11-26 14:54:23 +03:00
committed by Nikolay Krasko
parent 4342740195
commit ce45108fe9
9 changed files with 529 additions and 71 deletions
@@ -48,6 +48,7 @@ import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.tasks.TaskPrioritizer;
import org.jetbrains.jet.lang.psi.JetImportsFactory;
import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider;
import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider.AdditionalFileScopeProvider;
import org.jetbrains.jet.lang.resolve.ScriptBodyResolver;
import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy;
@@ -88,6 +89,7 @@ public class InjectorForLazyResolve {
private final TaskPrioritizer taskPrioritizer;
private final JetImportsFactory jetImportsFactory;
private final ScopeProvider scopeProvider;
private final AdditionalFileScopeProvider additionalFileScopeProvider;
private final ScriptBodyResolver scriptBodyResolver;
public InjectorForLazyResolve(
@@ -130,6 +132,7 @@ public class InjectorForLazyResolve {
this.taskPrioritizer = new TaskPrioritizer(storageManager);
this.jetImportsFactory = new JetImportsFactory();
this.scopeProvider = new ScopeProvider(getResolveSession());
this.additionalFileScopeProvider = new AdditionalFileScopeProvider();
this.scriptBodyResolver = new ScriptBodyResolver();
this.resolveSession.setAnnotationResolve(annotationResolver);
@@ -192,6 +195,8 @@ public class InjectorForLazyResolve {
jetImportsFactory.setProject(project);
scopeProvider.setAdditionalFileScopesProvider(additionalFileScopeProvider);
scriptBodyResolver.setExpressionTypingServices(expressionTypingServices);
}
@@ -49,6 +49,7 @@ import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.tasks.TaskPrioritizer;
import org.jetbrains.jet.lang.psi.JetImportsFactory;
import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider;
import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider.AdditionalFileScopeProvider;
import org.jetbrains.jet.lang.resolve.ScriptBodyResolver;
import org.jetbrains.jet.lang.resolve.BodyResolver;
import org.jetbrains.jet.lang.resolve.ControlFlowAnalyzer;
@@ -103,6 +104,7 @@ public class InjectorForLazyTopDownAnalyzerBasic {
private final TaskPrioritizer taskPrioritizer;
private final JetImportsFactory jetImportsFactory;
private final ScopeProvider scopeProvider;
private final AdditionalFileScopeProvider additionalFileScopeProvider;
private final ScriptBodyResolver scriptBodyResolver;
private final BodyResolver bodyResolver;
private final ControlFlowAnalyzer controlFlowAnalyzer;
@@ -158,6 +160,7 @@ public class InjectorForLazyTopDownAnalyzerBasic {
this.taskPrioritizer = new TaskPrioritizer(storageManager);
this.jetImportsFactory = new JetImportsFactory();
this.scopeProvider = new ScopeProvider(getResolveSession());
this.additionalFileScopeProvider = new AdditionalFileScopeProvider();
this.scriptBodyResolver = new ScriptBodyResolver();
this.bodyResolver = new BodyResolver();
this.controlFlowAnalyzer = new ControlFlowAnalyzer();
@@ -242,6 +245,8 @@ public class InjectorForLazyTopDownAnalyzerBasic {
jetImportsFactory.setProject(project);
scopeProvider.setAdditionalFileScopesProvider(additionalFileScopeProvider);
scriptBodyResolver.setExpressionTypingServices(expressionTypingServices);
bodyResolver.setAnnotationResolver(annotationResolver);
@@ -30,21 +30,36 @@ import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.scopes.ChainedScope;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.storage.LockBasedStorageManager;
import org.jetbrains.jet.storage.MemoizedFunctionToNotNull;
import org.jetbrains.jet.storage.NotNullLazyValue;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class ScopeProvider {
public static class AdditionalFileScopeProvider {
@NotNull
public List<JetScope> scopes(@NotNull JetFile file) {
return Collections.emptyList();
}
}
private final ResolveSession resolveSession;
private final MemoizedFunctionToNotNull<JetFile, LazyImportScope> explicitImportScopes;
private final NotNullLazyValue<JetScope> defaultImportsScope;
private Function1<JetFile, JetScope> additionalScopesProvider;
@SuppressWarnings("ConstantConditions") @NotNull
private AdditionalFileScopeProvider additionalFileScopeProvider = null;
@Inject
public void setAdditionalFileScopesProvider(@NotNull AdditionalFileScopeProvider additionalFileScopeProvider) {
this.additionalFileScopeProvider = additionalFileScopeProvider;
}
public ScopeProvider(@NotNull ResolveSession resolveSession) {
this.resolveSession = resolveSession;
@@ -85,23 +100,12 @@ public class ScopeProvider {
list.add(getFilePackageDescriptor(file).getMemberScope());
list.add(JetModuleUtil.getSubpackagesOfRootScope(resolveSession.getModuleDescriptor()));
list.add(explicitImportScopes.invoke(file));
if (additionalScopesProvider != null) {
JetScope additionalScope = additionalScopesProvider.invoke(file);
if (additionalScope != null) {
list.add(additionalScope);
}
}
list.addAll(additionalFileScopeProvider.scopes(file));
list.add(defaultImportsScope.invoke());
return list.toArray(new JetScope[list.size()]);
}
public void setAdditionalFileScopesProvider(@NotNull Function1<JetFile, JetScope> scopeProvider) {
this.additionalScopesProvider = scopeProvider;
}
@NotNull
public LazyImportScope getExplicitImportsScopeForFile(@NotNull JetFile file) {
return explicitImportScopes.invoke(file);