191: Uast: support convertToAlternatives for KtFile

This commit is contained in:
Nicolay Mitropolsky
2019-01-29 12:35:38 +03:00
parent 4df72b4f79
commit b45172a7f8
3 changed files with 16 additions and 2 deletions
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.asJava.elements.*
import org.jetbrains.kotlin.asJava.findFacadeClass
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -153,6 +154,7 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin {
@Suppress("UNCHECKED_CAST")
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 KtParameter -> KotlinConverter.convertParameter(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 KtFile -> el<UFile> { KotlinUFile(original) }
is KtFile -> convertKtFile(original, givenParent, this).firstOrNull()
is FakeFileForLightClass -> el<UFile> { KotlinUFile(original.navigationElement) }
is KtAnnotationEntry -> el<UAnnotation>(build(::KotlinUAnnotation))
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 {
return expression?.let { convertExpression(it, parent, DEFAULT_EXPRESSION_TYPES_LIST) } ?: UastEmptyExpression
}
@@ -2,6 +2,8 @@ UFile (package = )
UClass (name = Foo)
UClass (name = Bar)
UAnnotationMethod (name = Bar)
UField (name = a)
UField (name = b)
UAnnotationMethod (name = getAPlusB)
UClass (name = Baz)
UAnnotationMethod (name = doNothing)
@@ -1,4 +1,4 @@
[1]:[UFile (package = )]
[2]:[UFile (package = ), UClass (name = LocalDeclarationsKt)]
[1]:[UAnnotationMethod (name = foo)]
[1]:[UIdentifier (Identifier (foo))]
[1]:[UDeclarationsExpression]