Replace unnecessary direct usages of the LazyScriptDescriptor with ScriptDescriptor interface

lift result property to the interface to implement it
This commit is contained in:
Ilya Chernikov
2019-02-12 16:02:28 +01:00
parent e28017039d
commit 29fa0f5dff
10 changed files with 26 additions and 21 deletions
@@ -27,8 +27,8 @@ import org.jetbrains.kotlin.codegen.CompilationErrorHandler
import org.jetbrains.kotlin.codegen.KotlinCodegenFacade import org.jetbrains.kotlin.codegen.KotlinCodegenFacade
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
import org.jetbrains.kotlin.renderer.DescriptorRenderer 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.KotlinScriptDefinition
import org.jetbrains.kotlin.script.ScriptDependenciesProvider import org.jetbrains.kotlin.script.ScriptDependenciesProvider
import java.io.File import java.io.File
@@ -88,7 +88,7 @@ open class GenericReplCompiler(
else -> error("Unexpected result ${analysisResult::class.java}") 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( val generationState = GenerationState.Builder(
psiFile.project, psiFile.project,
@@ -33,7 +33,6 @@ import org.jetbrains.kotlin.resolve.checkers.checkClassifierUsages
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
import org.jetbrains.kotlin.resolve.lazy.* import org.jetbrains.kotlin.resolve.lazy.*
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor
import java.util.* import java.util.*
class LazyTopDownAnalyzer( class LazyTopDownAnalyzer(
@@ -87,7 +86,7 @@ class LazyTopDownAnalyzer(
override fun visitScript(script: KtScript) { override fun visitScript(script: KtScript) {
c.scripts.put( c.scripts.put(
script, script,
lazyDeclarationResolver.getScriptDescriptor(script, KotlinLookupLocation(script)) as LazyScriptDescriptor lazyDeclarationResolver.getScriptDescriptor(script, KotlinLookupLocation(script))
) )
registerDeclarations(script.declarations) registerDeclarations(script.declarations)
} }
@@ -18,13 +18,13 @@ package org.jetbrains.kotlin.resolve.lazy;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes;
import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.incremental.components.NoLookupLocation;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt; import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt;
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfoFactory; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfoFactory;
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor; import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor;
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor;
import org.jetbrains.kotlin.resolve.scopes.LexicalScope; import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
public class DeclarationScopeProviderImpl implements DeclarationScopeProvider { 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 //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) { if (parentDeclaration instanceof KtScript) {
LazyScriptDescriptor scriptDescriptor = (LazyScriptDescriptor) lazyDeclarationResolver.resolveToDescriptor(parentDeclaration); ClassDescriptorWithResolutionScopes
scriptDescriptor = (ClassDescriptorWithResolutionScopes) lazyDeclarationResolver.resolveToDescriptor(parentDeclaration);
return scriptDescriptor.getScopeForInitializerResolution(); return scriptDescriptor.getScopeForInitializerResolution();
} }
@@ -73,9 +73,7 @@ class LazyScriptDescriptor(
resolveSession.trace.record(BindingContext.SCRIPT, scriptInfo.script, this) resolveSession.trace.record(BindingContext.SCRIPT, scriptInfo.script, this)
} }
val resultValue: ReplResultPropertyDescriptor? by lazy { provideResultValue() } override fun getResultValue(): ReplResultPropertyDescriptor? {
private fun provideResultValue(): ReplResultPropertyDescriptor? {
val expression = scriptInfo.script val expression = scriptInfo.script
.getChildOfType<KtBlockExpression>() .getChildOfType<KtBlockExpression>()
?.getChildrenOfType<KtScriptInitializer>()?.lastOrNull() ?.getChildrenOfType<KtScriptInitializer>()?.lastOrNull()
@@ -9,14 +9,13 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
class ReplResultPropertyDescriptor( class ReplResultPropertyDescriptor(
name: Name, name: Name,
kotlinType: KotlinType, kotlinType: KotlinType,
receiver: ReceiverParameterDescriptor?, receiver: ReceiverParameterDescriptor?,
script: LazyScriptDescriptor, script: ScriptDescriptor,
source: SourceElement source: SourceElement
) : PropertyDescriptorImpl( ) : PropertyDescriptorImpl(
script, script,
@@ -12,14 +12,13 @@ import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor
class ScriptProvidedPropertyDescriptor( class ScriptProvidedPropertyDescriptor(
name: Name, name: Name,
typeDescriptor: ClassDescriptor, typeDescriptor: ClassDescriptor,
receiver: ReceiverParameterDescriptor?, receiver: ReceiverParameterDescriptor?,
isVar: Boolean, isVar: Boolean,
script: LazyScriptDescriptor script: ScriptDescriptor
) : PropertyDescriptorImpl( ) : PropertyDescriptorImpl(
script, script,
null, null,
@@ -16,11 +16,12 @@
package org.jetbrains.kotlin.resolve.repl 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.psi.KtFile
import org.jetbrains.kotlin.resolve.lazy.FileScopeFactory import org.jetbrains.kotlin.resolve.lazy.FileScopeFactory
import org.jetbrains.kotlin.resolve.lazy.FileScopes import org.jetbrains.kotlin.resolve.lazy.FileScopes
import org.jetbrains.kotlin.resolve.lazy.FileScopesCustomizer 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.lazy.fileScopesCustomizer
import org.jetbrains.kotlin.resolve.scopes.ImportingScope import org.jetbrains.kotlin.resolve.scopes.ImportingScope
import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf 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) val successfulLine = LineInfo.SuccessfulLine(ktFile, successfulLines.lastOrNull(), scriptDescriptor)
lines[ktFile] = successfulLine lines[ktFile] = successfulLine
successfulLines.add(successfulLine) successfulLines.add(successfulLine)
@@ -65,7 +66,7 @@ class ReplState {
class SuccessfulLine( class SuccessfulLine(
override val linePsi: KtFile, override val linePsi: KtFile,
override val parentLine: SuccessfulLine?, override val parentLine: SuccessfulLine?,
val lineDescriptor: LazyScriptDescriptor val lineDescriptor: ScriptDescriptor
) : LineInfo() ) : LineInfo()
class FailedLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?) : 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? { private fun computeFileScopes(lineInfo: LineInfo, fileScopeFactory: FileScopeFactory): FileScopes? {
// create scope that wraps previous line lexical scope and adds imports from this line // 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<ImportingScope>() val lastLineImports = lexicalScopeAfterLastLine.parentsWithSelf.firstIsInstance<ImportingScope>()
val scopesForThisLine = fileScopeFactory.createScopesForFile(lineInfo.linePsi, lastLineImports) val scopesForThisLine = fileScopeFactory.createScopesForFile(lineInfo.linePsi, lastLineImports)
val combinedLexicalScopes = lexicalScopeAfterLastLine.replaceImportingScopes(scopesForThisLine.importingScope) val combinedLexicalScopes = lexicalScopeAfterLastLine.replaceImportingScopes(scopesForThisLine.importingScope)
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.descriptors; package org.jetbrains.kotlin.descriptors;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
@@ -32,4 +33,7 @@ public interface ScriptDescriptor extends ClassDescriptor {
@NotNull @NotNull
List<PropertyDescriptor> getScriptProvidedProperties(); List<PropertyDescriptor> getScriptProvidedProperties();
@Nullable
PropertyDescriptor getResultValue();
} }
@@ -33,12 +33,14 @@ import org.jetbrains.kotlin.frontend.di.createContainerForBodyResolve
import org.jetbrains.kotlin.idea.caches.resolve.CodeFragmentAnalyzer import org.jetbrains.kotlin.idea.caches.resolve.CodeFragmentAnalyzer
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* 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.*
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
import org.jetbrains.kotlin.resolve.lazy.* import org.jetbrains.kotlin.resolve.lazy.*
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor
import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import java.util.* import java.util.*
@@ -54,6 +54,7 @@ import org.jetbrains.kotlin.console.gutter.ConsoleGutterContentProvider
import org.jetbrains.kotlin.console.gutter.ConsoleIndicatorRenderer import org.jetbrains.kotlin.console.gutter.ConsoleIndicatorRenderer
import org.jetbrains.kotlin.console.gutter.IconWithTooltip import org.jetbrains.kotlin.console.gutter.IconWithTooltip
import org.jetbrains.kotlin.console.gutter.ReplIcons import org.jetbrains.kotlin.console.gutter.ReplIcons
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.caches.project.NotUnderContentRootModuleInfo import org.jetbrains.kotlin.idea.caches.project.NotUnderContentRootModuleInfo
import org.jetbrains.kotlin.idea.caches.project.forcedModuleInfo 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.KtFile
import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.psi.KtScript
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil 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.resolve.repl.ReplState
import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.KotlinScriptDefinition
import java.awt.Color import java.awt.Color
@@ -284,7 +284,8 @@ class KotlinConsoleRunner(
replState.submitLine(psiFile) replState.submitLine(psiFile)
configureFileDependencies(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) ForceResolveUtil.forceResolveAllContents(scriptDescriptor)
replState.lineSuccess(psiFile, scriptDescriptor) replState.lineSuccess(psiFile, scriptDescriptor)