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.impl.PsiFileFactoryImpl;
|
||||||
import com.intellij.psi.search.ProjectScope;
|
import com.intellij.psi.search.ProjectScope;
|
||||||
import com.intellij.testFramework.LightVirtualFile;
|
import com.intellij.testFramework.LightVirtualFile;
|
||||||
import com.intellij.util.SmartList;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.backend.common.output.OutputFile;
|
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.config.ModuleNameKt;
|
||||||
import org.jetbrains.kotlin.cli.jvm.repl.di.ContainerForReplWithJava;
|
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.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.DiagnosticMessageHolder;
|
||||||
import org.jetbrains.kotlin.cli.jvm.repl.messages.ReplIdeDiagnosticMessageHolder;
|
import org.jetbrains.kotlin.cli.jvm.repl.messages.ReplIdeDiagnosticMessageHolder;
|
||||||
import org.jetbrains.kotlin.cli.jvm.repl.messages.ReplSystemInWrapper;
|
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.calls.smartcasts.DataFlowInfo;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName;
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM;
|
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.ResolveSession;
|
||||||
import org.jetbrains.kotlin.resolve.lazy.data.JetClassLikeInfo;
|
import org.jetbrains.kotlin.resolve.lazy.data.JetClassLikeInfo;
|
||||||
import org.jetbrains.kotlin.resolve.lazy.declarations.*;
|
import org.jetbrains.kotlin.resolve.lazy.declarations.*;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.ImportingScope;
|
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.KtScope;
|
|
||||||
import org.jetbrains.kotlin.resolve.scopes.utils.ScopeUtilsKt;
|
|
||||||
import org.jetbrains.kotlin.types.KotlinType;
|
import org.jetbrains.kotlin.types.KotlinType;
|
||||||
import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
|
import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
|
||||||
import org.jetbrains.org.objectweb.asm.Type;
|
import org.jetbrains.org.objectweb.asm.Type;
|
||||||
@@ -95,7 +92,7 @@ public class ReplInterpreter {
|
|||||||
private int lineNumber = 0;
|
private int lineNumber = 0;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private KtScope lastLineScope;
|
private LexicalScope lastLineScope;
|
||||||
private final List<EarlierLine> earlierLines = Lists.newArrayList();
|
private final List<EarlierLine> earlierLines = Lists.newArrayList();
|
||||||
private final List<String> previousIncompleteLines = Lists.newArrayList();
|
private final List<String> previousIncompleteLines = Lists.newArrayList();
|
||||||
private final ReplClassLoader classLoader;
|
private final ReplClassLoader classLoader;
|
||||||
@@ -129,22 +126,18 @@ public class ReplInterpreter {
|
|||||||
|
|
||||||
scriptDeclarationFactory = new ScriptMutableDeclarationProviderFactory();
|
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(
|
ContainerForReplWithJava container = InjectionKt.createContainerForReplWithJava(
|
||||||
moduleContext,
|
moduleContext,
|
||||||
trace,
|
trace,
|
||||||
scriptDeclarationFactory,
|
scriptDeclarationFactory,
|
||||||
ProjectScope.getAllScope(project),
|
ProjectScope.getAllScope(project),
|
||||||
scopeProvider,
|
new ReplLastLineScopeProvider() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public LexicalScope getLastLineScope() {
|
||||||
|
return lastLineScope;
|
||||||
|
}
|
||||||
|
},
|
||||||
new JvmPackagePartProvider(environment)
|
new JvmPackagePartProvider(environment)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -19,38 +19,67 @@ package org.jetbrains.kotlin.cli.jvm.repl.di
|
|||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.container.*
|
import org.jetbrains.kotlin.container.*
|
||||||
import org.jetbrains.kotlin.context.ModuleContext
|
import org.jetbrains.kotlin.context.ModuleContext
|
||||||
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PackagePartProvider
|
import org.jetbrains.kotlin.descriptors.PackagePartProvider
|
||||||
import org.jetbrains.kotlin.frontend.di.configureModule
|
import org.jetbrains.kotlin.frontend.di.configureModule
|
||||||
import org.jetbrains.kotlin.frontend.java.di.configureJavaTopDownAnalysis
|
import org.jetbrains.kotlin.frontend.java.di.configureJavaTopDownAnalysis
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||||
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl
|
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl
|
||||||
import org.jetbrains.kotlin.load.java.lazy.SingleModuleClassResolver
|
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.BindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.CompilerEnvironment
|
import org.jetbrains.kotlin.resolve.CompilerEnvironment
|
||||||
import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzerForTopLevel
|
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.JavaClassFinderPostConstruct
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver
|
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver
|
||||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||||
import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider
|
import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider
|
||||||
import org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl
|
import org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl
|
||||||
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
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.lazy.declarations.DeclarationProviderFactory
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
|
||||||
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
|
|
||||||
public fun createContainerForReplWithJava(
|
interface ReplLastLineScopeProvider {
|
||||||
moduleContext: ModuleContext, bindingTrace: BindingTrace, declarationProviderFactory: DeclarationProviderFactory,
|
val lastLineScope: LexicalScope?
|
||||||
moduleContentScope: GlobalSearchScope, additionalFileScopeProvider: FileScopeProvider.AdditionalScopes,
|
}
|
||||||
|
|
||||||
|
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
|
packagePartProvider: PackagePartProvider
|
||||||
): ContainerForReplWithJava = createContainer("ReplWithJava") {
|
): ContainerForReplWithJava = createContainer("ReplWithJava") {
|
||||||
useInstance(packagePartProvider)
|
useInstance(packagePartProvider)
|
||||||
configureModule(moduleContext, JvmPlatform, bindingTrace)
|
configureModule(moduleContext, JvmPlatform, bindingTrace)
|
||||||
configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, LookupTracker.DO_NOTHING)
|
configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, LookupTracker.DO_NOTHING)
|
||||||
|
|
||||||
useInstance(additionalFileScopeProvider)
|
useInstance(lastLineScopeProvider)
|
||||||
|
useImpl<ReplFileScopeProvider>()
|
||||||
useInstance(declarationProviderFactory)
|
useInstance(declarationProviderFactory)
|
||||||
|
|
||||||
CompilerEnvironment.configure(this)
|
CompilerEnvironment.configure(this)
|
||||||
|
|
||||||
useImpl<FileScopeProviderImpl>()
|
|
||||||
useImpl<SingleModuleClassResolver>()
|
useImpl<SingleModuleClassResolver>()
|
||||||
}.let {
|
}.let {
|
||||||
it.get<JavaClassFinderImpl>().initialize()
|
it.get<JavaClassFinderImpl>().initialize()
|
||||||
@@ -58,7 +87,7 @@ public fun createContainerForReplWithJava(
|
|||||||
ContainerForReplWithJava(it)
|
ContainerForReplWithJava(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ContainerForReplWithJava(container: StorageComponentContainer) {
|
class ContainerForReplWithJava(container: StorageComponentContainer) {
|
||||||
val resolveSession: ResolveSession by container
|
val resolveSession: ResolveSession by container
|
||||||
val lazyTopDownAnalyzerForTopLevel: LazyTopDownAnalyzerForTopLevel by container
|
val lazyTopDownAnalyzerForTopLevel: LazyTopDownAnalyzerForTopLevel by container
|
||||||
val javaDescriptorResolver: JavaDescriptorResolver by container
|
val javaDescriptorResolver: JavaDescriptorResolver by container
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
|||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
||||||
import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant;
|
import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant;
|
||||||
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics;
|
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.KtScope;
|
|
||||||
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
|
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.Qualifier;
|
import org.jetbrains.kotlin.resolve.scopes.receivers.Qualifier;
|
||||||
import org.jetbrains.kotlin.types.DeferredType;
|
import org.jetbrains.kotlin.types.DeferredType;
|
||||||
@@ -137,7 +136,7 @@ public interface BindingContext {
|
|||||||
|
|
||||||
WritableSlice<KtElement, LexicalScope> LEXICAL_SCOPE = Slices.createSimpleSlice();
|
WritableSlice<KtElement, LexicalScope> LEXICAL_SCOPE = Slices.createSimpleSlice();
|
||||||
|
|
||||||
WritableSlice<ScriptDescriptor, KtScope> SCRIPT_SCOPE = Slices.createSimpleSlice();
|
WritableSlice<ScriptDescriptor, LexicalScope> SCRIPT_SCOPE = Slices.createSimpleSlice();
|
||||||
|
|
||||||
WritableSlice<KtExpression, Boolean> VARIABLE_REASSIGNMENT = Slices.createSimpleSetSlice();
|
WritableSlice<KtExpression, Boolean> VARIABLE_REASSIGNMENT = Slices.createSimpleSetSlice();
|
||||||
WritableSlice<ValueParameterDescriptor, Boolean> AUTO_CREATED_IT = Slices.createSimpleSetSlice();
|
WritableSlice<ValueParameterDescriptor, Boolean> AUTO_CREATED_IT = Slices.createSimpleSetSlice();
|
||||||
|
|||||||
+1
-2
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
|||||||
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
|
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope;
|
import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.WritableScope;
|
import org.jetbrains.kotlin.resolve.scopes.WritableScope;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.utils.ScopeUtilsKt;
|
|
||||||
import org.jetbrains.kotlin.types.ErrorUtils;
|
import org.jetbrains.kotlin.types.ErrorUtils;
|
||||||
import org.jetbrains.kotlin.types.KotlinType;
|
import org.jetbrains.kotlin.types.KotlinType;
|
||||||
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.TypeInfoFactoryKt;
|
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.TypeInfoFactoryKt;
|
||||||
@@ -185,7 +184,7 @@ public class ExpressionTypingServices {
|
|||||||
scope.changeLockLevel(WritableScope.LockLevel.READING);
|
scope.changeLockLevel(WritableScope.LockLevel.READING);
|
||||||
|
|
||||||
if (containingDescriptor instanceof ScriptDescriptor) {
|
if (containingDescriptor instanceof ScriptDescriptor) {
|
||||||
context.trace.record(BindingContext.SCRIPT_SCOPE, (ScriptDescriptor) containingDescriptor, ScopeUtilsKt.asKtScope(scope));
|
context.trace.record(BindingContext.SCRIPT_SCOPE, (ScriptDescriptor) containingDescriptor, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
|
|||||||
Reference in New Issue
Block a user