Skip to content

Commit 01a9d9a

Browse files
committed
Support lazy conversion of parent chain; correctly check expected class
1 parent 8c3936a commit 01a9d9a

11 files changed

+157
-103
lines changed

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt

Lines changed: 125 additions & 86 deletions
Large diffs are not rendered by default.

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/ElvisExpression.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ private fun createElvisExpressions(
5656
override val uastParent: UElement? = containingElement
5757
override val condition: UExpression by lz { createNotEqWithNullExpression(tempVariable, this) }
5858
override val thenExpression: UExpression? by lz { createVariableReferenceExpression(tempVariable, this) }
59-
override val elseExpression: UExpression? by lz { KotlinConverter.convertExpression(right, this) }
59+
override val elseExpression: UExpression? by lz { KotlinConverter.convertExpression(right, this.toCallback() ) }
6060
override val isTernary: Boolean = false
6161
override val annotations: List<UAnnotation> = emptyList()
6262
override val ifIdentifier: UIdentifier = UIdentifier(null, this)
@@ -66,9 +66,9 @@ private fun createElvisExpressions(
6666
return listOf(declaration, ifExpression)
6767
}
6868

69-
fun createElvisExpression(elvisExpression: KtBinaryExpression, containingElement: UElement?): UExpressionList? {
70-
val left = elvisExpression.left ?: return null
71-
val right = elvisExpression.right ?: return null
69+
fun createElvisExpression(elvisExpression: KtBinaryExpression, containingElement: UElement?): UExpression {
70+
val left = elvisExpression.left ?: return UastEmptyExpression
71+
val right = elvisExpression.right ?: return UastEmptyExpression
7272

7373
return object : UExpressionList, KotlinEvaluatableUElement, KotlinUElementWithType {
7474
override val psi: PsiElement? = elvisExpression

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class KotlinUCallableReferenceExpression(
3131
get() {
3232
if (qualifierType != null) return null
3333
val receiverExpression = psi.receiverExpression ?: return null
34-
return KotlinConverter.convertExpression(receiverExpression, this)
34+
return KotlinConverter.convertExpression(receiverExpression, { this })
3535
}
3636

3737
override val qualifierType by lz {

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ class KotlinUClassLiteralExpression(
3535
get() {
3636
if (type != null) return null
3737
val receiverExpression = psi.receiverExpression ?: return null
38-
return KotlinConverter.convertExpression(receiverExpression, this)
38+
return KotlinConverter.convertExpression(receiverExpression, { this })
3939
}
4040
}

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ import com.intellij.psi.PsiElement
1919
import org.jetbrains.uast.kotlin.KotlinAbstractUExpression
2020

2121
class KotlinUDeclarationsExpression(
22+
override val psi: PsiElement?,
2223
override val uastParent: UElement?
2324
) : KotlinAbstractUExpression(), UDeclarationsExpression {
24-
override val psi: PsiElement?
25-
get() = null
25+
26+
constructor(uastParent: UElement?) : this(null, uastParent)
2627

2728
override lateinit var declarations: List<UDeclaration>
2829
internal set

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.jetbrains.uast.UElement
2424
import org.jetbrains.uast.UExpression
2525
import org.jetbrains.uast.UExpressionList
2626
import org.jetbrains.uast.UastSpecialExpressionKind
27+
import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds
2728

2829
open class KotlinUExpressionList(
2930
override val psi: PsiElement?,
@@ -38,4 +39,11 @@ open class KotlinUExpressionList(
3839
val compileTimeConst = ktElement.analyze()[BindingContext.COMPILE_TIME_VALUE, ktElement]
3940
return compileTimeConst?.getValue(TypeUtils.NO_EXPECTED_TYPE)
4041
}
41-
}
42+
43+
companion object {
44+
fun createClassBody(psi: PsiElement?, uastParent: UElement?): KotlinUExpressionList =
45+
KotlinUExpressionList(psi, KotlinSpecialExpressionKinds.CLASS_BODY, uastParent).apply {
46+
expressions = emptyList()
47+
}
48+
}
49+
}

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import org.jetbrains.uast.visitor.UastVisitor
3535
class KotlinUFunctionCallExpression(
3636
override val psi: KtCallExpression,
3737
override val uastParent: UElement?,
38-
private val _resolvedCall: ResolvedCall<*>? = null
38+
private val _resolvedCall: ResolvedCall<*>?
3939
) : KotlinAbstractUExpression(), UCallExpression, KotlinUElementWithType {
4040
companion object {
4141
fun resolveSource(descriptor: DeclarationDescriptor, source: PsiElement?): PsiMethod? {
@@ -53,6 +53,8 @@ class KotlinUFunctionCallExpression(
5353
}
5454
}
5555

56+
constructor(psi: KtCallExpression, uastParent: UElement?): this(psi, uastParent, null)
57+
5658
private val resolvedCall by lz {
5759
_resolvedCall ?: psi.getResolvedCall(psi.analyze())
5860
}

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616

1717
package org.jetbrains.uast.kotlin
1818

19-
import com.intellij.openapi.util.text.StringUtil
2019
import com.intellij.psi.PsiElement
2120
import org.jetbrains.kotlin.KtNodeTypes
2221
import org.jetbrains.kotlin.psi.KtConstantExpression
22+
import org.jetbrains.kotlin.psi.KtEscapeStringTemplateEntry
2323
import org.jetbrains.uast.UElement
2424
import org.jetbrains.uast.ULiteralExpression
2525

@@ -36,10 +36,13 @@ class KotlinULiteralExpression(
3636
class KotlinStringULiteralExpression(
3737
override val psi: PsiElement,
3838
override val uastParent: UElement?,
39-
val text: String? = null
39+
val text: String
4040
) : KotlinAbstractUExpression(), ULiteralExpression, KotlinUElementWithType{
41+
constructor(psi: PsiElement, uastParent: UElement?)
42+
: this(psi, uastParent, if (psi is KtEscapeStringTemplateEntry) psi.unescapedValue else psi.text)
43+
4144
override val value: String
42-
get() = text ?: StringUtil.unescapeStringCharacters(psi.text)
45+
get() = text
4346

4447
override fun evaluate() = value
4548
}

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@ import org.jetbrains.uast.visitor.UastVisitor
3535

3636
open class KotlinUSimpleReferenceExpression(
3737
override val psi: KtSimpleNameExpression,
38-
override val identifier: String,
3938
override val uastParent: UElement?
4039
) : KotlinAbstractUExpression(), USimpleNameReferenceExpression, KotlinUElementWithType, KotlinEvaluatableUElement {
4140
private val resolvedDeclaration by lz { psi.resolveCallToDeclaration(this) }
4241

42+
override val identifier get() = psi.getReferencedName()
43+
4344
override fun resolve() = resolvedDeclaration
4445

4546
override val resolvedName: String?

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class KotlinUSwitchExpression(
2828
override val expression by lz { KotlinConverter.convertOrNull(psi.subjectExpression, this) }
2929

3030
override val body: UExpressionList by lz {
31-
object : KotlinUExpressionList(psi, KotlinSpecialExpressionKinds.WHEN, this) {
31+
object : KotlinUExpressionList(psi, KotlinSpecialExpressionKinds.WHEN, this@KotlinUSwitchExpression) {
3232
override fun asRenderString() = expressions.joinToString("\n") { it.asRenderString().withMargin }
3333
}.apply {
3434
expressions = this@KotlinUSwitchExpression.psi.entries.map { KotlinUSwitchEntry(it, this) }
@@ -77,7 +77,7 @@ class KotlinUSwitchEntry(
7777
}
7878

7979
override val body: UExpressionList by lz {
80-
object : KotlinUExpressionList(psi, KotlinSpecialExpressionKinds.WHEN_ENTRY, this) {
80+
object : KotlinUExpressionList(psi, KotlinSpecialExpressionKinds.WHEN_ENTRY, this@KotlinUSwitchEntry) {
8181
override fun asRenderString() = buildString {
8282
appendln("{")
8383
expressions.forEach { appendln(it.asRenderString().withMargin) }

plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTryExpression.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class KotlinUTryExpression(
2828
) : KotlinAbstractUExpression(), UTryExpression, KotlinUElementWithType {
2929
override val tryClause by lz { KotlinConverter.convertOrEmpty(psi.tryBlock, this) }
3030
override val catchClauses by lz { psi.catchClauses.map { KotlinUCatchClause(it, this) } }
31-
override val finallyClause by lz { psi.finallyBlock?.finalExpression?.let { KotlinConverter.convertExpression(it, this) } }
31+
override val finallyClause by lz { psi.finallyBlock?.finalExpression?.let { KotlinConverter.convertExpression(it, { this }) } }
3232

3333
override val resourceVariables: List<UVariable>
3434
get() = emptyList()

0 commit comments

Comments
 (0)