From bd7689d381d0159f65bd0c77f8f282758651dc13 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 4 Mar 2021 15:01:00 +0300 Subject: [PATCH] [FIR] Properly compute default arguments of java annotations --- .../kotlin/fir/java/JavaSymbolProvider.kt | 4 ++-- .../jetbrains/kotlin/fir/java/JavaUtils.kt | 21 ++++++++++++++----- .../java/enhancement/SignatureEnhancement.kt | 2 ++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 4a218a59f0a..7bdbbe845c2 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -454,8 +454,8 @@ class JavaSymbolProvider( session = this@JavaSymbolProvider.session returnTypeRef = firJavaMethod.returnTypeRef name = methodName - if (javaMethod.hasAnnotationParameterDefaultValue) { - defaultValue = buildExpressionStub() + javaMethod.annotationParameterDefaultValue?.let { javaDefaultValue -> + defaultValue = javaDefaultValue.toFirExpression(session, javaTypeParameterStack, returnTypeRef) } isVararg = returnType is JavaArrayType && methodName == VALUE_METHOD_NAME annotationBuilder = { emptyList() } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt index 368ae99b351..4962eb1e781 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef +import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl @@ -519,7 +520,7 @@ private fun buildArgumentMapping( val mapping = annotationArguments.associateTo(linkedMapOf()) { argument -> val parameter = annotationConstructor.valueParameters.find { it.name == (argument.name ?: JavaSymbolProvider.VALUE_METHOD_NAME) } ?: return null - argument.toFirExpression(session, javaTypeParameterStack) to parameter + argument.toFirExpression(session, javaTypeParameterStack, parameter.returnTypeRef) to parameter } return buildResolvedArgumentList(mapping) } @@ -555,7 +556,12 @@ internal fun JavaAnnotation.toFirAnnotationCall( null -> null else -> buildArgumentMapping(session, javaTypeParameterStack, lookupTag!!, arguments) } ?: buildArgumentList { - this@toFirAnnotationCall.arguments.mapTo(arguments) { it.toFirExpression(session, javaTypeParameterStack) } + this@toFirAnnotationCall.arguments.mapTo(arguments) { + val expectedArgumentType = buildErrorTypeRef { + diagnostic = ConeSimpleDiagnostic("java annotation argument without expected type") + } + it.toFirExpression(session, javaTypeParameterStack, expectedArgumentType) + } } calleeReference = FirReferencePlaceholderForResolvedAnnotations } @@ -624,14 +630,19 @@ private fun JavaType?.toConeProjectionWithoutEnhancement( } } -private fun JavaAnnotationArgument.toFirExpression( - session: FirSession, javaTypeParameterStack: JavaTypeParameterStack +internal fun JavaAnnotationArgument.toFirExpression( + session: FirSession, javaTypeParameterStack: JavaTypeParameterStack, expectedTypeRef: FirTypeRef ): FirExpression { return when (this) { is JavaLiteralAnnotationArgument -> value.createConstantOrError(session) is JavaArrayAnnotationArgument -> buildArrayOfCall { + typeRef = expectedTypeRef + val argumentTypeRef = buildResolvedTypeRef { + type = expectedTypeRef.coneTypeSafe()?.lowerBoundIfFlexible()?.arrayElementType() + ?: ConeClassErrorType(ConeSimpleDiagnostic("expected type is not array type")) + } argumentList = buildArgumentList { - getElements().mapTo(arguments) { it.toFirExpression(session, javaTypeParameterStack) } + getElements().mapTo(arguments) { it.toFirExpression(session, javaTypeParameterStack, argumentTypeRef) } } } is JavaEnumValueAnnotationArgument -> buildEnumCall(session, enumClassId, entryName) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index aaa14c2b42c..73477522cf7 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -203,6 +203,8 @@ class FirSignatureEnhancement( } val newValueParameters = firMethod.valueParameters.zip(enhancedValueParameterTypes) { valueParameter, enhancedReturnType -> + valueParameter.defaultValue?.replaceTypeRef(enhancedReturnType) + buildValueParameter { source = valueParameter.source session = this@FirSignatureEnhancement.session