From 98740138f33c4ad79a5bf5b2f7c9640ab7b488b5 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Tue, 19 Feb 2019 18:53:29 +0300 Subject: [PATCH] Uast: yet another check for invalid context before resolve (EA-137191, EA-137193) --- .../uast/kotlin/declarations/KotlinUMethod.kt | 3 ++- .../uast/kotlin/declarations/KotlinUMethod.kt.191 | 1 + .../uast/kotlin/declarations/KotlinUVariable.kt | 2 +- .../uast/kotlin/internal/kotlinInternalUastUtils.kt | 11 ++++++++--- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt index 908675a061d..fb4487692ce 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt @@ -91,6 +91,7 @@ open class KotlinUMethod( override val uastBody by lz { + if (kotlinOrigin?.canAnalyze() != true) return@lz null // EA-137193 val bodyExpression = when (kotlinOrigin) { is KtFunction -> kotlinOrigin.bodyExpression is KtProperty -> when { @@ -106,7 +107,7 @@ open class KotlinUMethod( KotlinUBlockExpression.KotlinLazyUBlockExpression(this, { block -> val implicitReturn = KotlinUImplicitReturnExpression(block) val uBody = getLanguagePlugin().convertElement(bodyExpression, implicitReturn) as? UExpression - ?: return@KotlinLazyUBlockExpression emptyList() + ?: return@KotlinLazyUBlockExpression emptyList() listOf(implicitReturn.apply { returnExpression = uBody }) }) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.191 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.191 index 825b11e7adf..6795ae95096 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.191 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.191 @@ -91,6 +91,7 @@ open class KotlinUMethod( override val uastBody by lz { + if (kotlinOrigin?.canAnalyze() != true) return@lz null // EA-137193 val bodyExpression = when (kotlinOrigin) { is KtFunction -> kotlinOrigin.bodyExpression is KtProperty -> when { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt index 00bffed539b..d13df651472 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt @@ -50,7 +50,7 @@ abstract class AbstractKotlinUVariable(givenParent: UElement?) : KotlinAbstractU is UastKotlinPsiVariable -> psi.ktInitializer is UastKotlinPsiParameter -> psi.ktDefaultValue is KtLightElement<*, *> -> { - val origin = psi.kotlinOrigin + val origin = psi.kotlinOrigin?.takeIf { it.canAnalyze() } // EA-137191 when (origin) { is KtVariableDeclaration -> origin.initializer is KtParameter -> origin.defaultValue diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt index f56e713b1dc..2a6d3ed1af8 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt @@ -282,10 +282,15 @@ internal fun KtExpression.unwrapBlockOrParenthesis(): KtExpression { return innerExpression } +internal fun KtElement.canAnalyze(): Boolean { + if (!isValid) return false + val containingFile = containingFile as? KtFile ?: return false // EA-114080, EA-113475, EA-134193 + if (containingFile.doNotAnalyze != null) return false // To prevent exceptions during analysis + return true +} + internal fun KtElement.analyze(): BindingContext { - val containingFile = containingFile - if (!isValid || containingFile !is KtFile) return BindingContext.EMPTY // EA-114080, EA-113475, EA-134193 - if (containingFile.doNotAnalyze != null) return BindingContext.EMPTY // To prevent exceptions during analysis + if (!canAnalyze()) return BindingContext.EMPTY return ServiceManager.getService(project, KotlinUastResolveProviderService::class.java) ?.getBindingContext(this) ?: BindingContext.EMPTY }