[lombok] Skip generation with AccessLevel.NONE

This commit is contained in:
Andrey Zinovyev
2021-03-31 15:58:13 +03:00
committed by TeamCityServer
parent be4a518a25
commit 9ebce7849c
9 changed files with 66 additions and 31 deletions
@@ -22,7 +22,7 @@ Features support:
- [ ] lombok.copyableAnnotations
- [ ] Copy annotations
- [x] Strip defined prefixes - in config and @Accessors
- [ ] Skip generation with AccessLevel.NONE
- [x] Skip generation with AccessLevel.NONE
- [x] Strip 'is' prefix for boolean fields
[~] [@With](https://projectlombok.org/features/With)
@@ -25,7 +25,7 @@ class LombokSyntheticJavaPartsProvider(private val config: LombokConfig) : Synth
listOf(
GetterProcessor(config),
SetterProcessor(config),
WithProcessor(config),
WithProcessor(),
NoArgsConstructorProcessor(),
AllArgsConstructorProcessor(),
RequiredArgsConstructorProcessor()
@@ -0,0 +1,35 @@
/*
* 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.config
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
enum class AccessLevel {
PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,
/** Represents not generating anything or the complete lack of a method. */
NONE;
fun toDescriptorVisibility(): DescriptorVisibility = toDescriptorVisibility(this)
companion object {
fun toDescriptorVisibility(v: AccessLevel): DescriptorVisibility {
val visibility = when (v) {
PUBLIC -> Visibilities.Public
PROTECTED -> Visibilities.Protected
PRIVATE -> Visibilities.Private
PACKAGE -> JavaVisibilities.PackageVisibility
MODULE -> Visibilities.Internal
NONE -> Visibilities.Private
}
return JavaDescriptorVisibilities.toDescriptorVisibility(visibility)
}
}
}
@@ -83,35 +83,35 @@ data class Accessors(
}
}
data class Getter(val visibility: DescriptorVisibility = DescriptorVisibilities.PUBLIC) {
data class Getter(val visibility: AccessLevel = AccessLevel.PUBLIC) {
companion object : AnnotationCompanion<Getter>() {
override val name: FqName = LombokNames.GETTER
override fun extract(annotation: AnnotationDescriptor): Getter =
Getter(
visibility = getVisibility(annotation)
visibility = getAccessLevel(annotation)
)
}
}
data class Setter(val visibility: DescriptorVisibility = DescriptorVisibilities.PUBLIC) {
data class Setter(val visibility: AccessLevel = AccessLevel.PUBLIC) {
companion object : AnnotationCompanion<Setter>() {
override val name: FqName = LombokNames.SETTER
override fun extract(annotation: AnnotationDescriptor): Setter =
Setter(
visibility = getVisibility(annotation)
visibility = getAccessLevel(annotation)
)
}
}
data class With(val visibility: DescriptorVisibility) {
data class With(val visibility: AccessLevel = AccessLevel.PUBLIC) {
companion object : AnnotationCompanion<With>() {
override val name: FqName = LombokNames.WITH
override fun extract(annotation: AnnotationDescriptor): With =
With(
visibility = getVisibility(annotation)
visibility = getAccessLevel(annotation)
)
}
}
@@ -36,6 +36,8 @@ class GetterProcessor(private val config: LombokConfig) : Processor {
getter: Getter,
globalAccessors: Accessors
): SimpleFunctionDescriptor? {
if (getter.visibility == AccessLevel.NONE) return null
val accessors = Accessors.getIfAnnotated(field, config) ?: globalAccessors
return field.toPropertyName(accessors)?.let { propertyName ->
val functionName =
@@ -49,7 +51,7 @@ class GetterProcessor(private val config: LombokConfig) : Processor {
Name.identifier(functionName),
emptyList(),
field.returnType,
visibility = getter.visibility
visibility = getter.visibility.toDescriptorVisibility()
)
}
}
@@ -7,10 +7,7 @@ package org.jetbrains.kotlin.lombok.processor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
import org.jetbrains.kotlin.lombok.config.Accessors
import org.jetbrains.kotlin.lombok.config.Data
import org.jetbrains.kotlin.lombok.config.LombokConfig
import org.jetbrains.kotlin.lombok.config.Setter
import org.jetbrains.kotlin.lombok.config.*
import org.jetbrains.kotlin.lombok.utils.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
@@ -37,6 +34,8 @@ class SetterProcessor(private val config: LombokConfig) : Processor {
getter: Setter,
globalAccessors: Accessors
): SimpleFunctionDescriptor? {
if (getter.visibility == AccessLevel.NONE) return null
val accessors = Accessors.getIfAnnotated(field, config) ?: globalAccessors
return field.toPropertyName(accessors)?.let { propertyName ->
val functionName =
@@ -49,7 +48,7 @@ class SetterProcessor(private val config: LombokConfig) : Processor {
Name.identifier(functionName),
listOf(ValueParameter(field.name, field.type)),
returnType,
visibility = getter.visibility
visibility = getter.visibility.toDescriptorVisibility()
)
}
}
@@ -9,12 +9,12 @@ 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.AccessLevel
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 {
class WithProcessor : Processor {
override fun contribute(classDescriptor: ClassDescriptor, jClass: JavaClassImpl): Parts {
val clWith = With.getOrNull(classDescriptor)
@@ -32,6 +32,7 @@ class WithProcessor(private val config: LombokConfig) : Processor {
field: PropertyDescriptor,
with: With
): SimpleFunctionDescriptor? {
if (with.visibility == AccessLevel.NONE) return null
val functionName = "with" + toPropertyNameCapitalized(field.name.identifier)
@@ -39,7 +40,7 @@ class WithProcessor(private val config: LombokConfig) : Processor {
Name.identifier(functionName),
listOf(ValueParameter(field.name, field.type)),
classDescriptor.defaultType,
visibility = with.visibility
visibility = with.visibility.toDescriptorVisibility()
)
}
}
@@ -5,25 +5,18 @@
package org.jetbrains.kotlin.lombok.utils
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
import org.jetbrains.kotlin.lombok.config.AccessLevel
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.constants.*
fun getVisibility(annotation: AnnotationDescriptor, field: String = "value"): DescriptorVisibility {
val value = annotation.getStringArgument(field) ?: "PUBLIC"
val visibility = when (value) {
"PUBLIC" -> Visibilities.Public
"PROTECTED" -> Visibilities.Protected
"PRIVATE" -> Visibilities.Private
"PACKAGE" -> JavaVisibilities.PackageVisibility
else -> Visibilities.Public
}
return JavaDescriptorVisibilities.toDescriptorVisibility(visibility)
fun getVisibility(annotation: AnnotationDescriptor, field: String = "value"): DescriptorVisibility =
getAccessLevel(annotation, field).toDescriptorVisibility()
fun getAccessLevel(annotation: AnnotationDescriptor, field: String = "value"): AccessLevel {
val value = annotation.getStringArgument(field) ?: return AccessLevel.PUBLIC
return AccessLevel.valueOf(value)
}
fun AnnotationDescriptor.getStringArgument(argumentName: String): String? {
@@ -12,9 +12,12 @@ public class GetterTest {
@Getter private Boolean boxedBoolean;
@Getter(AccessLevel.NONE) private Boolean invisible;
void test() {
getAge();
isPrimitiveBoolean();
// getInvisible();
}
}
@@ -38,6 +41,8 @@ class Test {
//shouldn't be accesible from here
// obj.getName()
// obj.getInvisible()
OverridenGetterTest().usage()
}