Java-Uast: properly unwrapping call expressions for lazy-parent (IDEA-181557)

This commit is contained in:
Nicolay Mitropolsky
2017-11-30 19:28:43 +03:00
parent e02f9c1368
commit abc93aa1d4
2 changed files with 27 additions and 0 deletions
@@ -31,6 +31,8 @@ class JavaUQualifiedReferenceExpression(
JavaUSimpleNameReferenceExpression(psi.referenceNameElement, psi.referenceName ?: "<error>", this, psi)
}
override fun convertParent(): UElement? = super.convertParent().let(this::unwrapCompositeQualifiedReference)
override val accessType: UastQualifiedExpressionAccessType
get() = UastQualifiedExpressionAccessType.SIMPLE
@@ -38,4 +40,18 @@ class JavaUQualifiedReferenceExpression(
get() = (psi.resolve() as? PsiNamedElement)?.name
override fun resolve() = psi.resolve()
}
internal fun UElement.unwrapCompositeQualifiedReference(uParent: UElement?): UElement? = when (uParent) {
is UQualifiedReferenceExpression -> {
if (uParent.receiver == this || uParent.selector == this)
uParent
else {
val selector = uParent.selector
if (this is JavaUSimpleNameReferenceExpression || (selector is JavaUCallExpression && selector.valueArgumentCount > 0))
selector
else uParent.uastParent
}
}
else -> uParent
}
@@ -29,6 +29,17 @@ class JavaUSimpleNameReferenceExpression(
override fun resolve() = (reference ?: psi as? PsiReference)?.resolve()
override val resolvedName: String?
get() = ((reference ?: psi as? PsiReference)?.resolve() as? PsiNamedElement)?.name
override fun getPsiParentForLazyConversion(): PsiElement? {
val parent = super.getPsiParentForLazyConversion()
if (parent is PsiReferenceExpression && parent.parent is PsiMethodCallExpression) {
return parent.parent
}
return parent
}
override fun convertParent(): UElement? = super.convertParent().let(this::unwrapCompositeQualifiedReference)
}
class JavaUTypeReferenceExpression(