FIR/UAST: commonoize array access expression

This commit is contained in:
Jinseong Jeon
2021-06-01 16:16:02 -07:00
committed by teamcityserver
parent ef8eddf1da
commit 1517fd0ca0
5 changed files with 56 additions and 14 deletions
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.uast.kotlin
import org.jetbrains.kotlin.psi.KtArrayAccessExpression
import org.jetbrains.uast.UArrayAccessExpression
import org.jetbrains.uast.UElement
abstract class KotlinAbstractUArrayAccessExpression(
override val sourcePsi: KtArrayAccessExpression,
givenParent: UElement?
) : KotlinAbstractUExpression(givenParent), UArrayAccessExpression, KotlinUElementWithType, KotlinEvaluatableUElement {
override val receiver by lz {
baseResolveProviderService.baseKotlinConverter.convertOrEmpty(sourcePsi.arrayExpression, this)
}
override val indices by lz {
sourcePsi.indexExpressions.map {
baseResolveProviderService.baseKotlinConverter.convertOrEmpty(it, this)
}
}
}
@@ -294,6 +294,8 @@ internal object FirKotlinConverter : BaseKotlinConverter {
is KtBinaryExpressionWithTypeRHS -> expr<UBinaryExpressionWithType>(build(::KotlinUBinaryExpressionWithType))
is KtIsExpression -> expr<UBinaryExpressionWithType>(build(::KotlinUTypeCheckExpression))
is KtArrayAccessExpression -> expr<UArrayAccessExpression>(build(::FirKotlinUArrayAccessExpression))
else -> expr<UExpression>(build(::UnknownKotlinExpression))
}
}
@@ -0,0 +1,14 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.uast.kotlin
import org.jetbrains.kotlin.psi.KtArrayAccessExpression
import org.jetbrains.uast.UElement
class FirKotlinUArrayAccessExpression(
override val sourcePsi: KtArrayAccessExpression,
givenParent: UElement?
) : KotlinAbstractUArrayAccessExpression(sourcePsi, givenParent)
@@ -5,8 +5,10 @@ UFile (package = ) [public final class ArrayGetAssignMultiIndexKt {...]
UParameter (name = index1) [var index1: int]
UParameter (name = index2) [var index2: int]
UBlockExpression [{...}]
UReturnExpression [return [!] UnknownKotlinExpression (ARRAY_ACCESS_EXPRESSION)]
[!] UnknownKotlinExpression (ARRAY_ACCESS_EXPRESSION) [[!] UnknownKotlinExpression (ARRAY_ACCESS_EXPRESSION)]
UReturnExpression [return [!] UnknownKotlinExpression (THIS_EXPRESSION)[[!] UnknownKotlinExpression (BINARY_EXPRESSION)]]
UArrayAccessExpression [[!] UnknownKotlinExpression (THIS_EXPRESSION)[[!] UnknownKotlinExpression (BINARY_EXPRESSION)]] : PsiType:String
[!] UnknownKotlinExpression (THIS_EXPRESSION) [[!] UnknownKotlinExpression (THIS_EXPRESSION)]
[!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)]
UMethod (name = set) [public static final fun set($this$set: java.lang.String[], index1: int, index2: int, elem: java.lang.String) : void {...}]
UParameter (name = $this$set) [var $this$set: java.lang.String[]]
UParameter (name = index1) [var index1: int]
@@ -19,5 +21,8 @@ UFile (package = ) [public final class ArrayGetAssignMultiIndexKt {...]
[!] UnknownKotlinExpression (PROPERTY) [[!] UnknownKotlinExpression (PROPERTY)]
[!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)]
[!] UnknownKotlinExpression (BINARY_EXPRESSION) [[!] UnknownKotlinExpression (BINARY_EXPRESSION)]
UReturnExpression [return [!] UnknownKotlinExpression (ARRAY_ACCESS_EXPRESSION)] : PsiType:Void
[!] UnknownKotlinExpression (ARRAY_ACCESS_EXPRESSION) [[!] UnknownKotlinExpression (ARRAY_ACCESS_EXPRESSION)]
UReturnExpression [return [!] UnknownKotlinExpression (REFERENCE_EXPRESSION)[[!] UnknownKotlinExpression (PREFIX_EXPRESSION), "not-yet-compile-time-constant"]] : PsiType:Void
UArrayAccessExpression [[!] UnknownKotlinExpression (REFERENCE_EXPRESSION)[[!] UnknownKotlinExpression (PREFIX_EXPRESSION), "not-yet-compile-time-constant"]] : PsiType:String
[!] UnknownKotlinExpression (REFERENCE_EXPRESSION) [[!] UnknownKotlinExpression (REFERENCE_EXPRESSION)]
[!] UnknownKotlinExpression (PREFIX_EXPRESSION) [[!] UnknownKotlinExpression (PREFIX_EXPRESSION)]
ULiteralExpression (value = "not-yet-compile-time-constant") ["not-yet-compile-time-constant"] : PsiType:int
@@ -19,23 +19,19 @@ package org.jetbrains.uast.kotlin
import com.intellij.psi.PsiType
import org.jetbrains.kotlin.psi.KtArrayAccessExpression
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.uast.UArrayAccessExpression
import org.jetbrains.uast.UElement
class KotlinUArrayAccessExpression(
override val sourcePsi: KtArrayAccessExpression,
givenParent: UElement?
) : KotlinAbstractUExpression(givenParent), UArrayAccessExpression, KotlinUElementWithType, KotlinEvaluatableUElement {
override val receiver by lz { KotlinConverter.convertOrEmpty(sourcePsi.arrayExpression, this) }
override val indices by lz { sourcePsi.indexExpressions.map { KotlinConverter.convertOrEmpty(it, this) } }
override val sourcePsi: KtArrayAccessExpression,
givenParent: UElement?
) : KotlinAbstractUArrayAccessExpression(sourcePsi, givenParent) {
override fun getExpressionType(): PsiType? {
super<KotlinUElementWithType>.getExpressionType()?.let { return it }
super.getExpressionType()?.let { return it }
// for unknown reason in assigment position there is no `EXPRESSION_TYPE_INFO` so we getting it from the array type
// for unknown reason in assignment position there is no `EXPRESSION_TYPE_INFO` so we getting it from the array type
val arrayExpression = sourcePsi.arrayExpression ?: return null
val arrayType = arrayExpression.analyze()[BindingContext.EXPRESSION_TYPE_INFO, arrayExpression]?.type ?: return null
return arrayType.arguments.firstOrNull()?.type?.toPsiType(this, arrayExpression, false )
}
}
}