Do not store script definition in psiFile

This may cause problems when definitions are reordered or switched off
KT-27375 Fixed
This commit is contained in:
Natalia Selezneva
2018-09-14 15:54:17 +03:00
parent 02277d0293
commit c4aab8340b
8 changed files with 35 additions and 23 deletions
@@ -77,7 +77,7 @@ class ScriptCodegen private constructor(
classBuilder: ClassBuilder,
methodContext: MethodContext
) {
val scriptDefinition = scriptContext.script.kotlinScriptDefinition.value
val scriptDefinition = scriptContext.script.kotlinScriptDefinition
val jvmSignature = typeMapper.mapScriptSignature(
scriptDescriptor,
@@ -77,7 +77,7 @@ class ScriptContext(
scriptDescriptor.unsubstitutedPrimaryConstructor.valueParameters[ctorImplicitReceiversParametersStart + index].name.identifier
fun getImplicitReceiverType(index: Int): Type? {
val receivers = script.kotlinScriptDefinition.value.implicitReceivers
val receivers = script.kotlinScriptDefinition.implicitReceivers
val kClass = receivers.getOrNull(index)?.classifier as? KClass<*>
return kClass?.java?.classId?.let(AsmUtil::asmTypeByClassId)
}
@@ -18,7 +18,8 @@ package org.jetbrains.kotlin.resolve.lazy.descriptors
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.annotations.FilteredAnnotations
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.name.ClassId
@@ -38,7 +39,6 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind
import org.jetbrains.kotlin.resolve.source.toSourceElement
import org.jetbrains.kotlin.script.KotlinScriptDefinition
import org.jetbrains.kotlin.script.ScriptPriorities
import org.jetbrains.kotlin.script.findScriptDefinition
import org.jetbrains.kotlin.types.TypeSubstitutor
import kotlin.reflect.KClass
import kotlin.reflect.KType
@@ -69,7 +69,7 @@ class LazyScriptDescriptor(
val scriptDefinition: () -> KotlinScriptDefinition = resolveSession.storageManager.createLazyValue {
val file = scriptInfo.script.containingKtFile
findScriptDefinition(file) ?: throw RuntimeException("file ${file.name} is not a script")
scriptInfo.script.kotlinScriptDefinition ?: throw RuntimeException("file ${file.name} is not a script")
}
override fun substitute(substitutor: TypeSubstitutor) = this
@@ -18,8 +18,6 @@ package org.jetbrains.kotlin.psi;
import com.intellij.lang.ASTNode;
import com.intellij.psi.util.PsiTreeUtil;
import kotlin.Lazy;
import kotlin.LazyKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.stubs.KotlinScriptStub;
@@ -29,14 +27,12 @@ import org.jetbrains.kotlin.script.ScriptDefinitionProvider;
import java.util.List;
import static kotlin.LazyThreadSafetyMode.PUBLICATION;
public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> implements KtDeclarationContainer {
public final Lazy<KotlinScriptDefinition> kotlinScriptDefinition = LazyKt.lazy(PUBLICATION, () -> {
public KotlinScriptDefinition getKotlinScriptDefinition() {
ScriptDefinitionProvider definitionsProvider = ScriptDefinitionProvider.Companion.getInstance(getProject());
KotlinScriptDefinition definition = definitionsProvider.findScriptDefinition(getContainingKtFile().getName());
return definition != null ? definition : definitionsProvider.getDefaultScriptDefinition();
});
}
public KtScript(@NotNull ASTNode node) {
super(node);
@@ -54,7 +50,7 @@ public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> implement
return stub.getFqName();
}
KtFile containingKtFile = getContainingKtFile();
return containingKtFile.getPackageFqName().child(kotlinScriptDefinition.getValue().getScriptName(this));
return containingKtFile.getPackageFqName().child(getKotlinScriptDefinition().getScriptName(this));
}
@Override
@@ -22,7 +22,6 @@ import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.psi.KtFile
@@ -55,18 +54,13 @@ fun findScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefin
if (psiFile != null) {
if (psiFile !is KtFile) return null
if (!DumbService.isDumb(project)) {
return psiFile.script?.kotlinScriptDefinition?.value
return psiFile.script?.kotlinScriptDefinition
}
}
return ScriptDefinitionProvider.getInstance(project).findScriptDefinition(file.name)
}
fun findScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? {
if (psiFile.isDirectory) return null
return (psiFile as? KtFile)?.script?.kotlinScriptDefinition?.value
}
abstract class LazyScriptDefinitionProvider : ScriptDefinitionProvider {
protected val lock = ReentrantReadWriteLock()