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 Project project;
@Inject
public void setAnnotationResolve(AnnotationResolver annotationResolver) {
this.annotationResolver = annotationResolver;
@@ -190,6 +192,8 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
danglingAnnotations = storageManager.createMemoizedFunction(file -> createAnnotations(file, file.getDanglingAnnotations()));
syntheticResolveExtension = SyntheticResolveExtension.Companion.getInstance(project);
this.project = project;
}
private LazyAnnotations createAnnotations(KtFile file, List<KtAnnotationEntry> annotationEntries) {
@@ -451,6 +455,11 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
return platformDiagnosticSuppressor;
}
@NotNull
public Project getProject() {
return project;
}
@Override
public void assertValid() {
module.assertValid();
@@ -20,23 +20,14 @@ import com.intellij.lang.ASTNode;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
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.elements.KtStubElementTypes;
import org.jetbrains.kotlin.script.KotlinScriptDefinition;
import org.jetbrains.kotlin.script.ScriptDefinitionProvider;
import java.util.List;
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) {
super(node);
}
@@ -53,7 +44,8 @@ public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> implement
return stub.getFqName();
}
KtFile containingKtFile = getContainingKtFile();
return containingKtFile.getPackageFqName().child(getKotlinScriptDefinition().getScriptName(this));
Name fileBasedName = NameUtils.getScriptNameForFile(containingKtFile.getName());
return containingKtFile.getPackageFqName().child(fileBasedName);
}
@Override
@@ -39,39 +39,37 @@ interface ScriptDefinitionProvider {
}
}
fun findScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? {
val virtualFile = psiFile.virtualFile ?: psiFile.originalFile.virtualFile ?: return null
return findScriptDefinition(virtualFile, psiFile.project)
fun PsiFile.scriptDefinition(): KotlinScriptDefinition? {
if (this !is KtFile || this.script == null) return null
val file = virtualFile ?: originalFile.virtualFile ?: return null
if (file.isNonScript()) return null
return scriptDefinitionByFileName(project, file.name)
}
fun findScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefinition? {
if (file.isDirectory ||
file.extension == KotlinFileType.EXTENSION ||
file.extension == JavaClassFileType.INSTANCE.defaultExtension ||
!isKotlinFileType(file)
) {
return null
}
if (file.isNonScript()) return null
if ((PsiManager.getInstance(project).findFile(file) as? KtFile)?.script == null) return null
return scriptDefinitionByFileName(project, file.name)
}
fun scriptDefinitionByFileName(project: Project, fileName: String): KotlinScriptDefinition {
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) ?: return null
val psiFile = PsiManager.getInstance(project).findFile(file)
if (psiFile != null) {
if (psiFile !is KtFile) return null
?: throw IllegalStateException("Unable to get script definition: ScriptDefinitionProvider is not configured.")
// Do not use psiFile.script here because this method can be called during indexes access
// 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)
return scriptDefinitionProvider.findScriptDefinition(fileName) ?: scriptDefinitionProvider.getDefaultScriptDefinition()
}
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()
return typeRegistry.getFileTypeByFile(file) == KotlinFileType.INSTANCE ||
typeRegistry.getFileTypeByFileName(file.name) == KotlinFileType.INSTANCE
return typeRegistry.getFileTypeByFile(this) == 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.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.script.scriptDefinitionByFileName
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.sure
import org.jetbrains.kotlin.utils.yieldIfNotNull
@@ -172,8 +173,9 @@ private fun <T> PsiElement.collectInfos(c: ModuleInfoCollector<T>): T {
getModuleRelatedModuleInfo(project, virtualFile)?.let {
return c.onResult(it)
}
containingKtFile.script?.kotlinScriptDefinition?.let {
return c.onResult(ScriptModuleInfo(project, virtualFile, it))
containingKtFile.script?.let {
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.jvm.platform.JvmPlatform;
import org.jetbrains.kotlin.script.KotlinScriptDefinition;
import org.jetbrains.kotlin.script.KotlinScriptDefinitionProviderKt;
import static org.jetbrains.kotlin.script.KotlinScriptDefinitionProviderKt.findScriptDefinition;
@@ -61,7 +62,7 @@ public class TargetPlatformDetector {
}
if (file.isScript()) {
KotlinScriptDefinition scriptDefinition = findScriptDefinition(file);
KotlinScriptDefinition scriptDefinition = KotlinScriptDefinitionProviderKt.scriptDefinition(file);
if (scriptDefinition != null) {
String platformNameFromScriptDefinition = scriptDefinition.getPlatform();
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.LegacyResolverWrapper
import org.jetbrains.kotlin.script.findScriptDefinition
import org.jetbrains.kotlin.script.scriptDefinition
import kotlin.script.experimental.dependencies.AsyncDependenciesResolver
import kotlin.script.experimental.dependencies.ScriptDependencies
@@ -95,7 +96,7 @@ class ScriptDependenciesUpdater(
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
@@ -122,7 +123,7 @@ class ScriptDependenciesUpdater(
}
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
@@ -33,9 +33,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl
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.ScriptDependenciesProvider
import org.jetbrains.kotlin.script.ScriptPriorities
import org.jetbrains.kotlin.script.*
import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.typeUtil.isNothing
import org.jetbrains.kotlin.types.typeUtil.isUnit
@@ -44,6 +42,7 @@ import java.io.File
import kotlin.reflect.KClass
import kotlin.reflect.KType
class LazyScriptDescriptor(
val resolveSession: ResolveSession,
containingDeclaration: DeclarationDescriptor,
@@ -103,8 +102,7 @@ class LazyScriptDescriptor(
override fun getPriority() = priority
val scriptDefinition: () -> KotlinScriptDefinition = resolveSession.storageManager.createLazyValue {
val file = scriptInfo.script.containingKtFile
scriptInfo.script.kotlinScriptDefinition ?: throw RuntimeException("file ${file.name} is not a script")
scriptDefinitionByFileName(resolveSession.project, scriptInfo.script.containingKtFile.name)
}
override fun substitute(substitutor: TypeSubstitutor) = this