191: Uast: support convertToAlternatives for KtClassOrObject
This commit is contained in:
@@ -181,11 +181,7 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin {
|
|||||||
is KtEnumEntry -> el<UEnumConstant> {
|
is KtEnumEntry -> el<UEnumConstant> {
|
||||||
convertEnumEntry(original, givenParent)
|
convertEnumEntry(original, givenParent)
|
||||||
}
|
}
|
||||||
is KtClassOrObject -> el<UClass> {
|
is KtClassOrObject -> convertClassOrObject(original, givenParent, this).firstOrNull()
|
||||||
original.toLightClass()?.let { lightClass ->
|
|
||||||
KotlinUClass.create(lightClass, givenParent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is KtFunction ->
|
is KtFunction ->
|
||||||
if (original.isLocal) {
|
if (original.isLocal) {
|
||||||
el<ULambdaExpression> {
|
el<ULambdaExpression> {
|
||||||
@@ -275,6 +271,7 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin {
|
|||||||
override fun <T : UElement> convertToAlternatives(element: PsiElement, requiredTypes: Array<out Class<out T>>): Sequence<T> = when {
|
override fun <T : UElement> convertToAlternatives(element: PsiElement, requiredTypes: Array<out Class<out T>>): Sequence<T> = when {
|
||||||
(element is KtProperty && !element.isLocal) -> convertNonLocalProperty(element, null, requiredTypes) as Sequence<T>
|
(element is KtProperty && !element.isLocal) -> convertNonLocalProperty(element, null, requiredTypes) as Sequence<T>
|
||||||
element is KtParameter -> convertParameter(element, null, requiredTypes) as Sequence<T>
|
element is KtParameter -> convertParameter(element, null, requiredTypes) as Sequence<T>
|
||||||
|
element is KtClassOrObject -> convertClassOrObject(element, null, requiredTypes) as Sequence<T>
|
||||||
else -> sequenceOf(convertElementWithParent(element, requiredTypes.nonEmptyOr(DEFAULT_TYPES_LIST)) as? T).filterNotNull()
|
else -> sequenceOf(convertElementWithParent(element, requiredTypes.nonEmptyOr(DEFAULT_TYPES_LIST)) as? T).filterNotNull()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -332,6 +329,25 @@ private fun convertParameter(
|
|||||||
*convertToPropertyAlternatives(LightClassUtil.getLightClassPropertyMethods(element), givenParent)
|
*convertToPropertyAlternatives(LightClassUtil.getLightClassPropertyMethods(element), givenParent)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private fun convertClassOrObject(
|
||||||
|
element: KtClassOrObject,
|
||||||
|
givenParent: UElement?,
|
||||||
|
requiredTypes: Array<out Class<out UElement>>
|
||||||
|
): Sequence<UElement> {
|
||||||
|
val ktLightClass = element.toLightClass() ?: return emptySequence()
|
||||||
|
val uClass = KotlinUClass.create(ktLightClass, givenParent)
|
||||||
|
return requiredTypes.accommodate(
|
||||||
|
alternative { uClass },
|
||||||
|
alternative primaryConstructor@{
|
||||||
|
val primaryConstructor = element.primaryConstructor ?: return@primaryConstructor null
|
||||||
|
uClass.methods.asSequence()
|
||||||
|
.filter { it.sourcePsi == primaryConstructor }
|
||||||
|
.firstOrNull()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
internal object KotlinConverter {
|
internal object KotlinConverter {
|
||||||
internal tailrec fun unwrapElements(element: PsiElement?): PsiElement? = when (element) {
|
internal tailrec fun unwrapElements(element: PsiElement?): PsiElement? = when (element) {
|
||||||
is KtValueArgumentList -> unwrapElements(element.parent)
|
is KtValueArgumentList -> unwrapElements(element.parent)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.uast.test.kotlin
|
package org.jetbrains.uast.test.kotlin
|
||||||
|
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
|
import org.jetbrains.kotlin.psi.KtClass
|
||||||
import org.jetbrains.kotlin.psi.KtParameter
|
import org.jetbrains.kotlin.psi.KtParameter
|
||||||
import org.jetbrains.kotlin.psi.KtProperty
|
import org.jetbrains.kotlin.psi.KtProperty
|
||||||
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase.assertInstanceOf
|
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase.assertInstanceOf
|
||||||
@@ -125,4 +126,34 @@ class KotlinUastAlternativesTest : AbstractKotlinUastTest() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testPrimaryConstructorAlternatives() {
|
||||||
|
doTest("ManyAlternatives") { name, file ->
|
||||||
|
val index = file.psi.text.indexOf("ClassA")
|
||||||
|
val ktProperty = PsiTreeUtil.getParentOfType(file.psi.findElementAt(index), KtClass::class.java)!!
|
||||||
|
val plugin = UastLanguagePlugin.byLanguage(ktProperty.language)!!
|
||||||
|
|
||||||
|
plugin.convertToAlternatives<UElement>(ktProperty, arrayOf(UClass::class.java)).let {
|
||||||
|
assertEquals("public final class ClassA {", it.joinToString { it.asRenderString().lineSequence().first() })
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.convertToAlternatives<UElement>(ktProperty, arrayOf(UClass::class.java, UMethod::class.java)).let {
|
||||||
|
assertEquals(
|
||||||
|
"public final class ClassA {, " +
|
||||||
|
"public fun ClassA(@org.jetbrains.annotations.NotNull justParam: int, @org.jetbrains.annotations.NotNull paramAndProp: java.lang.String) = UastEmptyExpression",
|
||||||
|
it.joinToString { it.asRenderString().lineSequence().first() }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.convertToAlternatives<UElement>(ktProperty, arrayOf(UElement::class.java)).let {
|
||||||
|
assertEquals(
|
||||||
|
"public final class ClassA {, " +
|
||||||
|
"public fun ClassA(@org.jetbrains.annotations.NotNull justParam: int, @org.jetbrains.annotations.NotNull paramAndProp: java.lang.String) = UastEmptyExpression",
|
||||||
|
it.joinToString { it.asRenderString().lineSequence().first() }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user