From 3aa2a60dc1ee912e3afa4aacfc7f18c4cbc1b62d Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 26 Oct 2015 21:59:13 +0300 Subject: [PATCH] Repl injects scope via own FileScopeProvider implementation instead of AdditionalScopes --- .../kotlin/cli/jvm/repl/ReplInterpreter.java | 27 +++++------- .../kotlin/cli/jvm/repl/di/injection.kt | 41 ++++++++++++++++--- .../kotlin/resolve/BindingContext.java | 3 +- .../expressions/ExpressionTypingServices.java | 3 +- 4 files changed, 47 insertions(+), 27 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java index fd9d4dbaa4e..4d4b10a2942 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java @@ -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 earlierLines = Lists.newArrayList(); private final List 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 getScopes() { - return lastLineScope != null - ? new SmartList(ScopeUtilsKt.memberScopeAsImportingScope(lastLineScope)) - : Collections.emptyList(); - } - }; - ContainerForReplWithJava container = InjectionKt.createContainerForReplWithJava( moduleContext, trace, scriptDeclarationFactory, ProjectScope.getAllScope(project), - scopeProvider, + new ReplLastLineScopeProvider() { + @Nullable + @Override + public LexicalScope getLastLineScope() { + return lastLineScope; + } + }, new JvmPackagePartProvider(environment) ); diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt index 06ccbe63c77..21f8bc5711c 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt @@ -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 +) : 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() useInstance(declarationProviderFactory) CompilerEnvironment.configure(this) - useImpl() useImpl() }.let { it.get().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 diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java index 387e4e65a12..ac39aaee6b7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java @@ -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.constants.CompileTimeConstant; 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.receivers.Qualifier; import org.jetbrains.kotlin.types.DeferredType; @@ -137,7 +136,7 @@ public interface BindingContext { WritableSlice LEXICAL_SCOPE = Slices.createSimpleSlice(); - WritableSlice SCRIPT_SCOPE = Slices.createSimpleSlice(); + WritableSlice SCRIPT_SCOPE = Slices.createSimpleSlice(); WritableSlice VARIABLE_REASSIGNMENT = Slices.createSimpleSetSlice(); WritableSlice AUTO_CREATED_IT = Slices.createSimpleSetSlice(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java index 717cd1dcc6f..4e8b21103ce 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java @@ -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.LexicalWritableScope; 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.KotlinType; import org.jetbrains.kotlin.types.expressions.typeInfoFactory.TypeInfoFactoryKt; @@ -185,7 +184,7 @@ public class ExpressionTypingServices { scope.changeLockLevel(WritableScope.LockLevel.READING); 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;