Repl injects scope via own FileScopeProvider implementation instead of AdditionalScopes
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user