Uast: don't run resolve if not inside KtFile

This commit is contained in:
Nicolay Mitropolsky
2018-02-26 14:21:53 +03:00
parent 8fbdf52d34
commit 795516269d
2 changed files with 22 additions and 0 deletions
@@ -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
}
@@ -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<KtCallExpression>()!!.copied()
val uCallExpression = detachedCall.toUElementOfType<UCallExpression>()!!
// at least it should not throw exceptions
TestCase.assertNull(uCallExpression.methodName)
}
fun testParameterInAnnotationClassFromFactory() {
val detachedClass = KtPsiFactory(project).createClass("""