191: Uast: support convertToAlternatives for KtFile
This commit is contained in:
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.asJava.LightClassUtil
|
|||||||
import org.jetbrains.kotlin.asJava.classes.KtLightClass
|
import org.jetbrains.kotlin.asJava.classes.KtLightClass
|
||||||
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
|
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
|
||||||
import org.jetbrains.kotlin.asJava.elements.*
|
import org.jetbrains.kotlin.asJava.elements.*
|
||||||
|
import org.jetbrains.kotlin.asJava.findFacadeClass
|
||||||
import org.jetbrains.kotlin.asJava.toLightClass
|
import org.jetbrains.kotlin.asJava.toLightClass
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
@@ -153,6 +154,7 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin {
|
|||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
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 KtFile -> KotlinConverter.convertKtFile(element, null, requiredTypes) as Sequence<T>
|
||||||
(element is KtProperty && !element.isLocal) -> KotlinConverter.convertNonLocalProperty(element, null, requiredTypes) as Sequence<T>
|
(element is KtProperty && !element.isLocal) -> KotlinConverter.convertNonLocalProperty(element, null, requiredTypes) as Sequence<T>
|
||||||
element is KtParameter -> KotlinConverter.convertParameter(element, null, requiredTypes) as Sequence<T>
|
element is KtParameter -> KotlinConverter.convertParameter(element, null, requiredTypes) as Sequence<T>
|
||||||
element is KtClassOrObject -> KotlinConverter.convertClassOrObject(element, null, requiredTypes) as Sequence<T>
|
element is KtClassOrObject -> KotlinConverter.convertClassOrObject(element, null, requiredTypes) as Sequence<T>
|
||||||
@@ -505,7 +507,7 @@ internal object KotlinConverter {
|
|||||||
|
|
||||||
is KtParameter -> convertParameter(original, givenParent, this).firstOrNull()
|
is KtParameter -> convertParameter(original, givenParent, this).firstOrNull()
|
||||||
|
|
||||||
is KtFile -> el<UFile> { KotlinUFile(original) }
|
is KtFile -> convertKtFile(original, givenParent, this).firstOrNull()
|
||||||
is FakeFileForLightClass -> el<UFile> { KotlinUFile(original.navigationElement) }
|
is FakeFileForLightClass -> el<UFile> { KotlinUFile(original.navigationElement) }
|
||||||
is KtAnnotationEntry -> el<UAnnotation>(build(::KotlinUAnnotation))
|
is KtAnnotationEntry -> el<UAnnotation>(build(::KotlinUAnnotation))
|
||||||
is KtCallExpression ->
|
is KtCallExpression ->
|
||||||
@@ -591,6 +593,16 @@ internal object KotlinConverter {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun convertKtFile(
|
||||||
|
element: KtFile,
|
||||||
|
givenParent: UElement?,
|
||||||
|
requiredTypes: Array<out Class<out UElement>>
|
||||||
|
): Sequence<UElement> = requiredTypes.accommodate(
|
||||||
|
alternative { KotlinUFile(element) },
|
||||||
|
alternative { element.findFacadeClass()?.let { KotlinUClass.create(it, givenParent) } }
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
internal fun convertOrEmpty(expression: KtExpression?, parent: UElement?): UExpression {
|
internal fun convertOrEmpty(expression: KtExpression?, parent: UElement?): UExpression {
|
||||||
return expression?.let { convertExpression(it, parent, DEFAULT_EXPRESSION_TYPES_LIST) } ?: UastEmptyExpression
|
return expression?.let { convertExpression(it, parent, DEFAULT_EXPRESSION_TYPES_LIST) } ?: UastEmptyExpression
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ UFile (package = )
|
|||||||
UClass (name = Foo)
|
UClass (name = Foo)
|
||||||
UClass (name = Bar)
|
UClass (name = Bar)
|
||||||
UAnnotationMethod (name = Bar)
|
UAnnotationMethod (name = Bar)
|
||||||
|
UField (name = a)
|
||||||
|
UField (name = b)
|
||||||
UAnnotationMethod (name = getAPlusB)
|
UAnnotationMethod (name = getAPlusB)
|
||||||
UClass (name = Baz)
|
UClass (name = Baz)
|
||||||
UAnnotationMethod (name = doNothing)
|
UAnnotationMethod (name = doNothing)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[1]:[UFile (package = )]
|
[2]:[UFile (package = ), UClass (name = LocalDeclarationsKt)]
|
||||||
[1]:[UAnnotationMethod (name = foo)]
|
[1]:[UAnnotationMethod (name = foo)]
|
||||||
[1]:[UIdentifier (Identifier (foo))]
|
[1]:[UIdentifier (Identifier (foo))]
|
||||||
[1]:[UDeclarationsExpression]
|
[1]:[UDeclarationsExpression]
|
||||||
|
|||||||
Reference in New Issue
Block a user