[lombok] Get field names directly from JavaClassImpl

Otherwise it fails with recursion on annotation types
#KT-47513 Fixed
This commit is contained in:
Andrey Zinovyev
2021-06-29 16:27:48 +03:00
committed by teamcityserver
parent 9b71175902
commit 1130344fb1
4 changed files with 62 additions and 12 deletions
@@ -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)
}
@@ -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<PropertyDescriptor> =
this.unsubstitutedMemberScope.getVariableNames()
.map {
this.unsubstitutedMemberScope.getContributedVariables(it, NoLookupLocation.FROM_SYNTHETIC_SCOPE).single()
}.filter { it.isJavaField }
fun ClassDescriptor.getJavaFields(): List<PropertyDescriptor> {
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
@@ -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()
}
}
@@ -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");
}
}
}