From f40ea754cb210d821c633e3a77c66119c4994092 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 31 Jan 2018 14:12:48 +0300 Subject: [PATCH] 181: Uast: identifiers fixes for `KotlinUFunctionCallExpression` and `AbstractKotlinUVariable` --- .../kotlin/declarations/KotlinUMethod.kt.181 | 8 +++++++- .../kotlin/declarations/KotlinUVariable.kt.181 | 8 ++++---- .../declarations/UastLightIdentifier.kt.181 | 16 ++++++++++++++-- .../KotlinUFunctionCallExpression.kt.181 | 9 +++++++-- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.181 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.181 index 6cc37562c4e..cf4c8f155c7 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.181 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.181 @@ -75,7 +75,13 @@ open class KotlinUMethod( override val uastAnchor by lazy { KotlinUIdentifier( nameIdentifier, - (sourcePsi as? PsiNameIdentifierOwner)?.nameIdentifier ?: sourcePsi?.navigationElement, + sourcePsi.let { sourcePsi -> + when (sourcePsi) { + is PsiNameIdentifierOwner -> sourcePsi.nameIdentifier + is KtObjectDeclaration -> sourcePsi.getObjectKeyword() + else -> sourcePsi?.navigationElement + } + }, this ) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.181 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.181 index 9c158eba4ce..e576495becd 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.181 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.181 @@ -39,8 +39,8 @@ import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable import org.jetbrains.uast.visitor.UastVisitor -abstract class AbstractKotlinUVariable(givenParent: UElement?) - : KotlinAbstractUElement(givenParent), PsiVariable, UVariable, KotlinUElementWithComments { +abstract class AbstractKotlinUVariable(givenParent: UElement?) : KotlinAbstractUElement(givenParent), PsiVariable, UVariable, UAnchorOwner, + KotlinUElementWithComments { override val uastInitializer: UExpression? get() { @@ -95,8 +95,8 @@ abstract class AbstractKotlinUVariable(givenParent: UElement?) override val typeReference by lz { getLanguagePlugin().convertOpt(psi.typeElement, this) } - override val uastAnchor: UElement? - get() = KotlinUIdentifier(nameIdentifier, sourcePsi, this) + override val uastAnchor: UIdentifier? + get() = KotlinUIdentifier(nameIdentifier, (sourcePsi as? KtNamedDeclaration)?.nameIdentifier ?: sourcePsi, this) override fun equals(other: Any?) = other is AbstractKotlinUVariable && psi == other.psi diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/UastLightIdentifier.kt.181 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/UastLightIdentifier.kt.181 index c59cddabd2a..7af4a411b77 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/UastLightIdentifier.kt.181 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/UastLightIdentifier.kt.181 @@ -16,11 +16,13 @@ package org.jetbrains.uast.kotlin.declarations +import com.intellij.openapi.application.ApplicationManager import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier +import org.jetbrains.kotlin.psi.KtCallElement import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.uast.UElement @@ -41,10 +43,20 @@ class KotlinUIdentifier private constructor( ) : UIdentifier(psi, givenParent) { init { - assert(sourcePsi == null || sourcePsi is LeafPsiElement || sourcePsi is KtElement, { "sourcePsi should be physical" }) + if (ApplicationManager.getApplication().isUnitTestMode) + assert(sourcePsi == null || sourcePsi is LeafPsiElement || (sourcePsi is KtElement && sourcePsi.firstChild == null), + { "sourcePsi should be physical leaf element but got $sourcePsi of (${sourcePsi?.javaClass})" }) } - override val uastParent: UElement? by lazy { givenParent ?: sourcePsi?.parent?.toUElement() } + override val uastParent: UElement? by lazy { + if (givenParent != null) return@lazy givenParent + val parent = sourcePsi?.parent ?: return@lazy null + val parentParent = parent.parent + if (parentParent is KtCallElement && parentParent.calleeExpression == parent) { // method identifiers in calls + return@lazy parentParent.toUElement() + } + return@lazy parent.toUElement() + } constructor(javaPsi: PsiElement?, sourcePsi: PsiElement?, uastParent: UElement?) : this(javaPsi, sourcePsi, javaPsi, uastParent) constructor(sourcePsi: PsiElement?, uastParent: UElement?) : this(null, sourcePsi, sourcePsi, uastParent) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt.181 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt.181 index df9b741beda..c9e4ec3aabb 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt.181 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt.181 @@ -73,8 +73,13 @@ class KotlinUFunctionCallExpression( } override val methodIdentifier by lz { - val calleeExpression = psi.calleeExpression ?: return@lz null - KotlinUIdentifier(calleeExpression, this) + val calleeExpression = psi.calleeExpression + when (calleeExpression) { + null -> null + is KtNameReferenceExpression -> + KotlinUIdentifier(calleeExpression.getReferencedNameElement(), this /* ReferenceExpression will be the parent */) + else -> KotlinUIdentifier(calleeExpression, this) + } } override val valueArgumentCount: Int