diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt index 2797e73a6aa..6c7e1b51230 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt @@ -66,6 +66,10 @@ abstract class KotlinAbstractUElement(private val givenParent: UElement?) : UEle parent = parent.parent } + if (psi is KtSuperTypeCallEntry) { + parent = parent?.parent + } + val result = doConvertParent(this, parent) if (result == this) { throw IllegalStateException("Loop in parent structure when converting a $psi of type ${psi?.javaClass} with parent $parent of type ${parent?.javaClass} text: [${parent?.text}]") diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt index 266ba2c4886..f1076e703bb 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt @@ -309,6 +309,10 @@ internal object KotlinConverter { is KtWhenEntry -> el(build(::KotlinUSwitchEntry)) is KtWhenCondition -> convertWhenCondition(element, givenParent, requiredType) is KtTypeReference -> el { LazyKotlinUTypeReferenceExpression(element, givenParent) } + is KtConstructorDelegationCall -> + el { KotlinUFunctionCallExpression(element, givenParent) } + is KtSuperTypeCallEntry -> + el { KotlinUFunctionCallExpression(element, givenParent) } else -> { if (element is LeafPsiElement && element.elementType == KtTokens.IDENTIFIER) { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt index 38109b9f64d..94b1c8d52a4 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt @@ -105,18 +105,17 @@ open class KotlinUClass private constructor( class KotlinConstructorUMethod( private val ktClass: KtClassOrObject?, override val psi: KtLightMethod, - override val uastParent: UElement? -): KotlinUMethod(psi, uastParent) { + givenParent: UElement? +) : KotlinUMethod(psi, givenParent) { val isPrimary: Boolean - get() = psi.kotlinOrigin is KtPrimaryConstructor + get() = psi.kotlinOrigin.let { it is KtPrimaryConstructor || it is KtObjectDeclaration } override val uastBody: UExpression? by lz { val delegationCall: KtCallElement? = psi.kotlinOrigin.let { - when (it) { - is KtPrimaryConstructor, is KtObjectDeclaration -> - ktClass?.superTypeListEntries?.firstIsInstanceOrNull() - is KtSecondaryConstructor -> it.getDelegationCall() + when { + isPrimary -> ktClass?.superTypeListEntries?.firstIsInstanceOrNull() + it is KtSecondaryConstructor -> it.getDelegationCall() else -> null } } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt index 0f37f34099a..3e8a4c4fa85 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt @@ -16,13 +16,17 @@ package org.jetbrains.uast.kotlin.declarations -import com.intellij.psi.* +import com.intellij.psi.PsiCodeBlock +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import com.intellij.psi.PsiMethod import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.isGetter import org.jetbrains.kotlin.asJava.elements.isSetter import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.uast.* import org.jetbrains.uast.java.annotations import org.jetbrains.uast.java.internal.JavaUElementWithComments @@ -84,6 +88,14 @@ open class KotlinUMethod( override fun equals(other: Any?) = other is KotlinUMethod && psi == other.psi companion object { - fun create(psi: KtLightMethod, containingElement: UElement?) = KotlinUMethod(psi, containingElement) + fun create(psi: KtLightMethod, containingElement: UElement?) = + if (psi.kotlinOrigin is KtConstructor<*>) { + KotlinConstructorUMethod( + psi.kotlinOrigin?.containingClassOrObject, + psi, containingElement + ) + } + else + KotlinUMethod(psi, containingElement) } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt index e482d5f99a2..b2dfc81fcab 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt @@ -124,4 +124,18 @@ class KotlinUFunctionCallExpression( // KtAnnotationEntry -> KtValueArgumentList -> KtValueArgument -> arrayOf call return psi.parents.elementAtOrNull(2) is KtAnnotationEntry && CompileTimeConstantUtils.isArrayFunctionCall(resolvedCall) } + + override fun convertParent(): UElement? = super.convertParent().let { result -> + when (result) { + is UMethod -> result.uastBody ?: result + is UClass -> + result.methods + .filterIsInstance() + .firstOrNull { it.isPrimary } + ?.uastBody + ?: result + else -> result + } + } + } \ No newline at end of file diff --git a/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt b/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt index c6df33c038e..3260e0aad58 100644 --- a/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt +++ b/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt @@ -55,5 +55,5 @@ class SimpleKotlinRenderLogTest : AbstractKotlinRenderLogTest() { fun testWhenAndDestructing() = doTest("WhenAndDestructing") { testName, file -> check(testName, file, false) } @Test - fun testSuperCalls() = doTest("SuperCalls") { testName, file -> check(testName, file, false) } + fun testSuperCalls() = doTest("SuperCalls") }