From f1b7d30363096ee1ad5820d12b7d5d932e7f5fcf Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 30 Dec 2016 18:22:50 +0300 Subject: [PATCH] Update uast-kotlin to Uast 1.0.8 --- .../uast/kotlin/KotlinUastLanguagePlugin.kt | 18 ++++++------- .../declarations/KotlinUImportStatement.kt | 26 ++++++++++++++----- .../expressions/KotlinUBinaryExpression.kt | 4 +-- .../KotlinUCallableReferenceExpression.kt | 4 +-- .../KotlinUClassLiteralExpression.kt | 4 +-- ...on.kt => KotlinUDeclarationsExpression.kt} | 6 ++--- .../expressions/KotlinUSwitchExpression.kt | 4 +-- .../internal/kotlinInternalUastUtils.kt | 2 +- 8 files changed, 39 insertions(+), 29 deletions(-) rename plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/{KotlinUVariableDeclarationsExpression.kt => KotlinUDeclarationsExpression.kt} (82%) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt index 9a4a0f93232..e6137a2c211 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt @@ -174,9 +174,9 @@ internal inline fun Class?.expr(f: () -> UE internal object KotlinConverter { internal fun convertPsiElement(element: PsiElement?, parent: UElement?, requiredType: Class?): UElement? { return with (requiredType) { when (element) { - is KtParameterList -> el { - KotlinUVariableDeclarationsExpression(parent).apply { - variables = element.parameters.mapIndexed { i, p -> + is KtParameterList -> el { + KotlinUDeclarationsExpression(parent).apply { + declarations = element.parameters.mapIndexed { i, p -> KotlinUVariable.create(UastKotlinPsiParameter.create(p, element, parent!!, i), this) } } @@ -200,10 +200,10 @@ internal object KotlinConverter { private fun convertVariablesDeclaration( psi: KtVariableDeclaration, parent: UElement? - ): UVariableDeclarationsExpression { + ): UDeclarationsExpression { val parentPsiElement = (parent as? PsiElementBacked)?.psi val variable = KotlinUVariable.create(UastKotlinPsiVariable.create(psi, parentPsiElement, parent!!), parent) - return KotlinUVariableDeclarationsExpression(parent).apply { variables = listOf(variable) } + return KotlinUDeclarationsExpression(parent).apply { declarations = listOf(variable) } } private fun convertStringTemplateExpression( @@ -230,7 +230,7 @@ internal object KotlinConverter { internal fun convertExpression(expression: KtExpression, parent: UElement?, requiredType: Class? = null): UExpression { return with (requiredType) { when (expression) { - is KtVariableDeclaration -> expr { convertVariablesDeclaration(expression, parent) } + is KtVariableDeclaration -> expr { convertVariablesDeclaration(expression, parent) } is KtStringTemplateExpression -> expr { if (expression.entries.isEmpty()) @@ -240,8 +240,8 @@ internal object KotlinConverter { else convertStringTemplateExpression(expression, parent, expression.entries.size - 1) } - is KtDestructuringDeclaration -> expr { - KotlinUVariableDeclarationsExpression(parent).apply { + is KtDestructuringDeclaration -> expr { + KotlinUDeclarationsExpression(parent).apply { val tempAssignment = KotlinUVariable.create(UastKotlinPsiVariable.create(expression, parent!!), parent) val destructuringAssignments = expression.entries.mapIndexed { i, entry -> val psiFactory = KtPsiFactory(expression.project) @@ -250,7 +250,7 @@ internal object KotlinConverter { KotlinUVariable.create(UastKotlinPsiVariable.create( entry, tempAssignment.psi, parent, initializer), parent) } - variables = listOf(tempAssignment) + destructuringAssignments + declarations = listOf(tempAssignment) + destructuringAssignments } } is KtLabeledExpression -> expr { KotlinULabeledExpression(expression, parent) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt index 0b50d9676aa..a3e1656f11a 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt @@ -16,10 +16,12 @@ package org.jetbrains.uast.kotlin -import org.jetbrains.kotlin.idea.references.mainReference +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtImportDirective +import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.uast.UElement import org.jetbrains.uast.UImportStatement import org.jetbrains.uast.USimpleNameReferenceExpression @@ -31,22 +33,34 @@ class KotlinUImportStatement( ) : UImportStatement { override val isOnDemand: Boolean get() = psi.isAllUnder - - private val importRef by lz { psi.importedReference?.let { ImportReference(it, psi.name ?: psi.text, this) } } + + private val importRef by lz { + psi.importedReference?.let { + ImportReference(it, psi.name ?: psi.text, this, psi) + } + } override val importReference: UElement? get() = importRef override fun resolve() = importRef?.resolve() - + private class ImportReference( override val psi: KtExpression, override val identifier: String, - override val containingElement: UElement? + override val containingElement: UElement?, + private val importDirective: KtImportDirective ) : KotlinAbstractUExpression(), USimpleNameReferenceExpression, PsiElementBacked { override val resolvedName: String? get() = identifier - override fun resolve() = psi.getQualifiedElementSelector()?.mainReference?.resolve()?.getMaybeLightElement(this) + override fun asRenderString(): String = importDirective.importedFqName?.asString() ?: psi.text + + override fun resolve(): PsiElement? { + val reference = psi.getQualifiedElementSelector() as? KtReferenceExpression ?: return null + val bindingContext = reference.analyze() + val referenceTarget = bindingContext[BindingContext.REFERENCE_TARGET, reference] ?: return null + return referenceTarget.toSource()?.getMaybeLightElement(this) + } } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt index 1dd62fb15c7..51886ebf111 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt @@ -61,9 +61,9 @@ class KotlinUBinaryExpression( KtTokens.EQEQEQ -> UastBinaryOperator.IDENTITY_EQUALS KtTokens.EXCLEQEQEQ -> UastBinaryOperator.IDENTITY_NOT_EQUALS KtTokens.GT -> UastBinaryOperator.GREATER - KtTokens.GTEQ -> UastBinaryOperator.GREATER_OR_EQUAL + KtTokens.GTEQ -> UastBinaryOperator.GREATER_OR_EQUALS KtTokens.LT -> UastBinaryOperator.LESS - KtTokens.LTEQ -> UastBinaryOperator.LESS_OR_EQUAL + KtTokens.LTEQ -> UastBinaryOperator.LESS_OR_EQUALS KtTokens.PLUSEQ -> UastBinaryOperator.PLUS_ASSIGN KtTokens.MINUSEQ -> UastBinaryOperator.MINUS_ASSIGN KtTokens.MULTEQ -> UastBinaryOperator.MULTIPLY_ASSIGN diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt index c9138ce8d8e..d2f875432b5 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt @@ -16,10 +16,8 @@ package org.jetbrains.uast.kotlin -import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.psi.KtCallableReferenceExpression import org.jetbrains.kotlin.resolve.BindingContext.DOUBLE_COLON_LHS -import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.uast.UCallableReferenceExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression @@ -37,7 +35,7 @@ class KotlinUCallableReferenceExpression( } override val qualifierType by lz { - val ktType = psi.analyze(BodyResolveMode.PARTIAL)[DOUBLE_COLON_LHS, psi.receiverExpression]?.type ?: return@lz null + val ktType = psi.analyze()[DOUBLE_COLON_LHS, psi.receiverExpression]?.type ?: return@lz null ktType.toPsiType(this, psi, boxed = true) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt index 55852ebef08..11bd8f44fb8 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt @@ -16,10 +16,8 @@ package org.jetbrains.uast.kotlin -import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.psi.KtClassLiteralExpression import org.jetbrains.kotlin.resolve.BindingContext.DOUBLE_COLON_LHS -import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.uast.UClassLiteralExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression @@ -30,7 +28,7 @@ class KotlinUClassLiteralExpression( override val containingElement: UElement? ) : KotlinAbstractUExpression(), UClassLiteralExpression, PsiElementBacked, KotlinUElementWithType { override val type by lz { - val ktType = psi.analyze(BodyResolveMode.PARTIAL)[DOUBLE_COLON_LHS, psi.receiverExpression]?.type ?: return@lz null + val ktType = psi.analyze()[DOUBLE_COLON_LHS, psi.receiverExpression]?.type ?: return@lz null ktType.toPsiType(this, psi, boxed = true) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUVariableDeclarationsExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt similarity index 82% rename from plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUVariableDeclarationsExpression.kt rename to plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt index c5f33452371..fcc355ad0a7 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUVariableDeclarationsExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt @@ -17,9 +17,9 @@ package org.jetbrains.uast import org.jetbrains.uast.kotlin.KotlinAbstractUExpression -class KotlinUVariableDeclarationsExpression( +class KotlinUDeclarationsExpression( override val containingElement: UElement? -) : KotlinAbstractUExpression(), UVariableDeclarationsExpression { - override lateinit var variables: List +) : KotlinAbstractUExpression(), UDeclarationsExpression { + override lateinit var declarations: List internal set } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt index 22891aeed71..7efb15138eb 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt @@ -27,7 +27,7 @@ class KotlinUSwitchExpression( ) : KotlinAbstractUExpression(), USwitchExpression, PsiElementBacked, KotlinUElementWithType { override val expression by lz { KotlinConverter.convertOrNull(psi.subjectExpression, this) } - override val body: UExpression by lz { + override val body: UExpressionList by lz { object : KotlinUExpressionList(psi, KotlinSpecialExpressionKinds.WHEN, this) { override fun asRenderString() = expressions.joinToString("\n") { it.asRenderString().withMargin } }.apply { @@ -76,7 +76,7 @@ class KotlinUSwitchEntry( }} } - override val body: UExpression by lz { + override val body: UExpressionList by lz { object : KotlinUExpressionList(psi, KotlinSpecialExpressionKinds.WHEN_ENTRY, this) { override fun asRenderString() = buildString { appendln("{") diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt index 57f0eac6dc0..254f8647a54 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt @@ -136,7 +136,7 @@ internal fun PsiElement.getMaybeLightElement(context: UElement): PsiElement? { val uElement = languagePlugin.convertElementWithParent(this, null) when (uElement) { is UDeclaration -> uElement.psi - is UVariableDeclarationsExpression -> uElement.variables.firstOrNull()?.psi + is UDeclarationsExpression -> uElement.declarations.firstOrNull()?.psi else -> null } }