From c7b2c731af4d8aa3b61e48fbda6185fe4865067f Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Tue, 30 Mar 2021 13:40:08 +0300 Subject: [PATCH] [lombok] Basic @Value support --- .../lombok/lombok-compiler-plugin/README.md | 4 +- .../kotlin/lombok/config/annotationConfig.kt | 23 +++++++++- .../processor/AllArgsConstructorProcessor.kt | 3 +- .../lombok/processor/GetterProcessor.kt | 10 ++--- .../testData/compile/data.kt | 4 +- .../testData/compile/value.kt | 42 +++++++++++++++++++ .../lombok/LombokCompileTestGenerated.java | 5 +++ 7 files changed, 80 insertions(+), 11 deletions(-) create mode 100644 plugins/lombok/lombok-compiler-plugin/testData/compile/value.kt diff --git a/plugins/lombok/lombok-compiler-plugin/README.md b/plugins/lombok/lombok-compiler-plugin/README.md index e11f5f0f723..60c736bdb33 100644 --- a/plugins/lombok/lombok-compiler-plugin/README.md +++ b/plugins/lombok/lombok-compiler-plugin/README.md @@ -31,7 +31,9 @@ Features support: [x] [@Data](https://projectlombok.org/features/Data) -[ ] [@Value](https://projectlombok.org/features/Value) +[~] [@Value](https://projectlombok.org/features/Value) + - [x] generate getters and constructors + - [ ] make class final, make fields private and final [ ] [@Builder](https://projectlombok.org/features/Builder) diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/annotationConfig.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/annotationConfig.kt index d0da33436b6..0c0ded53d5d 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/annotationConfig.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/annotationConfig.kt @@ -96,8 +96,8 @@ data class NoArgsConstructor( } data class AllArgsConstructor( - override val visibility: DescriptorVisibility, - override val staticName: String? + override val visibility: DescriptorVisibility = DescriptorVisibilities.PUBLIC, + override val staticName: String? = null ) : ConstructorAnnotation { companion object : AnnotationCompanion() { override val name: FqName = LombokNames.ALL_ARGS_CONSTRUCTOR @@ -145,3 +145,22 @@ data class Data(val staticConstructor: String?) { } } + +data class Value(val staticConstructor: String?) { + + fun asGetter(): Getter = Getter() + + fun asAllArgsConstructor(): AllArgsConstructor = AllArgsConstructor( + staticName = staticConstructor + ) + + companion object : AnnotationCompanion() { + override val name: FqName = LombokNames.VALUE + + override fun extract(annotation: AnnotationDescriptor): Value = + Value( + staticConstructor = annotation.getNonBlankStringArgument("staticConstructor") + ) + + } +} diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/AllArgsConstructorProcessor.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/AllArgsConstructorProcessor.kt index f734fac45a0..ef4f5cf81b8 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/AllArgsConstructorProcessor.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/AllArgsConstructorProcessor.kt @@ -8,12 +8,13 @@ package org.jetbrains.kotlin.lombok.processor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.lombok.config.AllArgsConstructor +import org.jetbrains.kotlin.lombok.config.Value import org.jetbrains.kotlin.lombok.utils.getJavaFields class AllArgsConstructorProcessor : AbstractConstructorProcessor() { override fun getAnnotation(classDescriptor: ClassDescriptor): AllArgsConstructor? = - AllArgsConstructor.getOrNull(classDescriptor) + AllArgsConstructor.getOrNull(classDescriptor) ?: Value.getOrNull(classDescriptor)?.asAllArgsConstructor() override fun getPropertiesForParameters(classDescriptor: ClassDescriptor): List = classDescriptor.getJavaFields() diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/GetterProcessor.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/GetterProcessor.kt index a37981b9dc4..609f65f598b 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/GetterProcessor.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/GetterProcessor.kt @@ -9,10 +9,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl -import org.jetbrains.kotlin.lombok.config.Accessors -import org.jetbrains.kotlin.lombok.config.Data -import org.jetbrains.kotlin.lombok.config.Getter -import org.jetbrains.kotlin.lombok.config.LombokConfig +import org.jetbrains.kotlin.lombok.config.* import org.jetbrains.kotlin.lombok.utils.collectWithNotNull import org.jetbrains.kotlin.lombok.utils.createFunction import org.jetbrains.kotlin.lombok.utils.getJavaFields @@ -28,7 +25,10 @@ class GetterProcessor(private val config: LombokConfig) : Processor { override fun contribute(classDescriptor: ClassDescriptor, jClass: JavaClassImpl): Parts { val clAccessors = Accessors.getOrNull(classDescriptor) - val clGetter = Getter.getOrNull(classDescriptor) ?: Data.getOrNull(classDescriptor)?.asGetter() + val clGetter = + Getter.getOrNull(classDescriptor) + ?: Data.getOrNull(classDescriptor)?.asGetter() + ?: Value.getOrNull(classDescriptor)?.asGetter() val functions = classDescriptor .getJavaFields() diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/data.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/data.kt index 3c4bcb4ddb9..a8e1676d504 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/data.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/data.kt @@ -11,8 +11,8 @@ import lombok.*; @ToString(includeFieldNames=true) @Data(staticConstructor="of") public static class Exercise { - private final String name; - private final T value; + private final String name; + private final T value; } public static void usage() { diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/value.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/value.kt new file mode 100644 index 00000000000..a3ef5c52372 --- /dev/null +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/value.kt @@ -0,0 +1,42 @@ +//FILE: ValueExample.java + +import lombok.*; + +@Value public class ValueExample { + private final String name; + private int age; + private double score; + + @ToString(includeFieldNames=true) + @Value(staticConstructor="of") + public static class Exercise { + private final String name; + private T value; + } + + public static void usage() { + val obj = new ValueExample("name", 12, 4.5); + obj.getName(); + obj.getAge(); + obj.getScore(); + + Exercise ex = Exercise.of("name", 12); + ex.getName(); + ex.getValue(); + } +} + +//FILE: test.kt + +class Test { + fun run() { + val obj = ValueExample("name", 12, 4.5) + obj.getName() + val name = obj.name + obj.getAge() + val age = obj.age + val score = obj.score + + val ex: ValueExample.Exercise = ValueExample.Exercise.of("name", 12) + } +} diff --git a/plugins/lombok/lombok-compiler-plugin/tests/org/jetbrains/kotlin/lombok/LombokCompileTestGenerated.java b/plugins/lombok/lombok-compiler-plugin/tests/org/jetbrains/kotlin/lombok/LombokCompileTestGenerated.java index 3a8b3bec209..77541b296df 100644 --- a/plugins/lombok/lombok-compiler-plugin/tests/org/jetbrains/kotlin/lombok/LombokCompileTestGenerated.java +++ b/plugins/lombok/lombok-compiler-plugin/tests/org/jetbrains/kotlin/lombok/LombokCompileTestGenerated.java @@ -126,6 +126,11 @@ public class LombokCompileTestGenerated extends AbstractLombokCompileTest { runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/simple.kt"); } + @TestMetadata("value.kt") + public void testValue() throws Exception { + runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/value.kt"); + } + @TestMetadata("with.kt") public void testWith() throws Exception { runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/with.kt");