FIR/UAST: commonoize array access expression
This commit is contained in:
committed by
teamcityserver
parent
ef8eddf1da
commit
1517fd0ca0
+25
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
+14
@@ -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)
|
||||
+9
-4
@@ -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
|
||||
|
||||
+6
-10
@@ -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 )
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user