HL API: Use array element type as type of vararg KtValueParameterSymbol.

This commit is contained in:
Mark Punzalan
2021-09-04 08:18:40 +00:00
committed by Ilya Kirillov
parent 8dd40cb398
commit f4c5f02bfe
6 changed files with 193 additions and 6 deletions
@@ -8,9 +8,13 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.types.arrayElementType
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.KtFirAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.containsAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.getAnnotationClassIds
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.toAnnotationsList
@@ -38,8 +42,18 @@ internal class KtFirValueParameterSymbol(
override val name: Name get() = firRef.withFir { it.name }
override val isVararg: Boolean get() = firRef.withFir { it.isVararg }
override val annotatedType: KtTypeAndAnnotations by cached {
firRef.returnTypeAndAnnotations(FirResolvePhase.TYPES, builder)
override val annotatedType: KtTypeAndAnnotations by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir ->
if (fir.isVararg) {
val annotations = fir.returnTypeRef.annotations.map { annotation ->
KtFirAnnotationCall(firRef, annotation)
}
// There SHOULD always be an array element type (even if it is an error type, e.g., unresolved).
val arrayElementType = fir.returnTypeRef.coneType.arrayElementType()
?: error("No array element type for vararg value parameter: ${fir.renderWithType()}")
KtSimpleFirTypeAndAnnotations(arrayElementType, annotations, builder, firRef.token)
} else {
firRef.returnTypeAndAnnotations(FirResolvePhase.TYPES, builder)
}
}
override val hasDefaultValue: Boolean get() = firRef.withFir { it.defaultValue != null }
@@ -1,3 +1,3 @@
KtFunctionCall:
argumentMapping = { args -> (vararg a: kotlin.IntArray) }
targetFunction = /function(vararg a: kotlin.IntArray): kotlin.Unit
argumentMapping = { args -> (vararg a: kotlin.Int) }
targetFunction = /function(vararg a: kotlin.Int): kotlin.Unit
@@ -1,3 +1,3 @@
KtFunctionCall:
argumentMapping = { 1 -> (vararg a: kotlin.IntArray), 2 -> (vararg a: kotlin.IntArray), 3 -> (vararg a: kotlin.IntArray) }
targetFunction = /function(vararg a: kotlin.IntArray): kotlin.Unit
argumentMapping = { 1 -> (vararg a: kotlin.Int), 2 -> (vararg a: kotlin.Int), 3 -> (vararg a: kotlin.Int) }
targetFunction = /function(vararg a: kotlin.Int): kotlin.Unit
@@ -0,0 +1,4 @@
fun primitive(vararg a: Int)
fun nullablePrimitive(vararg b: Float?)
fun nonPrimitive(vararg c: Any)
fun error(vararg d: Unresolved)
@@ -0,0 +1,163 @@
KtFirValueParameterSymbol:
annotatedType: [] kotlin/Int
annotationClassIds: []
annotations: []
callableIdIfNonLocal: null
hasDefaultValue: false
isExtension: false
isVararg: true
name: a
origin: SOURCE
receiverType: null
symbolKind: LOCAL
deprecationStatus: null
KtFirFunctionSymbol:
annotatedType: [] kotlin/Unit
annotationClassIds: []
annotations: []
callableIdIfNonLocal: /primitive
dispatchType: null
hasStableParameterNames: true
isExtension: false
isExternal: false
isInfix: false
isInline: false
isOperator: false
isOverride: false
isStatic: false
isSuspend: false
modality: FINAL
name: primitive
origin: SOURCE
receiverType: null
symbolKind: TOP_LEVEL
typeParameters: []
valueParameters: [
KtFirValueParameterSymbol(a)
]
visibility: Public
deprecationStatus: null
KtFirValueParameterSymbol:
annotatedType: [] kotlin/Float?
annotationClassIds: []
annotations: []
callableIdIfNonLocal: null
hasDefaultValue: false
isExtension: false
isVararg: true
name: b
origin: SOURCE
receiverType: null
symbolKind: LOCAL
deprecationStatus: null
KtFirFunctionSymbol:
annotatedType: [] kotlin/Unit
annotationClassIds: []
annotations: []
callableIdIfNonLocal: /nullablePrimitive
dispatchType: null
hasStableParameterNames: true
isExtension: false
isExternal: false
isInfix: false
isInline: false
isOperator: false
isOverride: false
isStatic: false
isSuspend: false
modality: FINAL
name: nullablePrimitive
origin: SOURCE
receiverType: null
symbolKind: TOP_LEVEL
typeParameters: []
valueParameters: [
KtFirValueParameterSymbol(b)
]
visibility: Public
deprecationStatus: null
KtFirValueParameterSymbol:
annotatedType: [] kotlin/Any
annotationClassIds: []
annotations: []
callableIdIfNonLocal: null
hasDefaultValue: false
isExtension: false
isVararg: true
name: c
origin: SOURCE
receiverType: null
symbolKind: LOCAL
deprecationStatus: null
KtFirFunctionSymbol:
annotatedType: [] kotlin/Unit
annotationClassIds: []
annotations: []
callableIdIfNonLocal: /nonPrimitive
dispatchType: null
hasStableParameterNames: true
isExtension: false
isExternal: false
isInfix: false
isInline: false
isOperator: false
isOverride: false
isStatic: false
isSuspend: false
modality: FINAL
name: nonPrimitive
origin: SOURCE
receiverType: null
symbolKind: TOP_LEVEL
typeParameters: []
valueParameters: [
KtFirValueParameterSymbol(c)
]
visibility: Public
deprecationStatus: null
KtFirValueParameterSymbol:
annotatedType: [] ERROR CLASS: Symbol not found for Unresolved
annotationClassIds: []
annotations: []
callableIdIfNonLocal: null
hasDefaultValue: false
isExtension: false
isVararg: true
name: d
origin: SOURCE
receiverType: null
symbolKind: LOCAL
deprecationStatus: null
KtFirFunctionSymbol:
annotatedType: [] kotlin/Unit
annotationClassIds: []
annotations: []
callableIdIfNonLocal: /error
dispatchType: null
hasStableParameterNames: true
isExtension: false
isExternal: false
isInfix: false
isInline: false
isOperator: false
isOverride: false
isStatic: false
isSuspend: false
modality: FINAL
name: error
origin: SOURCE
receiverType: null
symbolKind: TOP_LEVEL
typeParameters: []
valueParameters: [
KtFirValueParameterSymbol(d)
]
visibility: Public
deprecationStatus: null
@@ -173,4 +173,10 @@ public class SymbolByPsiTestGenerated extends AbstractSymbolByPsiTest {
public void testTypeAnnotations() throws Exception {
runTest("idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAnnotations.kt");
}
@Test
@TestMetadata("varargFunctions.kt")
public void testVarargFunctions() throws Exception {
runTest("idea/idea-frontend-fir/testData/symbols/symbolByPsi/varargFunctions.kt");
}
}