diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java index 05d443543cb..b1f76bc9d9d 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java @@ -439,6 +439,7 @@ public abstract class CodegenTestCase extends KotlinBaseTest javaClasspath = new ArrayList<>(); javaClasspath.add(kotlinOut.getPath()); @@ -463,6 +464,13 @@ public abstract class CodegenTestCase extends KotlinBaseTest files, @NotNull List options) throws IOException { diff --git a/plugins/lombok/lombok-compiler-plugin/README.md b/plugins/lombok/lombok-compiler-plugin/README.md index 867d1fe5504..44603cc7b6c 100644 --- a/plugins/lombok/lombok-compiler-plugin/README.md +++ b/plugins/lombok/lombok-compiler-plugin/README.md @@ -17,6 +17,7 @@ Features support: - [ ] Copy annotations - [ ] Strip defined prefixes - in config and @Accessors - [ ] Skip generation with AccessLevel.NONE + - [ ] Strip 'is' prefix for boolean fields [~] [@With](https://projectlombok.org/features/With) @@ -37,7 +38,7 @@ Features support: Other todos: - [x] Generic classes - - [ ] Actually run compiled code + - [x] Actually run compiled code - [ ] 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/config/annotationConfig.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/annotationConfig.kt index 86ce4448fea..53f6e5d6341 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 @@ -31,11 +31,13 @@ data class Accessors(val fluent: Boolean = false, val chain: Boolean = false) { override val name: FqName = LombokNames.ACCESSORS - override fun extract(annotation: AnnotationDescriptor): Accessors = - Accessors( - fluent = annotation.getBooleanArgument("fluent"), - chain = annotation.getBooleanArgument("chain") + override fun extract(annotation: AnnotationDescriptor): Accessors { + val fluent = annotation.getBooleanArgument("fluent") + return Accessors( + fluent = fluent, + chain = annotation.getBooleanArgument("chain", default = fluent) ) + } } } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructor.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructor.kt index bea64758af7..7ed3d089441 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructor.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructor.kt @@ -19,8 +19,8 @@ public class ConstructorExample { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val generated = ConstructorExample(12, "sdf", true) } } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructorStatic.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructorStatic.kt index e1175001dba..2febbd5295a 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructorStatic.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructorStatic.kt @@ -24,8 +24,8 @@ public class ConstructorExample { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val existing: ConstructorExample = ConstructorExample("existing") val generated: ConstructorExample = ConstructorExample.of(45, "234", false) } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/clashAccessors.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/clashAccessors.kt new file mode 100644 index 00000000000..ff61f3b5399 --- /dev/null +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/clashAccessors.kt @@ -0,0 +1,111 @@ +//FILE: SuperClass.java + +import lombok.*; +import java.util.*; + +public class SuperClass { + + public void setName(String name) { + + } + +} + + +//FILE: ClashTest.java + +import lombok.*; +import java.util.*; + +@Getter +@Setter +public class ClashTest extends SuperClass { + private int age = 10; + + private String name; + + private boolean human; + + private Integer toOverride; + + public int getAge() { + return age; + } + + public void setAge(String age) { + + } + + public boolean isHuman(String arg) { + return human; + } + + + static void test() { + val obj = new ClashTest(); + + obj.getAge(); +// obj.setAge(41); + + obj.getName(); + obj.setName("Al"); + + obj.isHuman(); + obj.setHuman(true); + obj.isHuman("sdf"); + } + +} + +//FILE: ChildClass.java + +import lombok.*; +import java.util.*; + +public class ChildClass extends ClashTest{ + + @Override + public Integer getToOverride() { + return super.getToOverride(); + } + +} + + +//FILE: test.kt + +class KotlinChildClass : ClashTest() { + + override fun getToOverride(): Int = super.getToOverride() + +} + +class Test { + fun run() { + val obj = ClashTest() + + obj.getAge() + //todo thats shouldn't work + obj.setAge(41) + val age = obj.age + obj.age = 12 + + + obj.getName() + obj.setName("Al") + val name = obj.name + obj.name = "sdf" + + obj.isHuman() + obj.setHuman(true) + obj.isHuman("sdf") + val isHuman = obj.isHuman + obj.isHuman = false + + val childObj = KotlinChildClass() + childObj.getToOverride() + childObj.setToOverride(34) + childObj.toOverride + childObj.toOverride = 412 + } +} diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/configSimple.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/configSimple.kt index b6f3f748271..ad516763375 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/configSimple.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/configSimple.kt @@ -15,8 +15,8 @@ public class GetterTest { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val obj = GetterTest() obj.primitiveBoolean diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsAccessors.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsAccessors.kt index 5354e9a2920..ca61daaef17 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsAccessors.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsAccessors.kt @@ -26,13 +26,13 @@ public class GenericsTest { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val obj = GenericsTest() val age: Int = obj.getAge(); - val a: String = obj.getFieldA(); obj.setFieldA("fooo"); - val b: Boolean = obj.getFieldB(); + val a: String = obj.getFieldA(); + val b: Boolean? = obj.getFieldB(); obj.setFieldC(java.util.HashMap()); } } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsConstructors.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsConstructors.kt index 4db9a4f58ea..94bdf67716e 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsConstructors.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsConstructors.kt @@ -21,8 +21,8 @@ public class ConstructorExample { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val generated = ConstructorExample(12, 42L, true) val generatedReq = ConstructorExample("234"); } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsConstructorsStatic.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsConstructorsStatic.kt index 32ce1594250..2b8f7b17d60 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsConstructorsStatic.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/genericsConstructorsStatic.kt @@ -21,8 +21,8 @@ public class ConstructorExample { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val generated: ConstructorExample = ConstructorExample.of(12, 42L, true) val generatedReq: ConstructorExample = ConstructorExample.of("234"); } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/getters.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/getters.kt index 2a2fa5424c9..871d32a357e 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/getters.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/getters.kt @@ -22,8 +22,8 @@ public class GetterTest { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val obj = GetterTest() val getter = obj.getAge() val property = obj.age @@ -37,6 +37,8 @@ object Test { //shouldn't be accesible from here // obj.getName() + + OverridenGetterTest().usage() } class OverridenGetterTest : GetterTest() { diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/gettersClassLevel.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/gettersClassLevel.kt index 31c0a0be9c5..028733acc74 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/gettersClassLevel.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/gettersClassLevel.kt @@ -23,8 +23,8 @@ public class ClassLevelGetterTest { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val obj = ClassLevelGetterTest() val getter = obj.getAge() val property = obj.age @@ -36,6 +36,8 @@ object Test { //shouldn't be accesible from here // obj.getName() + + OverridenGetterTest().usage() } class OverridenGetterTest : ClassLevelGetterTest() { diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/gettersFluent.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/gettersFluent.kt index 183d62423e1..4057b62f5f7 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/gettersFluent.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/gettersFluent.kt @@ -27,8 +27,8 @@ public class FluentTest { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val obj = FluentTest() val getter = obj.age() @@ -38,6 +38,8 @@ object Test { obj.overrideAnnotation obj.getOverrideAnnotation() + + OverridenGetterTest().usage() } class OverridenGetterTest : FluentTest() { diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/noArgsConstructor.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/noArgsConstructor.kt index 178f567c46d..e815866aea5 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/noArgsConstructor.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/noArgsConstructor.kt @@ -22,8 +22,8 @@ public class ConstructorExample { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val existing = ConstructorExample("existing") val generated = ConstructorExample() } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/noArgsConstructorStatic.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/noArgsConstructorStatic.kt index ce8985dd7b7..eda83b6a69f 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/noArgsConstructorStatic.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/noArgsConstructorStatic.kt @@ -22,8 +22,8 @@ public class ConstructorExample { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val existing: ConstructorExample = ConstructorExample("existing") val generated: ConstructorExample = ConstructorExample.make() } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/requiredArgsConstructor.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/requiredArgsConstructor.kt index b6b50a1069c..c4b7f868fb0 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/requiredArgsConstructor.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/requiredArgsConstructor.kt @@ -33,8 +33,8 @@ public class ConstructorExample { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val generated = ConstructorExample("foo", true) } } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/requiredArgsConstructorStatic.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/requiredArgsConstructorStatic.kt index 085aae58686..c343dec6a83 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/requiredArgsConstructorStatic.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/requiredArgsConstructorStatic.kt @@ -35,8 +35,8 @@ public class ConstructorExample { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val generated = ConstructorExample.build("foo", true, 12) } } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/setters.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/setters.kt index add9462fcde..acccd14a95f 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/setters.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/setters.kt @@ -20,8 +20,8 @@ public class SetterTest { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val obj = SetterTest() obj.setAge(42) obj.age = 42 @@ -32,6 +32,8 @@ object Test { //shouldn't be accesible from here // obj.setName("abc") + + OverridenGetterTest().usage() } class OverridenGetterTest : SetterTest() { diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/settersClassLevel.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/settersClassLevel.kt index 2d63c9afda5..7b1a5632095 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/settersClassLevel.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/settersClassLevel.kt @@ -23,8 +23,8 @@ public class SetterTest { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val obj = SetterTest() obj.setAge(42) obj.age = 42 diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/settersVariations.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/settersVariations.kt index 52dcdaa774b..f9210b2c279 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/settersVariations.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/settersVariations.kt @@ -25,10 +25,10 @@ public class SetterTest { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val obj = SetterTest() - obj.fluent(12); + obj.fluent(12) obj.setChained("zz").getChained() obj.whyNotBoth("zzz").whyNotBoth() } diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/simple.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/simple.kt index 0c180fdc438..3ac6abef25c 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/simple.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/simple.kt @@ -13,8 +13,8 @@ public class GetterSetterExample { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val obj = GetterSetterExample() val getter = obj.getAge() val property = obj.age diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/with.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/with.kt index b463472e97f..779771176c8 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/with.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/with.kt @@ -26,8 +26,8 @@ public class WithExample { //FILE: test.kt -object Test { - fun usage() { +class Test { + fun run() { val obj: WithExample = WithExample().withAge(16).withName("fooo") } } diff --git a/plugins/lombok/lombok-compiler-plugin/tests/org/jetbrains/kotlin/lombok/AbstractLombokCompileTest.kt b/plugins/lombok/lombok-compiler-plugin/tests/org/jetbrains/kotlin/lombok/AbstractLombokCompileTest.kt index eda43493799..239a6dca7b9 100644 --- a/plugins/lombok/lombok-compiler-plugin/tests/org/jetbrains/kotlin/lombok/AbstractLombokCompileTest.kt +++ b/plugins/lombok/lombok-compiler-plugin/tests/org/jetbrains/kotlin/lombok/AbstractLombokCompileTest.kt @@ -13,11 +13,14 @@ import org.jetbrains.kotlin.codegen.CodegenTestCase import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.utils.PathUtil import java.io.File +import java.net.URLClassLoader abstract class AbstractLombokCompileTest : CodegenTestCase() { + private val commonClassLoader = URLClassLoader(arrayOf(getLombokJar().toURI().toURL())) + override fun doMultiFileTest(wholeFile: File, files: List) { - compile(files) + compile(files, true, true) } override fun setupEnvironment(environment: KotlinCoreEnvironment) { @@ -35,6 +38,19 @@ abstract class AbstractLombokCompileTest : CodegenTestCase() { } } + override fun postCompile(kotlinOut: File, javaOut: File?) { + //run compiled code, Test.run() method is expected to be in generated classes + val cp = listOfNotNull(kotlinOut, javaOut).map { it.toURI().toURL() }.toTypedArray() + val classLoader = URLClassLoader(cp, commonClassLoader) + try { + val clazz = classLoader.loadClass("Test") + clazz.getMethod("run").invoke(clazz.newInstance()) + } catch (t: Throwable) { + LOG.error("Error running Test.run()", t) + fail("Error running compiled code: $t") + } + } + private fun writeLombokConfig(directory: String, testFiles: List): File? = testFiles.singleOrNull { it.name == "lombok.config" }?.let { val file = File(directory, it.name) 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 97911d7f65d..7b1efebccb7 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 @@ -46,6 +46,11 @@ public class LombokCompileTestGenerated extends AbstractLombokCompileTest { runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructorStatic.kt"); } + @TestMetadata("clashAccessors.kt") + public void testClashAccessors() throws Exception { + runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/clashAccessors.kt"); + } + @TestMetadata("gettersClassLevel.kt") public void testGettersClassLevel() throws Exception { runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/gettersClassLevel.kt");