Minor. Introduce constant JVM_THROWS_ANNOTATION_FQ_NAME
KT-35468
This commit is contained in:
committed by
Ilya Gorbunov
parent
1565fc0211
commit
534ff58d9c
@@ -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")
|
||||||
|
|||||||
+2
-1
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user