From 2f1def6832ae4da3ae3bf8b375e85c0729cd0ca0 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 16 Jul 2015 19:05:05 +0300 Subject: [PATCH] Support @param and @sparam annotations --- .../jetbrains/kotlin/codegen/FunctionCodegen.java | 15 ++++++++++++++- .../org/jetbrains/kotlin/diagnostics/Errors.java | 1 + .../rendering/DefaultErrorMessages.java | 1 + .../kotlin/psi/JetAnnotationUseSiteTarget.kt | 2 ++ .../kotlin/resolve/ModifiersChecker.java | 4 ++++ .../annotations/AnnotationUseSiteTarget.kt | 4 +++- 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 5905a0728a3..49a0f49c2c6 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -252,7 +252,20 @@ public class FunctionCodegen { if (kind == JvmMethodParameterKind.VALUE) { ValueParameterDescriptor parameter = iterator.next(); v.getSerializationBindings().put(INDEX_FOR_VALUE_PARAMETER, parameter, i); - AnnotationCodegen.forParameter(i, mv, typeMapper).genAnnotations(parameter, parameterSignature.getAsmType()); + AnnotationCodegen annotationCodegen = AnnotationCodegen.forParameter(i, mv, typeMapper); + + if (functionDescriptor instanceof PropertySetterDescriptor) { + PropertyDescriptor propertyDescriptor = ((PropertySetterDescriptor) functionDescriptor).getCorrespondingProperty(); + Annotated targetedAnnotations = new AnnotatedWithAdditionalAnnotations(null, propertyDescriptor); + annotationCodegen.genAnnotations(targetedAnnotations, parameterSignature.getAsmType(), SETTER_PARAMETER); + } + + if (functionDescriptor instanceof ConstructorDescriptor) { + annotationCodegen.genAnnotations(parameter, parameterSignature.getAsmType(), CONSTRUCTOR_PARAMETER); + } + else { + annotationCodegen.genAnnotations(parameter, parameterSignature.getAsmType()); + } } else if (kind == JvmMethodParameterKind.RECEIVER) { Annotated annotationHolder = (functionDescriptor instanceof PropertyAccessorDescriptor) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 4dc2594ff1c..66de61eb6ac 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -138,6 +138,7 @@ public interface Errors { DiagnosticFactory0 INAPPLICABLE_SET_TARGET = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 INAPPLICABLE_RECEIVER_TARGET = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 INAPPLICABLE_SPARAM_TARGET = DiagnosticFactory0.create(ERROR); // Classes and traits diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 9ca1d52a067..df8dc780cd5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -131,6 +131,7 @@ public class DefaultErrorMessages { MAP.put(INAPPLICABLE_SET_TARGET, "''@set:'' annotations could be applied only to property declarations"); MAP.put(INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE, "Property must be mutable"); MAP.put(INAPPLICABLE_RECEIVER_TARGET, "''@receiver:'' annotations could be applied only to extension function or extension property declarations"); + MAP.put(INAPPLICABLE_SPARAM_TARGET, "''@sparam:'' annotations could be applied only to property declarations"); MAP.put(REDUNDANT_MODIFIER, "Modifier ''{0}'' is redundant because ''{1}'' is present", TO_STRING, TO_STRING); MAP.put(ABSTRACT_MODIFIER_IN_TRAIT, "Modifier ''abstract'' is redundant in interface"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetAnnotationUseSiteTarget.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetAnnotationUseSiteTarget.kt index 8c32f83b169..93057fa3b76 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetAnnotationUseSiteTarget.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetAnnotationUseSiteTarget.kt @@ -42,6 +42,8 @@ public class JetAnnotationUseSiteTarget : JetElementImplStub AnnotationUseSiteTarget.PROPERTY_GETTER JetTokens.SET_KEYWORD -> AnnotationUseSiteTarget.PROPERTY_SETTER JetTokens.RECEIVER_KEYWORD -> AnnotationUseSiteTarget.RECEIVER + JetTokens.PARAM_KEYWORD -> AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER + JetTokens.SPARAM_KEYWORD -> AnnotationUseSiteTarget.SETTER_PARAMETER else -> throw IllegalStateException("Unknown annotation target " + node.getText()) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java index 4e5fe32ef6c..b2e6f00188a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java @@ -255,6 +255,10 @@ public class ModifiersChecker { } break; } + case SETTER_PARAMETER: { + reportIfNotMutableProperty(descriptor, annotation, INAPPLICABLE_SPARAM_TARGET); + break; + } } } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationUseSiteTarget.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationUseSiteTarget.kt index 60bb4ea8306..712eed83bcc 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationUseSiteTarget.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationUseSiteTarget.kt @@ -22,7 +22,9 @@ public enum class AnnotationUseSiteTarget(renderName: String? = null) { PROPERTY(), PROPERTY_GETTER("get"), PROPERTY_SETTER("set"), - RECEIVER(); + RECEIVER(), + CONSTRUCTOR_PARAMETER("param"), + SETTER_PARAMETER("sparam"); public val renderName: String = renderName ?: name().toLowerCase() } \ No newline at end of file