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 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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -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()) {
|
||||||
|
|||||||
+3
-2
@@ -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
|
||||||
|
|
||||||
|
|||||||
+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.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
|
||||||
|
|||||||
Reference in New Issue
Block a user