[lombok] @With support
This commit is contained in:
committed by
TeamCityServer
parent
7fd8f7b3bc
commit
e0a95ff556
+3
-5
@@ -10,10 +10,7 @@ import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
|||||||
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassDescriptor
|
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
|
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
|
||||||
import org.jetbrains.kotlin.lombok.config.LombokConfig
|
import org.jetbrains.kotlin.lombok.config.LombokConfig
|
||||||
import org.jetbrains.kotlin.lombok.processor.GetterProcessor
|
import org.jetbrains.kotlin.lombok.processor.*
|
||||||
import org.jetbrains.kotlin.lombok.processor.Parts
|
|
||||||
import org.jetbrains.kotlin.lombok.processor.Processor
|
|
||||||
import org.jetbrains.kotlin.lombok.processor.SetterProcessor
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.jvm.SyntheticJavaPartsProvider
|
import org.jetbrains.kotlin.resolve.jvm.SyntheticJavaPartsProvider
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -25,7 +22,8 @@ class LombokSyntheticJavaPartsProvider(private val config: LombokConfig) : Synth
|
|||||||
private fun initProcessors(): List<Processor> =
|
private fun initProcessors(): List<Processor> =
|
||||||
listOf(
|
listOf(
|
||||||
GetterProcessor(config),
|
GetterProcessor(config),
|
||||||
SetterProcessor(config)
|
SetterProcessor(config),
|
||||||
|
WithProcessor(config),
|
||||||
)
|
)
|
||||||
|
|
||||||
private val partsCache: MutableMap<ClassDescriptor, Parts> = WeakHashMap()
|
private val partsCache: MutableMap<ClassDescriptor, Parts> = WeakHashMap()
|
||||||
|
|||||||
+11
@@ -59,3 +59,14 @@ data class Setter(val visibility: DescriptorVisibility) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class With(val visibility: DescriptorVisibility) {
|
||||||
|
companion object : AnnotationCompanion<With>() {
|
||||||
|
override val name: FqName = LombokNames.WITH
|
||||||
|
|
||||||
|
override fun extract(annotation: AnnotationDescriptor): With =
|
||||||
|
With(
|
||||||
|
visibility = getVisibility(annotation)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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.load.java.structure.impl.JavaClassImpl
|
||||||
|
import org.jetbrains.kotlin.lombok.config.LombokConfig
|
||||||
|
import org.jetbrains.kotlin.lombok.config.With
|
||||||
|
import org.jetbrains.kotlin.lombok.utils.*
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
class WithProcessor(private val config: LombokConfig) : Processor {
|
||||||
|
override fun contribute(classDescriptor: ClassDescriptor, jClass: JavaClassImpl): Parts {
|
||||||
|
|
||||||
|
val clWith = With.getOrNull(classDescriptor)
|
||||||
|
|
||||||
|
val functions = classDescriptor
|
||||||
|
.getVariables()
|
||||||
|
.collectWithNotNull { With.getOrNull(it) ?: clWith }
|
||||||
|
.mapNotNull { (field, annotation) -> createWith(classDescriptor, field, annotation) }
|
||||||
|
|
||||||
|
return Parts(functions)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createWith(
|
||||||
|
classDescriptor: ClassDescriptor,
|
||||||
|
field: PropertyDescriptor,
|
||||||
|
with: With
|
||||||
|
): SimpleFunctionDescriptor? {
|
||||||
|
|
||||||
|
val functionName = "with" + toPreparedBase(field.name.identifier)
|
||||||
|
|
||||||
|
return classDescriptor.createFunction(
|
||||||
|
Name.identifier(functionName),
|
||||||
|
listOf(ValueParameter(field.name, field.type)),
|
||||||
|
classDescriptor.defaultType,
|
||||||
|
visibility = with.visibility
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -12,5 +12,6 @@ object LombokNames {
|
|||||||
val ACCESSORS = FqName("lombok.experimental.Accessors")
|
val ACCESSORS = FqName("lombok.experimental.Accessors")
|
||||||
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")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
//FILE: WithExample.java
|
||||||
|
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.With;
|
||||||
|
|
||||||
|
public class WithExample {
|
||||||
|
|
||||||
|
//todo replace constructors with annotations when supported
|
||||||
|
public WithExample() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public WithExample(int age, String name) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@With private int age = 10;
|
||||||
|
|
||||||
|
@With private String name;
|
||||||
|
|
||||||
|
static void test() {
|
||||||
|
WithExample obj = new WithExample().withAge(16).withName("fooo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//FILE: test.kt
|
||||||
|
|
||||||
|
object Test {
|
||||||
|
fun usage() {
|
||||||
|
val obj: WithExample = WithExample().withAge(16).withName("fooo")
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -70,4 +70,9 @@ public class LombokCompileTestGenerated extends AbstractLombokCompileTest {
|
|||||||
public void testSimple() throws Exception {
|
public void testSimple() throws Exception {
|
||||||
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/simple.kt");
|
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/simple.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("with.kt")
|
||||||
|
public void testWith() throws Exception {
|
||||||
|
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/with.kt");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user