From b45172a7f827b08c1ed0ea75e37263d05707a60d Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Tue, 29 Jan 2019 12:35:38 +0300 Subject: [PATCH] 191: Uast: support `convertToAlternatives` for `KtFile` --- .../uast/kotlin/KotlinUastLanguagePlugin.kt.191 | 14 +++++++++++++- .../testData/InnerClasses.splog.txt.191 | 2 ++ .../testData/LocalDeclarations.altlog.txt.191 | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt.191 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt.191 index 463ef5f500d..c53afda6f70 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt.191 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt.191 @@ -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 convertToAlternatives(element: PsiElement, requiredTypes: Array>): Sequence = when { + element is KtFile -> KotlinConverter.convertKtFile(element, null, requiredTypes) as Sequence (element is KtProperty && !element.isLocal) -> KotlinConverter.convertNonLocalProperty(element, null, requiredTypes) as Sequence element is KtParameter -> KotlinConverter.convertParameter(element, null, requiredTypes) as Sequence element is KtClassOrObject -> KotlinConverter.convertClassOrObject(element, null, requiredTypes) as Sequence @@ -505,7 +507,7 @@ internal object KotlinConverter { is KtParameter -> convertParameter(original, givenParent, this).firstOrNull() - is KtFile -> el { KotlinUFile(original) } + is KtFile -> convertKtFile(original, givenParent, this).firstOrNull() is FakeFileForLightClass -> el { KotlinUFile(original.navigationElement) } is KtAnnotationEntry -> el(build(::KotlinUAnnotation)) is KtCallExpression -> @@ -591,6 +593,16 @@ internal object KotlinConverter { ) } + fun convertKtFile( + element: KtFile, + givenParent: UElement?, + requiredTypes: Array> + ): Sequence = 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 } diff --git a/plugins/uast-kotlin/testData/InnerClasses.splog.txt.191 b/plugins/uast-kotlin/testData/InnerClasses.splog.txt.191 index d4d525ee83c..c739be3bfab 100644 --- a/plugins/uast-kotlin/testData/InnerClasses.splog.txt.191 +++ b/plugins/uast-kotlin/testData/InnerClasses.splog.txt.191 @@ -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) diff --git a/plugins/uast-kotlin/testData/LocalDeclarations.altlog.txt.191 b/plugins/uast-kotlin/testData/LocalDeclarations.altlog.txt.191 index 99fd07b78fa..2eeed9b522c 100644 --- a/plugins/uast-kotlin/testData/LocalDeclarations.altlog.txt.191 +++ b/plugins/uast-kotlin/testData/LocalDeclarations.altlog.txt.191 @@ -1,4 +1,4 @@ -[1]:[UFile (package = )] +[2]:[UFile (package = ), UClass (name = LocalDeclarationsKt)] [1]:[UAnnotationMethod (name = foo)] [1]:[UIdentifier (Identifier (foo))] [1]:[UDeclarationsExpression]