From 7700484a1639eb6c1dd28699f1c1a6cac41c63d7 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Wed, 22 Feb 2023 13:55:50 +0000 Subject: [PATCH] [AA] Fix conversion of annotation values --- ...nnotationsOnDeclarationsTestGenerated.java | 6 +++++ .../evaluate/FirAnnotationValueConverter.kt | 27 ++++++++++++++++--- ...nnotationsOnDeclarationsTestGenerated.java | 6 +++++ ...nnotationsOnDeclarationsTestGenerated.java | 6 +++++ ...nnotationsOnDeclarationsTestGenerated.java | 6 +++++ .../direct/unsignedParameter.kt | 6 +++++ .../direct/unsignedParameter.txt | 5 ++++ .../kotlin/fir/types/ConeBuiltinTypeUtils.kt | 2 ++ .../WrongAnnotations.fir.java | 2 +- .../delegatesWithAnnotations.fir.java | 8 +++--- 10 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.kt create mode 100644 analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/annotations/Fe10IdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/annotations/Fe10IdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java index 9cf695d21b2..0a6a6c49ade 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/annotations/Fe10IdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/annotations/Fe10IdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java @@ -109,6 +109,12 @@ public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclaratio runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/onTypeAlias.kt"); } + @Test + @TestMetadata("unsignedParameter.kt") + public void testUnsignedParameter() throws Exception { + runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.kt"); + } + @Test @TestMetadata("varargComplexParameter.kt") public void testVarargComplexParameter() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt index a497ede67c7..d82745e5627 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.analysis.api.fir.evaluate import org.jetbrains.kotlin.analysis.api.annotations.* -import org.jetbrains.kotlin.analysis.api.base.KtConstantValueFactory +import org.jetbrains.kotlin.analysis.api.base.KtConstantValue import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession @@ -23,8 +23,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol -import org.jetbrains.kotlin.fir.types.ConeErrorType -import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtCallElement import org.jetbrains.kotlin.psi.KtClassOrObject @@ -44,7 +43,27 @@ internal object FirAnnotationValueConverter { } private fun FirConstExpression.convertConstantExpression(): KtConstantAnnotationValue? { - val constantValue = KtConstantValueFactory.createConstantValue(value, psi as? KtElement) ?: return null + val expression = psi as? KtElement + val type = (typeRef as? FirResolvedTypeRef)?.type + val constantValue = when { + value == null -> KtConstantValue.KtNullConstantValue(expression) + type == null -> return null + type.isBoolean -> KtConstantValue.KtBooleanConstantValue(value as Boolean, expression) + type.isChar -> KtConstantValue.KtCharConstantValue((value as? Char) ?: (value as Number).toInt().toChar(), expression) + type.isByte -> KtConstantValue.KtByteConstantValue((value as Number).toByte(), expression) + type.isUByte -> KtConstantValue.KtUnsignedByteConstantValue((value as Number).toByte().toUByte(), expression) + type.isShort -> KtConstantValue.KtShortConstantValue((value as Number).toShort(), expression) + type.isUShort -> KtConstantValue.KtUnsignedShortConstantValue((value as Number).toShort().toUShort(), expression) + type.isInt -> KtConstantValue.KtIntConstantValue((value as Number).toInt(), expression) + type.isUInt -> KtConstantValue.KtUnsignedIntConstantValue((value as Number).toInt().toUInt(), expression) + type.isLong -> KtConstantValue.KtLongConstantValue((value as Number).toLong(), expression) + type.isULong -> KtConstantValue.KtUnsignedLongConstantValue((value as Number).toLong().toULong(), expression) + type.isString -> KtConstantValue.KtStringConstantValue(value.toString(), expression) + type.isFloat -> KtConstantValue.KtFloatConstantValue((value as Number).toFloat(), expression) + type.isDouble -> KtConstantValue.KtDoubleConstantValue((value as Number).toDouble(), expression) + else -> return null + } + return KtConstantAnnotationValue(constantValue) } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeDependentAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeDependentAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java index a15f0309732..0b78de50d14 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeDependentAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeDependentAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java @@ -109,6 +109,12 @@ public class FirIdeDependentAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarat runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/onTypeAlias.kt"); } + @Test + @TestMetadata("unsignedParameter.kt") + public void testUnsignedParameter() throws Exception { + runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.kt"); + } + @Test @TestMetadata("varargComplexParameter.kt") public void testVarargComplexParameter() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java index 1d8358e903f..50244ff6ae9 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java @@ -109,6 +109,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclaration runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/onTypeAlias.kt"); } + @Test + @TestMetadata("unsignedParameter.kt") + public void testUnsignedParameter() throws Exception { + runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.kt"); + } + @Test @TestMetadata("varargComplexParameter.kt") public void testVarargComplexParameter() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/annotations/FirStandaloneNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/annotations/FirStandaloneNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java index 2c62d494ec5..5dac3312912 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/annotations/FirStandaloneNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/annotations/FirStandaloneNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java @@ -109,6 +109,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDecl runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/onTypeAlias.kt"); } + @Test + @TestMetadata("unsignedParameter.kt") + public void testUnsignedParameter() throws Exception { + runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.kt"); + } + @Test @TestMetadata("varargComplexParameter.kt") public void testVarargComplexParameter() throws Exception { diff --git a/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.kt b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.kt new file mode 100644 index 00000000000..22b316a8758 --- /dev/null +++ b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.kt @@ -0,0 +1,6 @@ +// WITH_STDLIB + +annotation class A(vararg val xs: ULong) + +@A(1234u, 18446744073709551615u) +fun foo(): Int = 42 \ No newline at end of file diff --git a/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.txt b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.txt new file mode 100644 index 00000000000..62ab3ce2c0a --- /dev/null +++ b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/unsignedParameter.txt @@ -0,0 +1,5 @@ +KtDeclaration: KtNamedFunction foo +annotations: [ + A(xs = [1234uL, 18446744073709551615uL]) + psi: KtAnnotationEntry +] diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeBuiltinTypeUtils.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeBuiltinTypeUtils.kt index 5613ba8142e..4d7c8df4ada 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeBuiltinTypeUtils.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeBuiltinTypeUtils.kt @@ -30,6 +30,8 @@ val ConeKotlinType.isString: Boolean get() = isBuiltinType(StandardClassIds.Stri val ConeKotlinType.isEnum: Boolean get() = isBuiltinType(StandardClassIds.Enum, false) +val ConeKotlinType.isUByte: Boolean get() = isBuiltinType(StandardClassIds.UByte, false) +val ConeKotlinType.isUShort: Boolean get() = isBuiltinType(StandardClassIds.UShort, false) val ConeKotlinType.isUInt: Boolean get() = isBuiltinType(StandardClassIds.UInt, false) val ConeKotlinType.isULong: Boolean get() = isBuiltinType(StandardClassIds.ULong, false) val ConeKotlinType.isPrimitiveOrNullablePrimitive: Boolean get() = isAnyOfBuiltinType(StandardClassIds.primitiveTypes) diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/WrongAnnotations.fir.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/WrongAnnotations.fir.java index 000a4391ecb..e02fc7fae13 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/WrongAnnotations.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/WrongAnnotations.fir.java @@ -14,7 +14,7 @@ public final class A /* A*/ { @kotlin.jvm.JvmName(name = "realName") public final void realName();// realName() - @kotlin.jvm.JvmName(name = 1L) + @kotlin.jvm.JvmName(name = 1) public final void f2();// f2() @kotlin.jvm.JvmOverloads() diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/delegatesWithAnnotations.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/delegatesWithAnnotations.fir.java index 8431e0f486b..0e9c4bd8ab0 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/delegatesWithAnnotations.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/delegatesWithAnnotations.fir.java @@ -14,14 +14,14 @@ public abstract @interface Ann /* Ann*/ { } public abstract interface Base /* Base*/ { - @Ann(x = 1L, y = "134", z = java.lang.String.class, e = {int.class, double.class}, depr = kotlin.DeprecationLevel.WARNING, t = {SimpleAnn("243"), SimpleAnn("4324")}) - public abstract void foo(@Ann(x = 2L, y = "324", z = Ann.class, e = {byte.class, Base.class}, depr = kotlin.DeprecationLevel.WARNING, t = {SimpleAnn("687"), SimpleAnn("78")}) @org.jetbrains.annotations.NotNull() java.lang.String);// foo(java.lang.String) + @Ann(x = 1, y = "134", z = java.lang.String.class, e = {int.class, double.class}, depr = kotlin.DeprecationLevel.WARNING, t = {SimpleAnn("243"), SimpleAnn("4324")}) + public abstract void foo(@Ann(x = 2, y = "324", z = Ann.class, e = {byte.class, Base.class}, depr = kotlin.DeprecationLevel.WARNING, t = {SimpleAnn("687"), SimpleAnn("78")}) @org.jetbrains.annotations.NotNull() java.lang.String);// foo(java.lang.String) } public final class Derived /* Derived*/ implements Base { - @Ann(x = 1L, y = "134", z = java.lang.String.class, e = {int.class, double.class}, depr = kotlin.DeprecationLevel.WARNING, t = {SimpleAnn("243"), SimpleAnn("4324")}) + @Ann(x = 1, y = "134", z = java.lang.String.class, e = {int.class, double.class}, depr = kotlin.DeprecationLevel.WARNING, t = {SimpleAnn("243"), SimpleAnn("4324")}) @java.lang.Override() - public void foo(@Ann(x = 2L, y = "324", z = Ann.class, e = {byte.class, Base.class}, depr = kotlin.DeprecationLevel.WARNING, t = {SimpleAnn("687"), SimpleAnn("78")}) @org.jetbrains.annotations.NotNull() java.lang.String);// foo(java.lang.String) + public void foo(@Ann(x = 2, y = "324", z = Ann.class, e = {byte.class, Base.class}, depr = kotlin.DeprecationLevel.WARNING, t = {SimpleAnn("687"), SimpleAnn("78")}) @org.jetbrains.annotations.NotNull() java.lang.String);// foo(java.lang.String) public Derived(@org.jetbrains.annotations.NotNull() Base);// .ctor(Base) }