From 795516269d8d1ddceb8e99cd50c8279e16670ba9 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Mon, 26 Feb 2018 14:21:53 +0300 Subject: [PATCH] Uast: don't run resolve if not inside `KtFile` --- .../internal/kotlinInternalUastUtils.kt | 1 + .../tests/KotlinDetachedUastTest.kt | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) 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 1b7a45db879..93aa080ecdc 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 @@ -184,6 +184,7 @@ internal fun KtExpression.unwrapBlockOrParenthesis(): KtExpression { } internal fun KtElement.analyze(): BindingContext { + if(containingFile !is KtFile) return BindingContext.EMPTY // EA-114080, EA-113475 return ServiceManager.getService(project, KotlinUastBindingContextProviderService::class.java) ?.getBindingContext(this) ?: BindingContext.EMPTY } diff --git a/plugins/uast-kotlin/tests/KotlinDetachedUastTest.kt b/plugins/uast-kotlin/tests/KotlinDetachedUastTest.kt index 08b271a4dd8..561ec9535ea 100644 --- a/plugins/uast-kotlin/tests/KotlinDetachedUastTest.kt +++ b/plugins/uast-kotlin/tests/KotlinDetachedUastTest.kt @@ -25,8 +25,13 @@ import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.idea.core.copied import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor +import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.test.testFramework.runWriteAction import org.jetbrains.uast.* import org.jetbrains.uast.test.env.findUElementByTextFromPsi @@ -61,6 +66,22 @@ class KotlinDetachedUastTest : KotlinLightCodeInsightFixtureTestCase() { copied.originalFile.virtualFile) } + fun testDetachedResolve() { + val psiFile = myFixture.configureByText( + "AnnotatedClass.kt", """ + class AnnotatedClass { + @JvmName(name = "") + fun bar(param: String) { unknownFunc(param) } + } + """.trimIndent() + ) as KtFile + + val detachedCall = psiFile.findDescendantOfType()!!.copied() + val uCallExpression = detachedCall.toUElementOfType()!! + // at least it should not throw exceptions + TestCase.assertNull(uCallExpression.methodName) + } + fun testParameterInAnnotationClassFromFactory() { val detachedClass = KtPsiFactory(project).createClass("""