Remove redundant direct usages of the ScriptDefinition in compiler
plus some refactoring around definition extraction
This commit is contained in:
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -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()) {
|
||||
|
||||
+3
-2
@@ -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
|
||||
|
||||
|
||||
+3
-5
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user