diff --git a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinAbstractUArrayAccessExpression.kt b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinAbstractUArrayAccessExpression.kt new file mode 100644 index 00000000000..833bb706ec3 --- /dev/null +++ b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinAbstractUArrayAccessExpression.kt @@ -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) + } + } +} diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt index 5b719df962d..4d6be47e41a 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt @@ -294,6 +294,8 @@ internal object FirKotlinConverter : BaseKotlinConverter { is KtBinaryExpressionWithTypeRHS -> expr(build(::KotlinUBinaryExpressionWithType)) is KtIsExpression -> expr(build(::KotlinUTypeCheckExpression)) + is KtArrayAccessExpression -> expr(build(::FirKotlinUArrayAccessExpression)) + else -> expr(build(::UnknownKotlinExpression)) } } diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/expressions/FirKotlinUArrayAccessExpression.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/expressions/FirKotlinUArrayAccessExpression.kt new file mode 100644 index 00000000000..75cc8da6529 --- /dev/null +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/expressions/FirKotlinUArrayAccessExpression.kt @@ -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) diff --git a/plugins/uast-kotlin-fir/testData/type/arrayGetAssignMultiIndex.types.fir.txt b/plugins/uast-kotlin-fir/testData/type/arrayGetAssignMultiIndex.types.fir.txt index 064e0e72adb..6c3cdf47137 100644 --- a/plugins/uast-kotlin-fir/testData/type/arrayGetAssignMultiIndex.types.fir.txt +++ b/plugins/uast-kotlin-fir/testData/type/arrayGetAssignMultiIndex.types.fir.txt @@ -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 diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt index a3d60c38837..1f2e4d024f3 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt @@ -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.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 ) } - -} \ No newline at end of file +}