From 534ff58d9cfb3943bcb4220092ea2b017c9c7100 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 10 Apr 2020 16:09:55 +0300 Subject: [PATCH] Minor. Introduce constant JVM_THROWS_ANNOTATION_FQ_NAME KT-35468 --- .../org/jetbrains/kotlin/codegen/FunctionCodegen.java | 4 ++-- .../src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt | 5 +++++ .../kotlin/backend/jvm/codegen/FunctionCodegen.kt | 3 ++- .../idea/intentions/AddThrowsAnnotationIntention.kt | 9 ++++----- nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt | 5 +++-- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 655aaab406e..d58ff679268 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -32,12 +32,12 @@ import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature; import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.SpecialBuiltinMembers; import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor; -import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.InlineClassesUtilsKt; +import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt; import org.jetbrains.kotlin.resolve.calls.util.UnderscoreUtilKt; import org.jetbrains.kotlin.resolve.constants.ArrayValue; import org.jetbrains.kotlin.resolve.constants.ConstantValue; @@ -1118,7 +1118,7 @@ public class FunctionCodegen { return Collections.emptyList(); } - AnnotationDescriptor annotation = function.getAnnotations().findAnnotation(new FqName("kotlin.jvm.Throws")); + AnnotationDescriptor annotation = function.getAnnotations().findAnnotation(AnnotationUtilKt.JVM_THROWS_ANNOTATION_FQ_NAME); if (annotation == null) return Collections.emptyList(); Collection> values = annotation.getAllValueArguments().values(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt index 578943d85b6..c55dccc24a8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt @@ -42,3 +42,8 @@ fun AnnotationDescriptor.argumentValue(parameterName: String): ConstantValue<*>? DeprecationLevel.ERROR ) val JVM_FIELD_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmField") + +// This annotation is declared here in frontend (as opposed to frontend.java) because it's used in AllUnderImportScope +// If you wish to add another JVM-related annotation and has/find utility methods, please proceed to jvmAnnotationUtil.kt +@JvmField +val JVM_THROWS_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.Throws") diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index cb8416c6ee5..cfc3c90b79a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.annotations.JVM_THROWS_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_SYNTHETIC_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.STRICTFP_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.SYNCHRONIZED_ANNOTATION_FQ_NAME @@ -168,7 +169,7 @@ class FunctionCodegen( ) return null // @Throws(vararg exceptionClasses: KClass) - val exceptionClasses = function.getAnnotation(FqName("kotlin.jvm.Throws"))?.getValueArgument(0) ?: return null + val exceptionClasses = function.getAnnotation(JVM_THROWS_ANNOTATION_FQ_NAME)?.getValueArgument(0) ?: return null return (exceptionClasses as IrVararg).elements.map { exceptionClass -> context.typeMapper.mapType((exceptionClass as IrClassReference).classType).internalName } diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/AddThrowsAnnotationIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/AddThrowsAnnotationIntention.kt index 1155dc03d65..8b5fff9a02d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/AddThrowsAnnotationIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/AddThrowsAnnotationIntention.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypesAndPredicate import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.annotations.JVM_THROWS_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode @@ -64,7 +65,7 @@ class AddThrowsAnnotationIntention : SelfTargetingIntention( if (annotationEntry == null || annotationEntry.valueArguments.isEmpty()) { annotationEntry?.delete() val whiteSpaceText = if (containingDeclaration is KtPropertyAccessor) " " else "\n" - containingDeclaration.addAnnotation(throwsAnnotationFqName, annotationArgumentText, whiteSpaceText) + containingDeclaration.addAnnotation(JVM_THROWS_ANNOTATION_FQ_NAME, annotationArgumentText, whiteSpaceText) } else { val factory = KtPsiFactory(element) val argument = annotationEntry.valueArguments.firstOrNull() @@ -91,8 +92,6 @@ class AddThrowsAnnotationIntention : SelfTargetingIntention( } } -private val throwsAnnotationFqName = FqName("kotlin.jvm.Throws") - private fun KtThrowExpression.getContainingDeclaration(): KtDeclaration? { val parent = getParentOfTypesAndPredicate( true, @@ -110,7 +109,7 @@ private fun KtDeclaration.findThrowsAnnotation(context: BindingContext): KtAnnot val annotationEntries = this.annotationEntries + (parent as? KtProperty)?.annotationEntries.orEmpty() return annotationEntries.find { val typeReference = it.typeReference ?: return@find false - context[BindingContext.TYPE, typeReference]?.constructor?.declarationDescriptor?.fqNameSafe == throwsAnnotationFqName + context[BindingContext.TYPE, typeReference]?.constructor?.declarationDescriptor?.fqNameSafe == JVM_THROWS_ANNOTATION_FQ_NAME } } @@ -131,4 +130,4 @@ private fun KtPsiFactory.createCollectionLiteral(expressions: List } appendFixedText(lastExpression) appendFixedText("]") - } as KtCollectionLiteralExpression \ No newline at end of file + } as KtCollectionLiteralExpression diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt index 6d05fa4c095..21dbb7a553e 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.nj2k.types.JKNoType import org.jetbrains.kotlin.nj2k.types.JKType import org.jetbrains.kotlin.nj2k.types.JKTypeFactory import org.jetbrains.kotlin.nj2k.types.replaceJavaClassWithKotlinClassType +import org.jetbrains.kotlin.resolve.annotations.JVM_THROWS_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -126,7 +127,7 @@ fun jvmAnnotation(name: String, symbolProvider: JKSymbolProvider) = fun throwAnnotation(throws: List, symbolProvider: JKSymbolProvider) = JKAnnotation( - symbolProvider.provideClassSymbol("kotlin.jvm.Throws"), + symbolProvider.provideClassSymbol(JVM_THROWS_ANNOTATION_FQ_NAME.asString()), throws.map { JKAnnotationParameterImpl( JKClassLiteralExpression(JKTypeElement(it), JKClassLiteralExpression.ClassLiteralType.KOTLIN_CLASS) @@ -352,4 +353,4 @@ val JKTreeElement.identifier: JKSymbol? } val JKClass.isObjectOrCompanionObject - get() = classKind == JKClass.ClassKind.OBJECT || classKind == JKClass.ClassKind.COMPANION \ No newline at end of file + get() = classKind == JKClass.ClassKind.OBJECT || classKind == JKClass.ClassKind.COMPANION