[FIR] Complete types of array literals in annotations
This commit is contained in:
+4
@@ -0,0 +1,4 @@
|
||||
annotation class Ann(vararg val strings: String)
|
||||
|
||||
@Ann(strings = ["hello"])
|
||||
class A
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
FILE: namedArrayInAnnotation.kt
|
||||
public final annotation class Ann : R|kotlin/Annotation| {
|
||||
public constructor(vararg strings: R|kotlin/Array<out kotlin/String>|): R|Ann| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
public final val strings: R|kotlin/Array<out kotlin/String>| = R|<local>/strings|
|
||||
public get(): R|kotlin/Array<out kotlin/String>|
|
||||
|
||||
}
|
||||
@R|Ann|(vararg(strings = <implicitArrayOf>(String(hello)))) public final class A : R|kotlin/Any| {
|
||||
public constructor(): R|A| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
}
|
||||
Generated
+5
@@ -530,6 +530,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/arguments/lambdaInUnresolvedCall.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("namedArrayInAnnotation.kt")
|
||||
public void testNamedArrayInAnnotation() throws Exception {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/arguments/namedArrayInAnnotation.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("operatorsOverLiterals.kt")
|
||||
public void testOperatorsOverLiterals() throws Exception {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/arguments/operatorsOverLiterals.kt");
|
||||
|
||||
+5
@@ -530,6 +530,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/arguments/lambdaInUnresolvedCall.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("namedArrayInAnnotation.kt")
|
||||
public void testNamedArrayInAnnotation() throws Exception {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/arguments/namedArrayInAnnotation.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("operatorsOverLiterals.kt")
|
||||
public void testOperatorsOverLiterals() throws Exception {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/arguments/operatorsOverLiterals.kt");
|
||||
|
||||
+13
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.FirErrorReferenceWithCandidate
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.varargElementType
|
||||
import org.jetbrains.kotlin.fir.resolve.constructFunctionalTypeRef
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.inferenceComponents
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.isBuiltinFunctionalType
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.isSuspendFunctionType
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.returnType
|
||||
@@ -34,6 +35,7 @@ import org.jetbrains.kotlin.fir.types.builder.buildStarProjection
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildTypeProjectionWithVariance
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator
|
||||
import org.jetbrains.kotlin.types.AbstractTypeApproximator
|
||||
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
@@ -537,6 +539,17 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
return constExpression.transform(integerApproximator, expectedType)
|
||||
}
|
||||
|
||||
override fun transformArrayOfCall(arrayOfCall: FirArrayOfCall, data: ExpectedArgumentType?): CompositeTransformResult<FirStatement> {
|
||||
if (arrayOfCall.typeRef !is FirImplicitTypeRef) return arrayOfCall.compose()
|
||||
val expectedArrayType = data?.getExpectedType(arrayOfCall)
|
||||
val expectedArrayElementType = expectedArrayType?.arrayElementType()
|
||||
arrayOfCall.transformChildren(this, expectedArrayElementType?.toExpectedType())
|
||||
val arrayElementType = session.inferenceComponents.ctx.commonSuperTypeOrNull(arrayOfCall.arguments.map { it.typeRef.coneType })
|
||||
?: session.builtinTypes.nullableAnyType.type
|
||||
arrayOfCall.resultType = arrayOfCall.typeRef.resolvedTypeFromPrototype(arrayElementType.createArrayOf())
|
||||
return arrayOfCall.compose()
|
||||
}
|
||||
|
||||
private fun FirNamedReferenceWithCandidate.toResolvedReference() = if (this is FirErrorReferenceWithCandidate) {
|
||||
buildErrorNamedReference {
|
||||
source = this@toResolvedReference.source
|
||||
|
||||
Reference in New Issue
Block a user