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 4021b6f0d85..ed233710be2 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 @@ -9,10 +9,9 @@ import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor -import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassDescriptor -import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl import org.jetbrains.kotlin.lombok.config.LombokConfig import org.jetbrains.kotlin.lombok.processor.* +import org.jetbrains.kotlin.lombok.utils.getJavaClass import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.jvm.SyntheticJavaPartsProvider import java.util.* @@ -64,12 +63,8 @@ class LombokSyntheticJavaPartsProvider(config: LombokConfig) : SyntheticJavaPart addNonExistent(result, constructors) } - //we process only local java files - private fun extractClass(descriptor: ClassDescriptor): JavaClassImpl? = - (descriptor as? LazyJavaClassDescriptor)?.jClass as? JavaClassImpl - private fun getSyntheticParts(descriptor: ClassDescriptor): SyntheticParts = - extractClass(descriptor)?.let { _ -> + descriptor.getJavaClass()?.let { _ -> partsCache.getOrPut(descriptor) { computeSyntheticParts(descriptor) } diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/utils/descriptorUtils.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/utils/descriptorUtils.kt index 4f2c2d24746..f59e36a132b 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/utils/descriptorUtils.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/utils/descriptorUtils.kt @@ -11,7 +11,9 @@ import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.load.java.descriptors.JavaClassConstructorDescriptor +import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassDescriptor import org.jetbrains.kotlin.load.java.lazy.descriptors.isJavaField +import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.model.SimpleTypeMarker @@ -89,10 +91,15 @@ private fun CallableDescriptor.makeValueParameter(param: LombokValueParameter, i ) } -fun ClassDescriptor.getJavaFields(): List = - this.unsubstitutedMemberScope.getVariableNames() - .map { - this.unsubstitutedMemberScope.getContributedVariables(it, NoLookupLocation.FROM_SYNTHETIC_SCOPE).single() - }.filter { it.isJavaField } +fun ClassDescriptor.getJavaFields(): List { + val variableNames = getJavaClass()?.fields?.map { it.name } ?: emptyList() + return variableNames + .mapNotNull { this.unsubstitutedMemberScope.getContributedVariables(it, NoLookupLocation.FROM_SYNTHETIC_SCOPE).singleOrNull() } + .filter { it.isJavaField } +} fun KotlinType.isPrimitiveBoolean(): Boolean = this is SimpleTypeMarker && isBoolean() + +//we process local java files only +fun ClassDescriptor.getJavaClass(): JavaClassImpl? = + (this as? LazyJavaClassDescriptor)?.jClass as? JavaClassImpl diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/processErrors/annotationTypes.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/processErrors/annotationTypes.kt new file mode 100644 index 00000000000..0061aca19ea --- /dev/null +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/processErrors/annotationTypes.kt @@ -0,0 +1,30 @@ +//FILE: Anno.java + +import java.lang.*; +import java.lang.annotation.*; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface Anno { + String value() default "sdf"; +} + +//FILE: Foo.java + +import lombok.*; +import org.jetbrains.annotations.*; + +public class Foo { + private Integer age = 10; + private String name; +} + + +//FILE: test.kt + +@Anno +class Test { + fun run() { + val obj = Foo() + } +} 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 77bae4230cf..79829f5777c 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 @@ -173,4 +173,22 @@ public class LombokCompileTestGenerated extends AbstractLombokCompileTest { public void testWith() throws Exception { runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/with.kt"); } + + @TestMetadata("plugins/lombok/lombok-compiler-plugin/testData/compile/processErrors") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ProcessErrors extends AbstractLombokCompileTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInProcessErrors() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/lombok/lombok-compiler-plugin/testData/compile/processErrors"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @TestMetadata("annotationTypes.kt") + public void testAnnotationTypes() throws Exception { + runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/processErrors/annotationTypes.kt"); + } + } }