Minor. Introduce constant JVM_THROWS_ANNOTATION_FQ_NAME

KT-35468
This commit is contained in:
Denis Zharkov
2020-04-10 16:09:55 +03:00
committed by Ilya Gorbunov
parent 1565fc0211
commit 534ff58d9c
5 changed files with 16 additions and 10 deletions
@@ -32,12 +32,12 @@ import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature;
import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.JvmAbi;
import org.jetbrains.kotlin.load.java.SpecialBuiltinMembers; import org.jetbrains.kotlin.load.java.SpecialBuiltinMembers;
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor; import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.InlineClassesUtilsKt; 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.calls.util.UnderscoreUtilKt;
import org.jetbrains.kotlin.resolve.constants.ArrayValue; import org.jetbrains.kotlin.resolve.constants.ArrayValue;
import org.jetbrains.kotlin.resolve.constants.ConstantValue; import org.jetbrains.kotlin.resolve.constants.ConstantValue;
@@ -1118,7 +1118,7 @@ public class FunctionCodegen {
return Collections.emptyList(); 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(); if (annotation == null) return Collections.emptyList();
Collection<ConstantValue<?>> values = annotation.getAllValueArguments().values(); Collection<ConstantValue<?>> values = annotation.getAllValueArguments().values();
@@ -42,3 +42,8 @@ fun AnnotationDescriptor.argumentValue(parameterName: String): ConstantValue<*>?
DeprecationLevel.ERROR DeprecationLevel.ERROR
) )
val JVM_FIELD_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmField") 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")
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.load.java.JavaVisibilities
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name 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.JVM_SYNTHETIC_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.resolve.jvm.annotations.STRICTFP_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 import org.jetbrains.kotlin.resolve.jvm.annotations.SYNCHRONIZED_ANNOTATION_FQ_NAME
@@ -168,7 +169,7 @@ class FunctionCodegen(
) return null ) return null
// @Throws(vararg exceptionClasses: KClass<out Throwable>) // @Throws(vararg exceptionClasses: KClass<out Throwable>)
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 -> return (exceptionClasses as IrVararg).elements.map { exceptionClass ->
context.typeMapper.mapType((exceptionClass as IrClassReference).classType).internalName context.typeMapper.mapType((exceptionClass as IrClassReference).classType).internalName
} }
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypesAndPredicate import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypesAndPredicate
import org.jetbrains.kotlin.resolve.BindingContext 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.calls.callUtil.getType
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
@@ -64,7 +65,7 @@ class AddThrowsAnnotationIntention : SelfTargetingIntention<KtThrowExpression>(
if (annotationEntry == null || annotationEntry.valueArguments.isEmpty()) { if (annotationEntry == null || annotationEntry.valueArguments.isEmpty()) {
annotationEntry?.delete() annotationEntry?.delete()
val whiteSpaceText = if (containingDeclaration is KtPropertyAccessor) " " else "\n" val whiteSpaceText = if (containingDeclaration is KtPropertyAccessor) " " else "\n"
containingDeclaration.addAnnotation(throwsAnnotationFqName, annotationArgumentText, whiteSpaceText) containingDeclaration.addAnnotation(JVM_THROWS_ANNOTATION_FQ_NAME, annotationArgumentText, whiteSpaceText)
} else { } else {
val factory = KtPsiFactory(element) val factory = KtPsiFactory(element)
val argument = annotationEntry.valueArguments.firstOrNull() val argument = annotationEntry.valueArguments.firstOrNull()
@@ -91,8 +92,6 @@ class AddThrowsAnnotationIntention : SelfTargetingIntention<KtThrowExpression>(
} }
} }
private val throwsAnnotationFqName = FqName("kotlin.jvm.Throws")
private fun KtThrowExpression.getContainingDeclaration(): KtDeclaration? { private fun KtThrowExpression.getContainingDeclaration(): KtDeclaration? {
val parent = getParentOfTypesAndPredicate( val parent = getParentOfTypesAndPredicate(
true, true,
@@ -110,7 +109,7 @@ private fun KtDeclaration.findThrowsAnnotation(context: BindingContext): KtAnnot
val annotationEntries = this.annotationEntries + (parent as? KtProperty)?.annotationEntries.orEmpty() val annotationEntries = this.annotationEntries + (parent as? KtProperty)?.annotationEntries.orEmpty()
return annotationEntries.find { return annotationEntries.find {
val typeReference = it.typeReference ?: return@find false 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<KtExpression>
} }
appendFixedText(lastExpression) appendFixedText(lastExpression)
appendFixedText("]") appendFixedText("]")
} as KtCollectionLiteralExpression } as KtCollectionLiteralExpression
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.nj2k.types.JKNoType
import org.jetbrains.kotlin.nj2k.types.JKType import org.jetbrains.kotlin.nj2k.types.JKType
import org.jetbrains.kotlin.nj2k.types.JKTypeFactory import org.jetbrains.kotlin.nj2k.types.JKTypeFactory
import org.jetbrains.kotlin.nj2k.types.replaceJavaClassWithKotlinClassType 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.cast
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -126,7 +127,7 @@ fun jvmAnnotation(name: String, symbolProvider: JKSymbolProvider) =
fun throwAnnotation(throws: List<JKType>, symbolProvider: JKSymbolProvider) = fun throwAnnotation(throws: List<JKType>, symbolProvider: JKSymbolProvider) =
JKAnnotation( JKAnnotation(
symbolProvider.provideClassSymbol("kotlin.jvm.Throws"), symbolProvider.provideClassSymbol(JVM_THROWS_ANNOTATION_FQ_NAME.asString()),
throws.map { throws.map {
JKAnnotationParameterImpl( JKAnnotationParameterImpl(
JKClassLiteralExpression(JKTypeElement(it), JKClassLiteralExpression.ClassLiteralType.KOTLIN_CLASS) JKClassLiteralExpression(JKTypeElement(it), JKClassLiteralExpression.ClassLiteralType.KOTLIN_CLASS)
@@ -352,4 +353,4 @@ val JKTreeElement.identifier: JKSymbol?
} }
val JKClass.isObjectOrCompanionObject val JKClass.isObjectOrCompanionObject
get() = classKind == JKClass.ClassKind.OBJECT || classKind == JKClass.ClassKind.COMPANION get() = classKind == JKClass.ClassKind.OBJECT || classKind == JKClass.ClassKind.COMPANION