diff --git a/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt index 92f888b6a41..189684b7990 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt @@ -111,8 +111,9 @@ class AnnotationConverter(private val converter: Converter) { } private fun effectiveAnnotationUseTarget(name: String, target: AnnotationUseTarget?): AnnotationUseTarget? = - when (name) { - "Deprecated" -> if (target == AnnotationUseTarget.Param) null else target + when { + name == "Deprecated" && + (target == AnnotationUseTarget.Param || target == AnnotationUseTarget.Field) -> null else -> target } diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt index f5c9bdaa8fd..1cd233f9604 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ConstructorConverter.kt @@ -196,16 +196,26 @@ class ConstructorConverter( else { val (field, type) = parameterToField[parameter]!! val propertyInfo = fieldToPropertyInfo(field) - FunctionParameter(propertyInfo.identifier, - type, - if (propertyInfo.isVar) FunctionParameter.VarValModifier.Var else FunctionParameter.VarValModifier.Val, - converter.convertAnnotations(parameter, AnnotationUseTarget.Param) + converter.convertAnnotations(field), - propertyInfo.modifiers, - default) - .assignPrototypes( - PrototypeInfo(parameter, CommentsAndSpacesInheritance.LINE_BREAKS), - PrototypeInfo(field, CommentsAndSpacesInheritance.NO_SPACES) - ) + + var paramAnnotations = converter.convertAnnotations(parameter, AnnotationUseTarget.Param) + + converter.convertAnnotations(field, AnnotationUseTarget.Field) + if (propertyInfo.getMethod != null) { + paramAnnotations += converter.convertAnnotations(propertyInfo.getMethod, AnnotationUseTarget.Get) + } + if (propertyInfo.setMethod != null) { + paramAnnotations += converter.convertAnnotations(propertyInfo.setMethod, AnnotationUseTarget.Set) + } + FunctionParameter( + propertyInfo.identifier, + type, + if (propertyInfo.isVar) FunctionParameter.VarValModifier.Var else FunctionParameter.VarValModifier.Val, + paramAnnotations, + propertyInfo.modifiers, + default + ).assignPrototypes( + PrototypeInfo(parameter, CommentsAndSpacesInheritance.LINE_BREAKS), + PrototypeInfo(field, CommentsAndSpacesInheritance.NO_SPACES) + ) } }, correctCodeConverter = { correct() }) diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/Annotation.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/Annotation.kt index 9f7ddd95ffb..cc44195bea8 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/Annotation.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/Annotation.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.j2k.append import org.jetbrains.kotlin.j2k.buildList enum class AnnotationUseTarget(val id: String) { - File("file"), Param("param"), Get("get"), Set("set") + File("file"), Param("param"), Get("get"), Set("set"), Field("field") } class Annotation(val name: Identifier, diff --git a/j2k/testData/fileOrElement/annotations/annotationFromConstructorParamToProperty.kt b/j2k/testData/fileOrElement/annotations/annotationFromConstructorParamToProperty.kt index b51760889f6..7d881336a79 100644 --- a/j2k/testData/fileOrElement/annotations/annotationFromConstructorParamToProperty.kt +++ b/j2k/testData/fileOrElement/annotations/annotationFromConstructorParamToProperty.kt @@ -2,5 +2,5 @@ internal annotation class A internal annotation class B -class U(@param:A @B +class U(@param:A @field:B var i: Int) \ No newline at end of file diff --git a/j2k/testData/fileOrElement/detectProperties/DataClassWithAnnotations.java b/j2k/testData/fileOrElement/detectProperties/DataClassWithAnnotations.java new file mode 100644 index 00000000000..b649308913e --- /dev/null +++ b/j2k/testData/fileOrElement/detectProperties/DataClassWithAnnotations.java @@ -0,0 +1,21 @@ +@interface TestAnnotation { +} + +public class Test { + @TestAnnotation + private String arg; + + public Test(@TestAnnotation String arg) { + this.arg = arg; + } + + @TestAnnotation + public String getArg() { + return arg; + } + + @TestAnnotation + public void setArg(String arg) { + this.arg = arg; + } +} diff --git a/j2k/testData/fileOrElement/detectProperties/DataClassWithAnnotations.kt b/j2k/testData/fileOrElement/detectProperties/DataClassWithAnnotations.kt new file mode 100644 index 00000000000..32a1abee831 --- /dev/null +++ b/j2k/testData/fileOrElement/detectProperties/DataClassWithAnnotations.kt @@ -0,0 +1,6 @@ +internal annotation class TestAnnotation + +class Test(@param:TestAnnotation @field:TestAnnotation + @get:TestAnnotation + @set:TestAnnotation + var arg: String?) diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index 03a11edc822..c80914cfb80 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -1508,6 +1508,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("DataClassWithAnnotations.java") + public void testDataClassWithAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/detectProperties/DataClassWithAnnotations.java"); + doTest(fileName); + } + @TestMetadata("DataClassWithMutableField.java") public void testDataClassWithMutableField() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/detectProperties/DataClassWithMutableField.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 77b36eea438..7742532e810 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -1508,6 +1508,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("DataClassWithAnnotations.java") + public void testDataClassWithAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/detectProperties/DataClassWithAnnotations.java"); + doTest(fileName); + } + @TestMetadata("DataClassWithMutableField.java") public void testDataClassWithMutableField() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/detectProperties/DataClassWithMutableField.java");