Repl injects scope via own FileScopeProvider implementation instead of AdditionalScopes

This commit is contained in:
Valentin Kipyatkov
2015-10-26 21:59:13 +03:00
parent 47f938d7fc
commit 3aa2a60dc1
4 changed files with 47 additions and 27 deletions
@@ -27,7 +27,6 @@ import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.impl.PsiFileFactoryImpl;
import com.intellij.psi.search.ProjectScope;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.backend.common.output.OutputFile;
@@ -42,6 +41,7 @@ import org.jetbrains.kotlin.cli.jvm.config.JvmContentRootsKt;
import org.jetbrains.kotlin.cli.jvm.config.ModuleNameKt;
import org.jetbrains.kotlin.cli.jvm.repl.di.ContainerForReplWithJava;
import org.jetbrains.kotlin.cli.jvm.repl.di.InjectionKt;
import org.jetbrains.kotlin.cli.jvm.repl.di.ReplLastLineScopeProvider;
import org.jetbrains.kotlin.cli.jvm.repl.messages.DiagnosticMessageHolder;
import org.jetbrains.kotlin.cli.jvm.repl.messages.ReplIdeDiagnosticMessageHolder;
import org.jetbrains.kotlin.cli.jvm.repl.messages.ReplSystemInWrapper;
@@ -64,13 +64,10 @@ import org.jetbrains.kotlin.resolve.*;
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
import org.jetbrains.kotlin.resolve.jvm.JvmClassName;
import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM;
import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider;
import org.jetbrains.kotlin.resolve.lazy.ResolveSession;
import org.jetbrains.kotlin.resolve.lazy.data.JetClassLikeInfo;
import org.jetbrains.kotlin.resolve.lazy.declarations.*;
import org.jetbrains.kotlin.resolve.scopes.ImportingScope;
import org.jetbrains.kotlin.resolve.scopes.KtScope;
import org.jetbrains.kotlin.resolve.scopes.utils.ScopeUtilsKt;
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
import org.jetbrains.org.objectweb.asm.Type;
@@ -95,7 +92,7 @@ public class ReplInterpreter {
private int lineNumber = 0;
@Nullable
private KtScope lastLineScope;
private LexicalScope lastLineScope;
private final List<EarlierLine> earlierLines = Lists.newArrayList();
private final List<String> previousIncompleteLines = Lists.newArrayList();
private final ReplClassLoader classLoader;
@@ -129,22 +126,18 @@ public class ReplInterpreter {
scriptDeclarationFactory = new ScriptMutableDeclarationProviderFactory();
FileScopeProvider.AdditionalScopes scopeProvider = new FileScopeProvider.AdditionalScopes() {
@NotNull
@Override
public List<ImportingScope> getScopes() {
return lastLineScope != null
? new SmartList<ImportingScope>(ScopeUtilsKt.memberScopeAsImportingScope(lastLineScope))
: Collections.<ImportingScope>emptyList();
}
};
ContainerForReplWithJava container = InjectionKt.createContainerForReplWithJava(
moduleContext,
trace,
scriptDeclarationFactory,
ProjectScope.getAllScope(project),
scopeProvider,
new ReplLastLineScopeProvider() {
@Nullable
@Override
public LexicalScope getLastLineScope() {
return lastLineScope;
}
},
new JvmPackagePartProvider(environment)
);
@@ -19,38 +19,67 @@ package org.jetbrains.kotlin.cli.jvm.repl.di
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.container.*
import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.frontend.java.di.configureJavaTopDownAnalysis
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl
import org.jetbrains.kotlin.load.java.lazy.SingleModuleClassResolver
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtImportsFactory
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzerForTopLevel
import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver
import org.jetbrains.kotlin.resolve.jvm.JavaClassFinderPostConstruct
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider
import org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
import org.jetbrains.kotlin.resolve.lazy.TopLevelDescriptorProvider
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.storage.StorageManager
public fun createContainerForReplWithJava(
moduleContext: ModuleContext, bindingTrace: BindingTrace, declarationProviderFactory: DeclarationProviderFactory,
moduleContentScope: GlobalSearchScope, additionalFileScopeProvider: FileScopeProvider.AdditionalScopes,
interface ReplLastLineScopeProvider {
val lastLineScope: LexicalScope?
}
class ReplFileScopeProvider(
private val lastLineScopeProvider: ReplLastLineScopeProvider,
topLevelDescriptorProvider: TopLevelDescriptorProvider,
storageManager: StorageManager,
moduleDescriptor: ModuleDescriptor,
qualifiedExpressionResolver: QualifiedExpressionResolver,
bindingTrace: BindingTrace,
ktImportsFactory: KtImportsFactory,
additionalScopes: Iterable<FileScopeProvider.AdditionalScopes>
) : FileScopeProviderImpl(topLevelDescriptorProvider, storageManager, moduleDescriptor, qualifiedExpressionResolver, bindingTrace, ktImportsFactory, additionalScopes) {
override fun getFileResolutionScope(file: KtFile): LexicalScope
= lastLineScopeProvider.lastLineScope ?: super.getFileResolutionScope(file)
}
fun createContainerForReplWithJava(
moduleContext: ModuleContext,
bindingTrace: BindingTrace,
declarationProviderFactory: DeclarationProviderFactory,
moduleContentScope: GlobalSearchScope,
lastLineScopeProvider: ReplLastLineScopeProvider,
packagePartProvider: PackagePartProvider
): ContainerForReplWithJava = createContainer("ReplWithJava") {
useInstance(packagePartProvider)
configureModule(moduleContext, JvmPlatform, bindingTrace)
configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, LookupTracker.DO_NOTHING)
useInstance(additionalFileScopeProvider)
useInstance(lastLineScopeProvider)
useImpl<ReplFileScopeProvider>()
useInstance(declarationProviderFactory)
CompilerEnvironment.configure(this)
useImpl<FileScopeProviderImpl>()
useImpl<SingleModuleClassResolver>()
}.let {
it.get<JavaClassFinderImpl>().initialize()
@@ -58,7 +87,7 @@ public fun createContainerForReplWithJava(
ContainerForReplWithJava(it)
}
public class ContainerForReplWithJava(container: StorageComponentContainer) {
class ContainerForReplWithJava(container: StorageComponentContainer) {
val resolveSession: ResolveSession by container
val lazyTopDownAnalyzerForTopLevel: LazyTopDownAnalyzerForTopLevel by container
val javaDescriptorResolver: JavaDescriptorResolver by container