[lombok] Experimental lombok plugin prototype

Add extension point for java descriptors
Add simple usage of this point to generate getter method
Add simple test infrastructure to test compilation with lombok plugin
This commit is contained in:
Andrey Zinovyev
2021-03-24 13:09:50 +03:00
committed by TeamCityServer
parent ac86ad252f
commit f71e08df4d
30 changed files with 606 additions and 3 deletions
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.load.java.typeEnhancement.SignatureEnhancement
import org.jetbrains.kotlin.load.kotlin.DeserializedDescriptorResolver
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.resolve.jvm.SyntheticJavaPartsProvider
import org.jetbrains.kotlin.resolve.sam.SamConversionResolver
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
import org.jetbrains.kotlin.storage.StorageManager
@@ -63,7 +64,8 @@ class JavaResolverComponents(
val javaClassesTracker: JavaClassesTracker,
val settings: JavaResolverSettings,
val kotlinTypeChecker: NewKotlinTypeChecker,
val javaTypeEnhancementState: JavaTypeEnhancementState
val javaTypeEnhancementState: JavaTypeEnhancementState,
val syntheticPartsProvider: SyntheticJavaPartsProvider = SyntheticJavaPartsProvider.EMPTY
) {
fun replace(
javaResolverCache: JavaResolverCache = this.javaResolverCache
@@ -78,6 +78,7 @@ class LazyJavaClassMemberScope(
addAll(declaredMemberIndex().getMethodNames())
addAll(declaredMemberIndex().getRecordComponentNames())
addAll(computeClassNames(kindFilter, nameFilter))
addAll(c.components.syntheticPartsProvider.getSyntheticFunctionNames(ownerDescriptor))
}
internal val constructors = c.storageManager.createLazyValue {
@@ -496,6 +497,8 @@ class LazyJavaClassMemberScope(
if (jClass.isRecord && declaredMemberIndex().findRecordComponentByName(name) != null && result.none { it.valueParameters.isEmpty() }) {
result.add(resolveRecordComponentToFunctionDescriptor(declaredMemberIndex().findRecordComponentByName(name)!!))
}
c.components.syntheticPartsProvider.generateSyntheticMethods(ownerDescriptor, name, result)
}
private fun resolveRecordComponentToFunctionDescriptor(recordComponent: JavaRecordComponent): JavaMethodDescriptor {
@@ -0,0 +1,37 @@
/*
* 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.resolve.jvm
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import org.jetbrains.kotlin.name.Name
interface SyntheticJavaPartsProvider {
companion object {
val EMPTY = CompositeSyntheticJavaPartsProvider(emptyList())
}
fun getSyntheticFunctionNames(thisDescriptor: ClassDescriptor): List<Name>
fun generateSyntheticMethods(
thisDescriptor: ClassDescriptor,
name: Name,
result: MutableCollection<SimpleFunctionDescriptor>
)
}
class CompositeSyntheticJavaPartsProvider(private val inner: List<SyntheticJavaPartsProvider>) : SyntheticJavaPartsProvider {
override fun getSyntheticFunctionNames(thisDescriptor: ClassDescriptor): List<Name> =
inner.flatMap { it.getSyntheticFunctionNames(thisDescriptor) }
override fun generateSyntheticMethods(
thisDescriptor: ClassDescriptor,
name: Name,
result: MutableCollection<SimpleFunctionDescriptor>
) = inner.forEach { it.generateSyntheticMethods(thisDescriptor, name, result) }
}