diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 446ab33119d..f9bdc02a5e8 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -99,6 +99,8 @@ class LazyJavaClassMemberScope( } } + c.components.syntheticPartsProvider.generateSyntheticConstructors(ownerDescriptor, result) + c.components.signatureEnhancement.enhanceSignatures( c, result.ifEmpty { listOfNotNull(createDefaultConstructor()) } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/resolve/jvm/SyntheticJavaPartsProvider.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/resolve/jvm/SyntheticJavaPartsProvider.kt index 28088a61914..dd320280096 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/resolve/jvm/SyntheticJavaPartsProvider.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/resolve/jvm/SyntheticJavaPartsProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.resolve.jvm +import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.name.Name @@ -23,6 +24,8 @@ interface SyntheticJavaPartsProvider { result: MutableCollection ) + fun generateSyntheticConstructors(thisDescriptor: ClassDescriptor, result: MutableList) + } class CompositeSyntheticJavaPartsProvider(private val inner: List) : SyntheticJavaPartsProvider { @@ -33,5 +36,11 @@ class CompositeSyntheticJavaPartsProvider(private val inner: List - ) = inner.forEach { it.generateSyntheticMethods(thisDescriptor, name, result) } + ) { + inner.forEach { it.generateSyntheticMethods(thisDescriptor, name, result) } + } + + override fun generateSyntheticConstructors(thisDescriptor: ClassDescriptor, result: MutableList) { + inner.forEach { it.generateSyntheticConstructors(thisDescriptor, result) } + } } diff --git a/plugins/lombok/lombok-compiler-plugin/README.md b/plugins/lombok/lombok-compiler-plugin/README.md index 7813f6b5a1e..f2194bc75d1 100644 --- a/plugins/lombok/lombok-compiler-plugin/README.md +++ b/plugins/lombok/lombok-compiler-plugin/README.md @@ -15,7 +15,8 @@ Features support: - [x] @Accessors config support: chain and fluent - [ ] Config support (_lombok.getter.noIsPrefix_ only supported) - [ ] Copy annotations - - [ ] strip defined prefixes - in config and @Accessors + - [ ] Strip defined prefixes - in config and @Accessors + - [ ] Skip generation with AccessLevel.NONE [~] [@With](https://projectlombok.org/features/With) @@ -23,6 +24,8 @@ Features support: - [ ] Copy annotations [ ] [@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor](https://projectlombok.org/features/constructor) + - [ ] Generate constructors + - [ ] Generate static factory method [ ] [@Data](https://projectlombok.org/features/Data) @@ -31,5 +34,12 @@ Features support: [ ] [@Builder](https://projectlombok.org/features/Builder) +Other todos: + - [ ] Generic classes + - [ ] Don't generate members that already exist (if having a duplicate is a problem) + - [ ] Gradle integration (as subplugin or just a way to enable lombok support) + - [ ] Maven integration (as subplugin or just a way to enable lombok support) + + diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/LombokSyntheticJavaPartsProvider.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/LombokSyntheticJavaPartsProvider.kt index 55f5a23881f..ad604d3c0bf 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/LombokSyntheticJavaPartsProvider.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/LombokSyntheticJavaPartsProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.lombok +import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassDescriptor @@ -40,6 +41,11 @@ class LombokSyntheticJavaPartsProvider(private val config: LombokConfig) : Synth result.addAll(methods) } + override fun generateSyntheticConstructors(thisDescriptor: ClassDescriptor, result: MutableList) { + val constructors = getSyntheticParts(thisDescriptor).constructors + result.addAll(constructors) + } + private fun extractClass(descriptor: ClassDescriptor): JavaClassImpl? = (descriptor as? LazyJavaClassDescriptor)?.jClass as? JavaClassImpl diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/Parts.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/Parts.kt index 73ca0b50fcb..7273dcfded9 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/Parts.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/Parts.kt @@ -5,11 +5,15 @@ package org.jetbrains.kotlin.lombok.processor +import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor -data class Parts(val methods: List = emptyList()) { +data class Parts( + val methods: List = emptyList(), + val constructors: List = emptyList() +) { - operator fun plus(other: Parts): Parts = Parts(methods + other.methods) + operator fun plus(other: Parts): Parts = Parts(methods + other.methods, constructors + other.constructors) companion object { val Empty = Parts() diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/SetterProcessor.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/SetterProcessor.kt index 05b23f4bd09..00330b76df2 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/SetterProcessor.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/SetterProcessor.kt @@ -5,9 +5,7 @@ package org.jetbrains.kotlin.lombok.processor -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl import org.jetbrains.kotlin.lombok.config.Accessors import org.jetbrains.kotlin.lombok.config.LombokConfig @@ -19,6 +17,9 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns class SetterProcessor(private val config: LombokConfig) : Processor { override fun contribute(classDescriptor: ClassDescriptor, jClass: JavaClassImpl): Parts { + //lombok doesn't generate setters for enums + if (classDescriptor.kind == ClassKind.ENUM_CLASS) return Parts.Empty + val clAccessors = Accessors.getOrNull(classDescriptor) val clSetter = Setter.getOrNull(classDescriptor)