[lombok] @Data support
This commit is contained in:
committed by
TeamCityServer
parent
99f9b79c87
commit
97fc187e77
@@ -24,12 +24,12 @@ Features support:
|
|||||||
- [x] Basic support
|
- [x] Basic support
|
||||||
- [ ] Copy annotations
|
- [ ] Copy annotations
|
||||||
|
|
||||||
[~] [@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor](https://projectlombok.org/features/constructor)
|
[x] [@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor](https://projectlombok.org/features/constructor)
|
||||||
- [x] @NoArgsConstructor
|
- [x] @NoArgsConstructor
|
||||||
- [x] @AllArgsConstructor
|
- [x] @AllArgsConstructor
|
||||||
- [x] @RequiredArgsConstructor
|
- [x] @RequiredArgsConstructor
|
||||||
|
|
||||||
[ ] [@Data](https://projectlombok.org/features/Data)
|
[x] [@Data](https://projectlombok.org/features/Data)
|
||||||
|
|
||||||
[ ] [@Value](https://projectlombok.org/features/Value)
|
[ ] [@Value](https://projectlombok.org/features/Value)
|
||||||
|
|
||||||
|
|||||||
+26
-4
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.lombok.config
|
package org.jetbrains.kotlin.lombok.config
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotated
|
import org.jetbrains.kotlin.descriptors.annotations.Annotated
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
@@ -41,7 +42,7 @@ data class Accessors(val fluent: Boolean = false, val chain: Boolean = false) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data class Getter(val visibility: DescriptorVisibility) {
|
data class Getter(val visibility: DescriptorVisibility = DescriptorVisibilities.PUBLIC) {
|
||||||
companion object : AnnotationCompanion<Getter>() {
|
companion object : AnnotationCompanion<Getter>() {
|
||||||
override val name: FqName = LombokNames.GETTER
|
override val name: FqName = LombokNames.GETTER
|
||||||
|
|
||||||
@@ -52,7 +53,7 @@ data class Getter(val visibility: DescriptorVisibility) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data class Setter(val visibility: DescriptorVisibility) {
|
data class Setter(val visibility: DescriptorVisibility = DescriptorVisibilities.PUBLIC) {
|
||||||
companion object : AnnotationCompanion<Setter>() {
|
companion object : AnnotationCompanion<Setter>() {
|
||||||
override val name: FqName = LombokNames.SETTER
|
override val name: FqName = LombokNames.SETTER
|
||||||
|
|
||||||
@@ -110,8 +111,8 @@ data class AllArgsConstructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
data class RequiredArgsConstructor(
|
data class RequiredArgsConstructor(
|
||||||
override val visibility: DescriptorVisibility,
|
override val visibility: DescriptorVisibility = DescriptorVisibilities.PUBLIC,
|
||||||
override val staticName: String?
|
override val staticName: String? = null
|
||||||
) : ConstructorAnnotation {
|
) : ConstructorAnnotation {
|
||||||
companion object : AnnotationCompanion<RequiredArgsConstructor>() {
|
companion object : AnnotationCompanion<RequiredArgsConstructor>() {
|
||||||
override val name: FqName = LombokNames.REQUIRED_ARGS_CONSTRUCTOR
|
override val name: FqName = LombokNames.REQUIRED_ARGS_CONSTRUCTOR
|
||||||
@@ -123,3 +124,24 @@ data class RequiredArgsConstructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class Data(val staticConstructor: String?) {
|
||||||
|
|
||||||
|
fun asSetter(): Setter = Setter()
|
||||||
|
|
||||||
|
fun asGetter(): Getter = Getter()
|
||||||
|
|
||||||
|
fun asRequiredArgsConstructor(): RequiredArgsConstructor = RequiredArgsConstructor(
|
||||||
|
staticName = staticConstructor
|
||||||
|
)
|
||||||
|
|
||||||
|
companion object : AnnotationCompanion<Data>() {
|
||||||
|
override val name: FqName = LombokNames.DATA
|
||||||
|
|
||||||
|
override fun extract(annotation: AnnotationDescriptor): Data =
|
||||||
|
Data(
|
||||||
|
staticConstructor = annotation.getNonBlankStringArgument("staticConstructor")
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+4
-4
@@ -15,16 +15,14 @@ import org.jetbrains.kotlin.lombok.utils.createJavaConstructor
|
|||||||
import org.jetbrains.kotlin.lombok.utils.createFunction
|
import org.jetbrains.kotlin.lombok.utils.createFunction
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
abstract class AbstractConstructorProcessor<A : ConstructorAnnotation>(
|
abstract class AbstractConstructorProcessor<A : ConstructorAnnotation> : Processor {
|
||||||
private val annotationCompanion: AnnotationCompanion<A>
|
|
||||||
) : Processor {
|
|
||||||
|
|
||||||
override fun contribute(classDescriptor: ClassDescriptor, jClass: JavaClassImpl): Parts {
|
override fun contribute(classDescriptor: ClassDescriptor, jClass: JavaClassImpl): Parts {
|
||||||
val valueParameters = getPropertiesForParameters(classDescriptor).map { property ->
|
val valueParameters = getPropertiesForParameters(classDescriptor).map { property ->
|
||||||
ValueParameter(property.name, property.type)
|
ValueParameter(property.name, property.type)
|
||||||
}
|
}
|
||||||
|
|
||||||
val result = annotationCompanion.getOrNull(classDescriptor)?.let { annotation ->
|
val result = getAnnotation(classDescriptor)?.let { annotation ->
|
||||||
if (annotation.staticName == null) {
|
if (annotation.staticName == null) {
|
||||||
val constructor = classDescriptor.createJavaConstructor(
|
val constructor = classDescriptor.createJavaConstructor(
|
||||||
valueParameters = valueParameters,
|
valueParameters = valueParameters,
|
||||||
@@ -46,6 +44,8 @@ abstract class AbstractConstructorProcessor<A : ConstructorAnnotation>(
|
|||||||
return result ?: Parts.Empty
|
return result ?: Parts.Empty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected abstract fun getAnnotation(classDescriptor: ClassDescriptor): A?
|
||||||
|
|
||||||
protected abstract fun getPropertiesForParameters(classDescriptor: ClassDescriptor): List<PropertyDescriptor>
|
protected abstract fun getPropertiesForParameters(classDescriptor: ClassDescriptor): List<PropertyDescriptor>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+6
-2
@@ -10,8 +10,12 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
|||||||
import org.jetbrains.kotlin.lombok.config.AllArgsConstructor
|
import org.jetbrains.kotlin.lombok.config.AllArgsConstructor
|
||||||
import org.jetbrains.kotlin.lombok.utils.getJavaFields
|
import org.jetbrains.kotlin.lombok.utils.getJavaFields
|
||||||
|
|
||||||
class AllArgsConstructorProcessor : AbstractConstructorProcessor<AllArgsConstructor>(AllArgsConstructor) {
|
class AllArgsConstructorProcessor : AbstractConstructorProcessor<AllArgsConstructor>() {
|
||||||
|
|
||||||
override fun getPropertiesForParameters(classDescriptor: ClassDescriptor): List<PropertyDescriptor> = classDescriptor.getJavaFields()
|
override fun getAnnotation(classDescriptor: ClassDescriptor): AllArgsConstructor? =
|
||||||
|
AllArgsConstructor.getOrNull(classDescriptor)
|
||||||
|
|
||||||
|
override fun getPropertiesForParameters(classDescriptor: ClassDescriptor): List<PropertyDescriptor> =
|
||||||
|
classDescriptor.getJavaFields()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
|
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
|
||||||
import org.jetbrains.kotlin.lombok.config.Accessors
|
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.Getter
|
||||||
import org.jetbrains.kotlin.lombok.config.LombokConfig
|
import org.jetbrains.kotlin.lombok.config.LombokConfig
|
||||||
import org.jetbrains.kotlin.lombok.utils.collectWithNotNull
|
import org.jetbrains.kotlin.lombok.utils.collectWithNotNull
|
||||||
@@ -27,7 +28,7 @@ class GetterProcessor(private val config: LombokConfig) : Processor {
|
|||||||
|
|
||||||
override fun contribute(classDescriptor: ClassDescriptor, jClass: JavaClassImpl): Parts {
|
override fun contribute(classDescriptor: ClassDescriptor, jClass: JavaClassImpl): Parts {
|
||||||
val clAccessors = Accessors.getOrNull(classDescriptor)
|
val clAccessors = Accessors.getOrNull(classDescriptor)
|
||||||
val clGetter = Getter.getOrNull(classDescriptor)
|
val clGetter = Getter.getOrNull(classDescriptor) ?: Data.getOrNull(classDescriptor)?.asGetter()
|
||||||
|
|
||||||
val functions = classDescriptor
|
val functions = classDescriptor
|
||||||
.getJavaFields()
|
.getJavaFields()
|
||||||
|
|||||||
+3
-1
@@ -9,7 +9,9 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.lombok.config.NoArgsConstructor
|
import org.jetbrains.kotlin.lombok.config.NoArgsConstructor
|
||||||
|
|
||||||
class NoArgsConstructorProcessor : AbstractConstructorProcessor<NoArgsConstructor>(NoArgsConstructor) {
|
class NoArgsConstructorProcessor : AbstractConstructorProcessor<NoArgsConstructor>() {
|
||||||
|
|
||||||
|
override fun getAnnotation(classDescriptor: ClassDescriptor): NoArgsConstructor? = NoArgsConstructor.getOrNull(classDescriptor)
|
||||||
|
|
||||||
override fun getPropertiesForParameters(classDescriptor: ClassDescriptor): List<PropertyDescriptor> = emptyList()
|
override fun getPropertiesForParameters(classDescriptor: ClassDescriptor): List<PropertyDescriptor> = emptyList()
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-1
@@ -9,12 +9,16 @@ import com.intellij.psi.PsiField
|
|||||||
import com.intellij.psi.PsiModifier
|
import com.intellij.psi.PsiModifier
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
|
import org.jetbrains.kotlin.lombok.config.Data
|
||||||
import org.jetbrains.kotlin.lombok.config.RequiredArgsConstructor
|
import org.jetbrains.kotlin.lombok.config.RequiredArgsConstructor
|
||||||
import org.jetbrains.kotlin.lombok.utils.LombokNames
|
import org.jetbrains.kotlin.lombok.utils.LombokNames
|
||||||
import org.jetbrains.kotlin.lombok.utils.getJavaFields
|
import org.jetbrains.kotlin.lombok.utils.getJavaFields
|
||||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
|
|
||||||
class RequiredArgsConstructorProcessor : AbstractConstructorProcessor<RequiredArgsConstructor>(RequiredArgsConstructor) {
|
class RequiredArgsConstructorProcessor : AbstractConstructorProcessor<RequiredArgsConstructor>() {
|
||||||
|
|
||||||
|
override fun getAnnotation(classDescriptor: ClassDescriptor): RequiredArgsConstructor? =
|
||||||
|
RequiredArgsConstructor.getOrNull(classDescriptor) ?: Data.getOrNull(classDescriptor)?.asRequiredArgsConstructor()
|
||||||
|
|
||||||
override fun getPropertiesForParameters(classDescriptor: ClassDescriptor): List<PropertyDescriptor> =
|
override fun getPropertiesForParameters(classDescriptor: ClassDescriptor): List<PropertyDescriptor> =
|
||||||
classDescriptor.getJavaFields().filter(this::isFieldRequired)
|
classDescriptor.getJavaFields().filter(this::isFieldRequired)
|
||||||
|
|||||||
+2
-1
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.lombok.processor
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
|
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
|
||||||
import org.jetbrains.kotlin.lombok.config.Accessors
|
import org.jetbrains.kotlin.lombok.config.Accessors
|
||||||
|
import org.jetbrains.kotlin.lombok.config.Data
|
||||||
import org.jetbrains.kotlin.lombok.config.LombokConfig
|
import org.jetbrains.kotlin.lombok.config.LombokConfig
|
||||||
import org.jetbrains.kotlin.lombok.config.Setter
|
import org.jetbrains.kotlin.lombok.config.Setter
|
||||||
import org.jetbrains.kotlin.lombok.utils.*
|
import org.jetbrains.kotlin.lombok.utils.*
|
||||||
@@ -21,7 +22,7 @@ class SetterProcessor(private val config: LombokConfig) : Processor {
|
|||||||
if (classDescriptor.kind == ClassKind.ENUM_CLASS) return Parts.Empty
|
if (classDescriptor.kind == ClassKind.ENUM_CLASS) return Parts.Empty
|
||||||
|
|
||||||
val clAccessors = Accessors.getOrNull(classDescriptor)
|
val clAccessors = Accessors.getOrNull(classDescriptor)
|
||||||
val clSetter = Setter.getOrNull(classDescriptor)
|
val clSetter = Setter.getOrNull(classDescriptor) ?: Data.getOrNull(classDescriptor)?.asSetter()
|
||||||
|
|
||||||
val functions = classDescriptor
|
val functions = classDescriptor
|
||||||
.getJavaFields()
|
.getJavaFields()
|
||||||
|
|||||||
+2
-1
@@ -13,7 +13,8 @@ object LombokNames {
|
|||||||
val GETTER = FqName("lombok.Getter")
|
val GETTER = FqName("lombok.Getter")
|
||||||
val SETTER = FqName("lombok.Setter")
|
val SETTER = FqName("lombok.Setter")
|
||||||
val WITH = FqName("lombok.With")
|
val WITH = FqName("lombok.With")
|
||||||
val VALUE = FqName("lombok.lombok.Value")
|
val DATA = FqName("lombok.Data")
|
||||||
|
val VALUE = FqName("lombok.Value")
|
||||||
val NO_ARGS_CONSTRUCTOR = FqName("lombok.NoArgsConstructor")
|
val NO_ARGS_CONSTRUCTOR = FqName("lombok.NoArgsConstructor")
|
||||||
val ALL_ARGS_CONSTRUCTOR = FqName("lombok.AllArgsConstructor")
|
val ALL_ARGS_CONSTRUCTOR = FqName("lombok.AllArgsConstructor")
|
||||||
val REQUIRED_ARGS_CONSTRUCTOR = FqName("lombok.RequiredArgsConstructor")
|
val REQUIRED_ARGS_CONSTRUCTOR = FqName("lombok.RequiredArgsConstructor")
|
||||||
|
|||||||
+2
-1
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
|||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
|
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
|
||||||
|
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.constants.BooleanValue
|
import org.jetbrains.kotlin.resolve.constants.BooleanValue
|
||||||
import org.jetbrains.kotlin.resolve.constants.EnumValue
|
import org.jetbrains.kotlin.resolve.constants.EnumValue
|
||||||
@@ -24,7 +25,7 @@ fun getVisibility(annotation: AnnotationDescriptor, field: String = "value"): De
|
|||||||
"PACKAGE" -> JavaVisibilities.PackageVisibility
|
"PACKAGE" -> JavaVisibilities.PackageVisibility
|
||||||
else -> Visibilities.Public
|
else -> Visibilities.Public
|
||||||
}
|
}
|
||||||
return DescriptorVisibilities.toDescriptorVisibility(visibility)
|
return JavaDescriptorVisibilities.toDescriptorVisibility(visibility)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun AnnotationDescriptor.getStringArgument(argumentName: String): String? {
|
fun AnnotationDescriptor.getStringArgument(argumentName: String): String? {
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
//FILE: DataExample.java
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
@Data public class DataExample {
|
||||||
|
private final String name;
|
||||||
|
@Setter(AccessLevel.PACKAGE) private int age;
|
||||||
|
private double score;
|
||||||
|
private String[] tags;
|
||||||
|
|
||||||
|
@ToString(includeFieldNames=true)
|
||||||
|
@Data(staticConstructor="of")
|
||||||
|
public static class Exercise<T> {
|
||||||
|
private final String name;
|
||||||
|
private final T value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void usage() {
|
||||||
|
val obj = new DataExample("name");
|
||||||
|
obj.getName();
|
||||||
|
obj.getTags();
|
||||||
|
obj.setScore(1.5);
|
||||||
|
|
||||||
|
Exercise<Integer> ex = Exercise.of("name", 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//FILE: test.kt
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
fun run() {
|
||||||
|
val obj = DataExample("name")
|
||||||
|
obj.getName()
|
||||||
|
val name = obj.name
|
||||||
|
obj.getTags()
|
||||||
|
val tags = obj.tags
|
||||||
|
obj.setScore(1.5)
|
||||||
|
obj.score = 2.5
|
||||||
|
|
||||||
|
val ex: DataExample.Exercise<Int> = DataExample.Exercise.of("name", 12)
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -51,6 +51,11 @@ public class LombokCompileTestGenerated extends AbstractLombokCompileTest {
|
|||||||
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/clashAccessors.kt");
|
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/clashAccessors.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("data.kt")
|
||||||
|
public void testData() throws Exception {
|
||||||
|
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/data.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("gettersClassLevel.kt")
|
@TestMetadata("gettersClassLevel.kt")
|
||||||
public void testGettersClassLevel() throws Exception {
|
public void testGettersClassLevel() throws Exception {
|
||||||
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/gettersClassLevel.kt");
|
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/gettersClassLevel.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user