Additional fixes for consistent parent conversion
This commit is contained in:
@@ -21,9 +21,11 @@ import org.jetbrains.kotlin.asJava.toLightGetter
|
|||||||
import org.jetbrains.kotlin.asJava.toLightSetter
|
import org.jetbrains.kotlin.asJava.toLightSetter
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
import org.jetbrains.uast.*
|
import org.jetbrains.uast.*
|
||||||
import org.jetbrains.uast.kotlin.expressions.KotlinUElvisExpression
|
import org.jetbrains.uast.kotlin.expressions.KotlinUElvisExpression
|
||||||
|
import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable
|
||||||
|
|
||||||
abstract class KotlinAbstractUElement(private val givenParent: UElement?) : UElement {
|
abstract class KotlinAbstractUElement(private val givenParent: UElement?) : UElement {
|
||||||
|
|
||||||
@@ -50,8 +52,15 @@ abstract class KotlinAbstractUElement(private val givenParent: UElement?) : UEle
|
|||||||
?: parent
|
?: parent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (psi is UastKotlinPsiVariable && parent != null) {
|
||||||
|
parent = parent.parent
|
||||||
|
}
|
||||||
|
|
||||||
if ((parent is KtStringTemplateExpression && parent.entries.size == 1) || parent is KtWhenConditionWithExpression) {
|
if (parent is KtStringTemplateEntryWithExpression) {
|
||||||
|
parent = parent.parent
|
||||||
|
}
|
||||||
|
if ((parent is KtStringTemplateExpression && parent.entries.size == 1) ||
|
||||||
|
parent is KtWhenConditionWithExpression) {
|
||||||
parent = parent.parent
|
parent = parent.parent
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,6 +97,16 @@ fun doConvertParent(element: UElement, parent: PsiElement?): UElement? {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parent is KtClassInitializer) {
|
||||||
|
val containingClass = parent.containingClassOrObject
|
||||||
|
if (containingClass != null) {
|
||||||
|
val containingUClass = KotlinUastLanguagePlugin().convertElementWithParent(containingClass, null) as KotlinUClass?
|
||||||
|
containingUClass?.methods?.filterIsInstance<KotlinPrimaryConstructorUMethod>()?.firstOrNull()?.let {
|
||||||
|
return it.uastBody
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val result = KotlinUastLanguagePlugin().convertElementWithParent(parentUnwrapped, null)
|
val result = KotlinUastLanguagePlugin().convertElementWithParent(parentUnwrapped, null)
|
||||||
|
|
||||||
if (result is UEnumConstant && element is UDeclaration) {
|
if (result is UEnumConstant && element is UDeclaration) {
|
||||||
|
|||||||
@@ -100,17 +100,17 @@ open class KotlinUClass private constructor(
|
|||||||
else -> KotlinUClass(psi, containingElement)
|
else -> KotlinUClass(psi, containingElement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class KotlinPrimaryConstructorUMethod(
|
class KotlinPrimaryConstructorUMethod(
|
||||||
private val ktClass: KtClassOrObject?,
|
private val ktClass: KtClassOrObject?,
|
||||||
override val psi: KtLightMethod,
|
override val psi: KtLightMethod,
|
||||||
override val uastParent: UElement?
|
override val uastParent: UElement?
|
||||||
): KotlinUMethod(psi, uastParent) {
|
): KotlinUMethod(psi, uastParent) {
|
||||||
override val uastBody: UExpression? by lz {
|
override val uastBody: UExpression? by lz {
|
||||||
ktClass?.getAnonymousInitializers()
|
ktClass?.getAnonymousInitializers()
|
||||||
?.takeIf { it.isNotEmpty() }
|
?.takeIf { it.isNotEmpty() }
|
||||||
?.let { KotlinUBlockExpression.create(it, this) }
|
?.let { KotlinUBlockExpression.create(it, this) }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
UFile (package = )
|
||||||
|
UClass (name = Callback)
|
||||||
|
UAnnotationMethod (name = onError)
|
||||||
|
UParameter (name = throwable)
|
||||||
|
UAnnotation (fqName = org.jetbrains.annotations.NotNull)
|
||||||
|
UClass (name = Model)
|
||||||
|
UAnnotationMethod (name = crashMe)
|
||||||
|
UParameter (name = clazz)
|
||||||
|
UAnnotation (fqName = org.jetbrains.annotations.NotNull)
|
||||||
|
UParameter (name = factory)
|
||||||
|
UAnnotation (fqName = org.jetbrains.annotations.NotNull)
|
||||||
|
UBlockExpression
|
||||||
|
UThrowExpression
|
||||||
|
UCallExpression (kind = UastCallKind(name='constructor_call'), argCount = 0))
|
||||||
|
UIdentifier (Identifier (UnsupportedOperationException))
|
||||||
|
USimpleNameReferenceExpression (identifier = <init>)
|
||||||
|
UAnnotationMethod (name = Model)
|
||||||
|
UBlockExpression
|
||||||
|
UBlockExpression
|
||||||
|
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 2))
|
||||||
|
UIdentifier (Identifier (crashMe))
|
||||||
|
USimpleNameReferenceExpression (identifier = crashMe)
|
||||||
|
UQualifiedReferenceExpression
|
||||||
|
UClassLiteralExpression
|
||||||
|
USimpleNameReferenceExpression (identifier = java)
|
||||||
|
ULambdaExpression
|
||||||
|
UBlockExpression
|
||||||
|
UObjectLiteralExpression
|
||||||
|
UClass (name = null)
|
||||||
|
UAnnotationMethod (name = onError)
|
||||||
|
UParameter (name = throwable)
|
||||||
|
UAnnotation (fqName = org.jetbrains.annotations.NotNull)
|
||||||
|
UBlockExpression
|
||||||
|
UThrowExpression
|
||||||
|
UCallExpression (kind = UastCallKind(name='constructor_call'), argCount = 1))
|
||||||
|
UIdentifier (Identifier (UnsupportedOperationException))
|
||||||
|
USimpleNameReferenceExpression (identifier = <init>)
|
||||||
|
ULiteralExpression (value = "")
|
||||||
|
UAnnotationMethod (name = Model$1$1)
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
public abstract interface Callback {
|
||||||
|
public abstract fun onError(throwable: java.lang.Throwable) : void = UastEmptyExpression
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class Model {
|
||||||
|
public final fun crashMe(clazz: java.lang.Class<T>, factory: kotlin.jvm.functions.Function0<? extends T>) : void {
|
||||||
|
throw <init>()
|
||||||
|
}
|
||||||
|
public fun Model() {
|
||||||
|
{
|
||||||
|
crashMe(Callback.java, {
|
||||||
|
anonymous object : Callback {
|
||||||
|
override fun onError(throwable: Throwable) {
|
||||||
|
throw UnsupportedOperationException("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -44,4 +44,6 @@ class SimpleKotlinRenderLogTest : AbstractKotlinRenderLogTest() {
|
|||||||
@Test fun testParameterPropertyWithAnnotation() = doTest("ParameterPropertyWithAnnotation")
|
@Test fun testParameterPropertyWithAnnotation() = doTest("ParameterPropertyWithAnnotation")
|
||||||
|
|
||||||
@Test fun testParametersWithDefaultValues() = doTest("ParametersWithDefaultValues")
|
@Test fun testParametersWithDefaultValues() = doTest("ParametersWithDefaultValues")
|
||||||
|
|
||||||
|
@Test fun testUnexpectedContainer() = doTest("UnexpectedContainerException") { testName, file -> check(testName, file, false) }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user