Remove redundant direct usages of the ScriptDefinition in compiler

plus some refactoring around definition extraction
This commit is contained in:
Ilya Chernikov
2019-02-13 17:57:28 +01:00
parent 5bc262fcb4
commit d1a1594f26
7 changed files with 48 additions and 47 deletions
@@ -84,6 +84,8 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
private final SyntheticResolveExtension syntheticResolveExtension; private final SyntheticResolveExtension syntheticResolveExtension;
private Project project;
@Inject @Inject
public void setAnnotationResolve(AnnotationResolver annotationResolver) { public void setAnnotationResolve(AnnotationResolver annotationResolver) {
this.annotationResolver = annotationResolver; this.annotationResolver = annotationResolver;
@@ -190,6 +192,8 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
danglingAnnotations = storageManager.createMemoizedFunction(file -> createAnnotations(file, file.getDanglingAnnotations())); danglingAnnotations = storageManager.createMemoizedFunction(file -> createAnnotations(file, file.getDanglingAnnotations()));
syntheticResolveExtension = SyntheticResolveExtension.Companion.getInstance(project); syntheticResolveExtension = SyntheticResolveExtension.Companion.getInstance(project);
this.project = project;
} }
private LazyAnnotations createAnnotations(KtFile file, List<KtAnnotationEntry> annotationEntries) { private LazyAnnotations createAnnotations(KtFile file, List<KtAnnotationEntry> annotationEntries) {
@@ -451,6 +455,11 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
return platformDiagnosticSuppressor; return platformDiagnosticSuppressor;
} }
@NotNull
public Project getProject() {
return project;
}
@Override @Override
public void assertValid() { public void assertValid() {
module.assertValid(); module.assertValid();
@@ -20,23 +20,14 @@ import com.intellij.lang.ASTNode;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.name.NameUtils;
import org.jetbrains.kotlin.psi.stubs.KotlinScriptStub; import org.jetbrains.kotlin.psi.stubs.KotlinScriptStub;
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes; import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes;
import org.jetbrains.kotlin.script.KotlinScriptDefinition;
import org.jetbrains.kotlin.script.ScriptDefinitionProvider;
import java.util.List; import java.util.List;
public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> implements KtDeclarationContainer { public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> implements KtDeclarationContainer {
public KotlinScriptDefinition getKotlinScriptDefinition() {
ScriptDefinitionProvider definitionsProvider = ScriptDefinitionProvider.Companion.getInstance(getProject());
if (definitionsProvider == null) {
throw new IllegalStateException("Unable to use KtScript: ScriptDefinitionProvider is not configured.");
}
KotlinScriptDefinition definition = definitionsProvider.findScriptDefinition(getContainingKtFile().getName());
return definition != null ? definition : definitionsProvider.getDefaultScriptDefinition();
}
public KtScript(@NotNull ASTNode node) { public KtScript(@NotNull ASTNode node) {
super(node); super(node);
} }
@@ -53,7 +44,8 @@ public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> implement
return stub.getFqName(); return stub.getFqName();
} }
KtFile containingKtFile = getContainingKtFile(); KtFile containingKtFile = getContainingKtFile();
return containingKtFile.getPackageFqName().child(getKotlinScriptDefinition().getScriptName(this)); Name fileBasedName = NameUtils.getScriptNameForFile(containingKtFile.getName());
return containingKtFile.getPackageFqName().child(fileBasedName);
} }
@Override @Override
@@ -39,39 +39,37 @@ interface ScriptDefinitionProvider {
} }
} }
fun findScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? { fun PsiFile.scriptDefinition(): KotlinScriptDefinition? {
val virtualFile = psiFile.virtualFile ?: psiFile.originalFile.virtualFile ?: return null if (this !is KtFile || this.script == null) return null
return findScriptDefinition(virtualFile, psiFile.project) val file = virtualFile ?: originalFile.virtualFile ?: return null
if (file.isNonScript()) return null
return scriptDefinitionByFileName(project, file.name)
} }
fun findScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefinition? { fun findScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefinition? {
if (file.isDirectory || if (file.isNonScript()) return null
file.extension == KotlinFileType.EXTENSION || if ((PsiManager.getInstance(project).findFile(file) as? KtFile)?.script == null) return null
file.extension == JavaClassFileType.INSTANCE.defaultExtension ||
!isKotlinFileType(file)
) {
return null
}
return scriptDefinitionByFileName(project, file.name)
}
fun scriptDefinitionByFileName(project: Project, fileName: String): KotlinScriptDefinition {
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) ?: return null val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) ?: return null
val psiFile = PsiManager.getInstance(project).findFile(file) ?: throw IllegalStateException("Unable to get script definition: ScriptDefinitionProvider is not configured.")
if (psiFile != null) {
if (psiFile !is KtFile) return null
// Do not use psiFile.script here because this method can be called during indexes access return scriptDefinitionProvider.findScriptDefinition(fileName) ?: scriptDefinitionProvider.getDefaultScriptDefinition()
// and accessing stubs may cause deadlock
// If script definition cannot be find, default script definition is used
// because all KtFile-s with KotlinFileType and non-kts extensions are parsed as scripts
val definition = scriptDefinitionProvider.findScriptDefinition(file.name)
return definition ?: scriptDefinitionProvider.getDefaultScriptDefinition()
}
return scriptDefinitionProvider.findScriptDefinition(file.name)
} }
private fun isKotlinFileType(file: VirtualFile): Boolean { private fun VirtualFile.isNonScript(): Boolean =
isDirectory ||
extension == KotlinFileType.EXTENSION ||
extension == JavaClassFileType.INSTANCE.defaultExtension ||
!this.isKotlinFileType()
private fun VirtualFile.isKotlinFileType(): Boolean {
val typeRegistry = FileTypeRegistry.getInstance() val typeRegistry = FileTypeRegistry.getInstance()
return typeRegistry.getFileTypeByFile(file) == KotlinFileType.INSTANCE || return typeRegistry.getFileTypeByFile(this) == KotlinFileType.INSTANCE ||
typeRegistry.getFileTypeByFileName(file.name) == KotlinFileType.INSTANCE typeRegistry.getFileTypeByFileName(name) == KotlinFileType.INSTANCE
} }
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.idea.util.isInSourceContentWithoutInjected
import org.jetbrains.kotlin.idea.util.isKotlinBinary import org.jetbrains.kotlin.idea.util.isKotlinBinary
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.script.scriptDefinitionByFileName
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.sure import org.jetbrains.kotlin.utils.sure
import org.jetbrains.kotlin.utils.yieldIfNotNull import org.jetbrains.kotlin.utils.yieldIfNotNull
@@ -172,8 +173,9 @@ private fun <T> PsiElement.collectInfos(c: ModuleInfoCollector<T>): T {
getModuleRelatedModuleInfo(project, virtualFile)?.let { getModuleRelatedModuleInfo(project, virtualFile)?.let {
return c.onResult(it) return c.onResult(it)
} }
containingKtFile.script?.kotlinScriptDefinition?.let { containingKtFile.script?.let {
return c.onResult(ScriptModuleInfo(project, virtualFile, it)) val definition = scriptDefinitionByFileName(project, containingKtFile.name)
return c.onResult(ScriptModuleInfo(project, virtualFile, definition))
} }
} }
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.psi.KtPsiFactoryKt;
import org.jetbrains.kotlin.resolve.TargetPlatform; import org.jetbrains.kotlin.resolve.TargetPlatform;
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform;
import org.jetbrains.kotlin.script.KotlinScriptDefinition; import org.jetbrains.kotlin.script.KotlinScriptDefinition;
import org.jetbrains.kotlin.script.KotlinScriptDefinitionProviderKt;
import static org.jetbrains.kotlin.script.KotlinScriptDefinitionProviderKt.findScriptDefinition; import static org.jetbrains.kotlin.script.KotlinScriptDefinitionProviderKt.findScriptDefinition;
@@ -61,7 +62,7 @@ public class TargetPlatformDetector {
} }
if (file.isScript()) { if (file.isScript()) {
KotlinScriptDefinition scriptDefinition = findScriptDefinition(file); KotlinScriptDefinition scriptDefinition = KotlinScriptDefinitionProviderKt.scriptDefinition(file);
if (scriptDefinition != null) { if (scriptDefinition != null) {
String platformNameFromScriptDefinition = scriptDefinition.getPlatform(); String platformNameFromScriptDefinition = scriptDefinition.getPlatform();
for (IdePlatform platform : IdePlatformKind.Companion.getAll_PLATFORMS()) { for (IdePlatform platform : IdePlatformKind.Companion.getAll_PLATFORMS()) {
@@ -41,6 +41,7 @@ import org.jetbrains.kotlin.psi.NotNullableUserDataProperty
import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.KotlinScriptDefinition
import org.jetbrains.kotlin.script.LegacyResolverWrapper import org.jetbrains.kotlin.script.LegacyResolverWrapper
import org.jetbrains.kotlin.script.findScriptDefinition import org.jetbrains.kotlin.script.findScriptDefinition
import org.jetbrains.kotlin.script.scriptDefinition
import kotlin.script.experimental.dependencies.AsyncDependenciesResolver import kotlin.script.experimental.dependencies.AsyncDependenciesResolver
import kotlin.script.experimental.dependencies.ScriptDependencies import kotlin.script.experimental.dependencies.ScriptDependencies
@@ -95,7 +96,7 @@ class ScriptDependenciesUpdater(
if (ApplicationManager.getApplication().isUnitTestMode && ApplicationManager.getApplication().isScriptDependenciesUpdaterDisabled == true) return if (ApplicationManager.getApplication().isUnitTestMode && ApplicationManager.getApplication().isScriptDependenciesUpdaterDisabled == true) return
val scriptDef = ktFile.script?.kotlinScriptDefinition ?: return val scriptDef = ktFile.scriptDefinition() ?: return
if (!ProjectRootsUtil.isInProjectSource(ktFile, includeScriptsOutsideSourceRoots = true)) return if (!ProjectRootsUtil.isInProjectSource(ktFile, includeScriptsOutsideSourceRoots = true)) return
@@ -122,7 +123,7 @@ class ScriptDependenciesUpdater(
} }
val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return
val scriptDef = ktFile.script?.kotlinScriptDefinition ?: return val scriptDef = ktFile.scriptDefinition() ?: return
if (!ProjectRootsUtil.isInProjectSource(ktFile, includeScriptsOutsideSourceRoots = true)) return if (!ProjectRootsUtil.isInProjectSource(ktFile, includeScriptsOutsideSourceRoots = true)) return
@@ -33,9 +33,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind
import org.jetbrains.kotlin.resolve.source.toSourceElement import org.jetbrains.kotlin.resolve.source.toSourceElement
import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.*
import org.jetbrains.kotlin.script.ScriptDependenciesProvider
import org.jetbrains.kotlin.script.ScriptPriorities
import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.typeUtil.isNothing import org.jetbrains.kotlin.types.typeUtil.isNothing
import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.types.typeUtil.isUnit
@@ -44,6 +42,7 @@ import java.io.File
import kotlin.reflect.KClass import kotlin.reflect.KClass
import kotlin.reflect.KType import kotlin.reflect.KType
class LazyScriptDescriptor( class LazyScriptDescriptor(
val resolveSession: ResolveSession, val resolveSession: ResolveSession,
containingDeclaration: DeclarationDescriptor, containingDeclaration: DeclarationDescriptor,
@@ -103,8 +102,7 @@ class LazyScriptDescriptor(
override fun getPriority() = priority override fun getPriority() = priority
val scriptDefinition: () -> KotlinScriptDefinition = resolveSession.storageManager.createLazyValue { val scriptDefinition: () -> KotlinScriptDefinition = resolveSession.storageManager.createLazyValue {
val file = scriptInfo.script.containingKtFile scriptDefinitionByFileName(resolveSession.project, scriptInfo.script.containingKtFile.name)
scriptInfo.script.kotlinScriptDefinition ?: throw RuntimeException("file ${file.name} is not a script")
} }
override fun substitute(substitutor: TypeSubstitutor) = this override fun substitute(substitutor: TypeSubstitutor) = this