diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index 4c09ea985b5..bab5800861c 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -53,7 +53,6 @@ import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.util.isOrdinaryClass import java.util.* import javax.swing.Icon @@ -359,7 +358,7 @@ abstract class KtLightClassForSourceDeclaration( classOrObject is KtObjectDeclaration && classOrObject.isObjectLiteral() -> KtLightClassForAnonymousDeclaration(classOrObject) - classOrObject.isLocal -> + classOrObject.safeIsLocal() -> KtLightClassForLocalDeclaration(classOrObject) else -> @@ -372,9 +371,9 @@ abstract class KtLightClassForSourceDeclaration( return InvalidLightClassDataHolder } - val containingScript = classOrObject.containingKtFile.script + val containingScript = classOrObject.containingKtFile.safeScript() return when { - !classOrObject.isLocal && containingScript != null -> + !classOrObject.safeIsLocal() && containingScript != null -> KtLightClassForScript.getLightClassCachedValue(containingScript).value else -> getLightClassCachedValue(classOrObject).value @@ -546,7 +545,7 @@ fun KtClassOrObject.shouldNotBeVisibleAsLightClass(): Boolean { return true } - if (isLocal) { + if (safeIsLocal()) { if (containingFile.virtualFile == null) return true if (hasParseErrorsAround(this) || PsiUtilCore.hasErrorElementChild(this)) return true } @@ -581,4 +580,4 @@ private fun hasParseErrorsAround(psi: PsiElement): Boolean { } return false -} +} \ No newline at end of file diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt index b0255b0d322..69905ce29e4 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt @@ -52,7 +52,7 @@ fun PsiReferenceList.addSuperTypeEntry( internal fun KtClassOrObject.getExternalDependencies(): List { return with(KotlinModificationTrackerService.getInstance(project)) { - if (!isLocal) return listOf(outOfBlockModificationTracker) + if (!safeIsLocal()) return listOf(outOfBlockModificationTracker) else when (val file = containingFile) { is KtFile -> listOf(outOfBlockModificationTracker, fileModificationTracker(file)) else -> listOf(outOfBlockModificationTracker) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightUtils.kt index ec5b2c3be1f..d253f93e77a 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightUtils.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightUtils.kt @@ -6,7 +6,9 @@ package org.jetbrains.kotlin.asJava.classes import com.google.common.collect.Lists +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Computable import com.intellij.psi.* import com.intellij.psi.impl.cache.ModifierFlags import com.intellij.psi.impl.cache.TypeInfo @@ -184,10 +186,9 @@ fun createTypeFromCanonicalText( } fun tryGetPredefinedName(klass: ClassDescriptor): String? { - val sourceClass = (klass.source as? KotlinSourceElement)?.psi as? KtClassOrObject - return if (sourceClass?.isLocal == true) + return if (sourceClass?.safeIsLocal() == true) (sourceClass.nameAsName ?: SpecialNames.NO_NAME_PROVIDED).asString() else null } @@ -380,3 +381,14 @@ internal inline fun Project.applyCompilerPlugins(body: (UltraLightClassModifierE internal fun L.invalidAccess(): Nothing = error("Cls delegate shouldn't be loaded for not too complex ultra-light classes! Qualified name: ${javaClass.name}") + + +inline fun runReadAction(crossinline runnable: () -> T): T { + return ApplicationManager.getApplication().runReadAction(Computable { runnable() }) +} + +inline fun KtClassOrObject.safeIsLocal(): Boolean = runReadAction { this.isLocal } + +inline fun KtFile.safeIsScript() = runReadAction { this.isScript() } + +inline fun KtFile.safeScript() = runReadAction { this.script } \ No newline at end of file diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt index 43e58fb29f5..7b99d638eb3 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.asJava.builder.InvalidLightClassDataHolder import org.jetbrains.kotlin.asJava.builder.LightClassDataProviderForFileFacade import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration import org.jetbrains.kotlin.asJava.classes.getOutermostClassOrObject +import org.jetbrains.kotlin.asJava.classes.safeIsScript import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory.cast import org.jetbrains.kotlin.diagnostics.Errors.* @@ -57,7 +58,7 @@ fun getJvmSignatureDiagnostics(element: PsiElement, otherDiagnostics: Diagnostic fun doGetDiagnostics(): Diagnostics? { //TODO: enable this diagnostic when light classes for scripts are ready - if ((element.containingFile as? KtFile)?.isScript() == true) return null + if ((element.containingFile as? KtFile)?.safeIsScript() == true) return null var parent = element.parent if (element is KtPropertyAccessor) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt index d63023949bd..b99ad5bb5ad 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt @@ -129,7 +129,7 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG override fun createUltraLightClass(element: KtClassOrObject): KtUltraLightClass? { if (element.shouldNotBeVisibleAsLightClass() || element is KtEnumEntry || - element.containingKtFile.isScript() + element.containingKtFile.safeIsScript() ) { return null } @@ -139,7 +139,7 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG element is KtObjectDeclaration && element.isObjectLiteral() -> KtUltraLightClassForAnonymousDeclaration(element, support) - element.isLocal -> + element.safeIsLocal() -> KtUltraLightClassForLocalDeclaration(element, support) (element.hasModifier(KtTokens.INLINE_KEYWORD)) -> @@ -219,5 +219,4 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG override fun analyze(element: KtElement) = element.analyze(BodyResolveMode.PARTIAL) override fun analyzeWithContent(element: KtClassOrObject) = element.analyzeWithContent() -} - +} \ No newline at end of file