Uast: yet another check for invalid context before resolve (EA-137191, EA-137193)

This commit is contained in:
Nicolay Mitropolsky
2019-02-19 18:53:29 +03:00
parent bd0c6736ce
commit 98740138f3
4 changed files with 12 additions and 5 deletions
@@ -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 })
})
@@ -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 {
@@ -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
@@ -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
}