diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericReplCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericReplCompiler.kt index 70199072f78..ebd5b5e824b 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericReplCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericReplCompiler.kt @@ -27,8 +27,8 @@ import org.jetbrains.kotlin.codegen.CompilationErrorHandler import org.jetbrains.kotlin.codegen.KotlinCodegenFacade import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.renderer.DescriptorRenderer -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.ScriptDependenciesProvider import java.io.File @@ -88,7 +88,7 @@ open class GenericReplCompiler( else -> error("Unexpected result ${analysisResult::class.java}") } - val type = (scriptDescriptor as LazyScriptDescriptor).resultValue?.returnType + val type = (scriptDescriptor as ScriptDescriptor).resultValue?.returnType val generationState = GenerationState.Builder( psiFile.project, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt index 8dfaa0ebf87..78169c3b760 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt @@ -33,7 +33,6 @@ import org.jetbrains.kotlin.resolve.checkers.checkClassifierUsages import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.lazy.* import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor import java.util.* class LazyTopDownAnalyzer( @@ -87,7 +86,7 @@ class LazyTopDownAnalyzer( override fun visitScript(script: KtScript) { c.scripts.put( script, - lazyDeclarationResolver.getScriptDescriptor(script, KotlinLookupLocation(script)) as LazyScriptDescriptor + lazyDeclarationResolver.getScriptDescriptor(script, KotlinLookupLocation(script)) ) registerDeclarations(script.declarations) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DeclarationScopeProviderImpl.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DeclarationScopeProviderImpl.java index f84a21f0283..44a21d03270 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DeclarationScopeProviderImpl.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DeclarationScopeProviderImpl.java @@ -18,13 +18,13 @@ package org.jetbrains.kotlin.resolve.lazy; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfoFactory; import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor; -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor; import org.jetbrains.kotlin.resolve.scopes.LexicalScope; public class DeclarationScopeProviderImpl implements DeclarationScopeProvider { @@ -81,7 +81,8 @@ public class DeclarationScopeProviderImpl implements DeclarationScopeProvider { } //TODO: this is not how it works for classes and for exact parity we can try to use the code above if (parentDeclaration instanceof KtScript) { - LazyScriptDescriptor scriptDescriptor = (LazyScriptDescriptor) lazyDeclarationResolver.resolveToDescriptor(parentDeclaration); + ClassDescriptorWithResolutionScopes + scriptDescriptor = (ClassDescriptorWithResolutionScopes) lazyDeclarationResolver.resolveToDescriptor(parentDeclaration); return scriptDescriptor.getScopeForInitializerResolution(); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt index faca9c0547e..65bf185e7e7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt @@ -73,9 +73,7 @@ class LazyScriptDescriptor( resolveSession.trace.record(BindingContext.SCRIPT, scriptInfo.script, this) } - val resultValue: ReplResultPropertyDescriptor? by lazy { provideResultValue() } - - private fun provideResultValue(): ReplResultPropertyDescriptor? { + override fun getResultValue(): ReplResultPropertyDescriptor? { val expression = scriptInfo.script .getChildOfType() ?.getChildrenOfType()?.lastOrNull() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/script/ReplResultPropertyDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/script/ReplResultPropertyDescriptor.kt index b258629d887..7bfdc9dbdde 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/script/ReplResultPropertyDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/script/ReplResultPropertyDescriptor.kt @@ -9,14 +9,13 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor import org.jetbrains.kotlin.types.KotlinType class ReplResultPropertyDescriptor( name: Name, kotlinType: KotlinType, receiver: ReceiverParameterDescriptor?, - script: LazyScriptDescriptor, + script: ScriptDescriptor, source: SourceElement ) : PropertyDescriptorImpl( script, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/script/ScriptProvidedPropertyDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/script/ScriptProvidedPropertyDescriptor.kt index 648f2650d33..3b079d1d1db 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/script/ScriptProvidedPropertyDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/script/ScriptProvidedPropertyDescriptor.kt @@ -12,14 +12,13 @@ import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor class ScriptProvidedPropertyDescriptor( name: Name, typeDescriptor: ClassDescriptor, receiver: ReceiverParameterDescriptor?, isVar: Boolean, - script: LazyScriptDescriptor + script: ScriptDescriptor ) : PropertyDescriptorImpl( script, null, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/repl/ReplState.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/repl/ReplState.kt index fc6b2315b03..1297ad2da1c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/repl/ReplState.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/repl/ReplState.kt @@ -16,11 +16,12 @@ package org.jetbrains.kotlin.resolve.repl +import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes +import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.lazy.FileScopeFactory import org.jetbrains.kotlin.resolve.lazy.FileScopes import org.jetbrains.kotlin.resolve.lazy.FileScopesCustomizer -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor import org.jetbrains.kotlin.resolve.lazy.fileScopesCustomizer import org.jetbrains.kotlin.resolve.scopes.ImportingScope import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf @@ -44,7 +45,7 @@ class ReplState { } } - fun lineSuccess(ktFile: KtFile, scriptDescriptor: LazyScriptDescriptor) { + fun lineSuccess(ktFile: KtFile, scriptDescriptor: ScriptDescriptor) { val successfulLine = LineInfo.SuccessfulLine(ktFile, successfulLines.lastOrNull(), scriptDescriptor) lines[ktFile] = successfulLine successfulLines.add(successfulLine) @@ -65,7 +66,7 @@ class ReplState { class SuccessfulLine( override val linePsi: KtFile, override val parentLine: SuccessfulLine?, - val lineDescriptor: LazyScriptDescriptor + val lineDescriptor: ScriptDescriptor ) : LineInfo() class FailedLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?) : LineInfo() @@ -73,7 +74,8 @@ class ReplState { private fun computeFileScopes(lineInfo: LineInfo, fileScopeFactory: FileScopeFactory): FileScopes? { // create scope that wraps previous line lexical scope and adds imports from this line - val lexicalScopeAfterLastLine = lineInfo.parentLine?.lineDescriptor?.scopeForInitializerResolution ?: return null + val lexicalScopeAfterLastLine = + (lineInfo.parentLine?.lineDescriptor as? ClassDescriptorWithResolutionScopes)?.scopeForInitializerResolution ?: return null val lastLineImports = lexicalScopeAfterLastLine.parentsWithSelf.firstIsInstance() val scopesForThisLine = fileScopeFactory.createScopesForFile(lineInfo.linePsi, lastLineImports) val combinedLexicalScopes = lexicalScopeAfterLastLine.replaceImportingScopes(scopesForThisLine.importingScope) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ScriptDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ScriptDescriptor.java index 570c2a262f5..bd1cbdca035 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ScriptDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ScriptDescriptor.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.descriptors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -32,4 +33,7 @@ public interface ScriptDescriptor extends ClassDescriptor { @NotNull List getScriptProvidedProperties(); + + @Nullable + PropertyDescriptor getResultValue(); } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt index 53c7c481aa4..6a372b5ac8d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt @@ -33,12 +33,14 @@ import org.jetbrains.kotlin.frontend.di.createContainerForBodyResolve import org.jetbrains.kotlin.idea.caches.resolve.CodeFragmentAnalyzer import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType +import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext +import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.lazy.* import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor import org.jetbrains.kotlin.resolve.scopes.LexicalScope import java.util.* diff --git a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt index 3f11b708beb..348a296d501 100644 --- a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt +++ b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt @@ -54,6 +54,7 @@ import org.jetbrains.kotlin.console.gutter.ConsoleGutterContentProvider import org.jetbrains.kotlin.console.gutter.ConsoleIndicatorRenderer import org.jetbrains.kotlin.console.gutter.IconWithTooltip import org.jetbrains.kotlin.console.gutter.ReplIcons +import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.caches.project.NotUnderContentRootModuleInfo import org.jetbrains.kotlin.idea.caches.project.forcedModuleInfo @@ -69,7 +70,6 @@ import org.jetbrains.kotlin.parsing.KotlinParserDefinition import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor import org.jetbrains.kotlin.resolve.repl.ReplState import org.jetbrains.kotlin.script.KotlinScriptDefinition import java.awt.Color @@ -284,7 +284,8 @@ class KotlinConsoleRunner( replState.submitLine(psiFile) configureFileDependencies(psiFile) - val scriptDescriptor = psiFile.script!!.unsafeResolveToDescriptor() as? LazyScriptDescriptor ?: error("Failed to analyze line:\n$text") + val scriptDescriptor = + psiFile.script!!.unsafeResolveToDescriptor() as? ScriptDescriptor ?: error("Failed to analyze line:\n$text") ForceResolveUtil.forceResolveAllContents(scriptDescriptor) replState.lineSuccess(psiFile, scriptDescriptor)