[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 - [ ] lombok.copyableAnnotations
- [ ] Copy annotations - [ ] Copy annotations
- [x] Strip defined prefixes - in config and @Accessors - [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 - [x] Strip 'is' prefix for boolean fields
[~] [@With](https://projectlombok.org/features/With) [~] [@With](https://projectlombok.org/features/With)
@@ -25,7 +25,7 @@ class LombokSyntheticJavaPartsProvider(private val config: LombokConfig) : Synth
listOf( listOf(
GetterProcessor(config), GetterProcessor(config),
SetterProcessor(config), SetterProcessor(config),
WithProcessor(config), WithProcessor(),
NoArgsConstructorProcessor(), NoArgsConstructorProcessor(),
AllArgsConstructorProcessor(), AllArgsConstructorProcessor(),
RequiredArgsConstructorProcessor() 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>() { companion object : AnnotationCompanion<Getter>() {
override val name: FqName = LombokNames.GETTER override val name: FqName = LombokNames.GETTER
override fun extract(annotation: AnnotationDescriptor): Getter = override fun extract(annotation: AnnotationDescriptor): Getter =
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>() { companion object : AnnotationCompanion<Setter>() {
override val name: FqName = LombokNames.SETTER override val name: FqName = LombokNames.SETTER
override fun extract(annotation: AnnotationDescriptor): Setter = override fun extract(annotation: AnnotationDescriptor): Setter =
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>() { companion object : AnnotationCompanion<With>() {
override val name: FqName = LombokNames.WITH override val name: FqName = LombokNames.WITH
override fun extract(annotation: AnnotationDescriptor): With = override fun extract(annotation: AnnotationDescriptor): With =
With( With(
visibility = getVisibility(annotation) visibility = getAccessLevel(annotation)
) )
} }
} }
@@ -36,6 +36,8 @@ class GetterProcessor(private val config: LombokConfig) : Processor {
getter: Getter, getter: Getter,
globalAccessors: Accessors globalAccessors: Accessors
): SimpleFunctionDescriptor? { ): SimpleFunctionDescriptor? {
if (getter.visibility == AccessLevel.NONE) return null
val accessors = Accessors.getIfAnnotated(field, config) ?: globalAccessors val accessors = Accessors.getIfAnnotated(field, config) ?: globalAccessors
return field.toPropertyName(accessors)?.let { propertyName -> return field.toPropertyName(accessors)?.let { propertyName ->
val functionName = val functionName =
@@ -49,7 +51,7 @@ class GetterProcessor(private val config: LombokConfig) : Processor {
Name.identifier(functionName), Name.identifier(functionName),
emptyList(), emptyList(),
field.returnType, 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.descriptors.*
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
import org.jetbrains.kotlin.lombok.config.Accessors import org.jetbrains.kotlin.lombok.config.*
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.utils.* import org.jetbrains.kotlin.lombok.utils.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
@@ -37,6 +34,8 @@ class SetterProcessor(private val config: LombokConfig) : Processor {
getter: Setter, getter: Setter,
globalAccessors: Accessors globalAccessors: Accessors
): SimpleFunctionDescriptor? { ): SimpleFunctionDescriptor? {
if (getter.visibility == AccessLevel.NONE) return null
val accessors = Accessors.getIfAnnotated(field, config) ?: globalAccessors val accessors = Accessors.getIfAnnotated(field, config) ?: globalAccessors
return field.toPropertyName(accessors)?.let { propertyName -> return field.toPropertyName(accessors)?.let { propertyName ->
val functionName = val functionName =
@@ -49,7 +48,7 @@ class SetterProcessor(private val config: LombokConfig) : Processor {
Name.identifier(functionName), Name.identifier(functionName),
listOf(ValueParameter(field.name, field.type)), listOf(ValueParameter(field.name, field.type)),
returnType, 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.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl 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.config.With
import org.jetbrains.kotlin.lombok.utils.* import org.jetbrains.kotlin.lombok.utils.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class WithProcessor(private val config: LombokConfig) : Processor { class WithProcessor : Processor {
override fun contribute(classDescriptor: ClassDescriptor, jClass: JavaClassImpl): Parts { override fun contribute(classDescriptor: ClassDescriptor, jClass: JavaClassImpl): Parts {
val clWith = With.getOrNull(classDescriptor) val clWith = With.getOrNull(classDescriptor)
@@ -32,6 +32,7 @@ class WithProcessor(private val config: LombokConfig) : Processor {
field: PropertyDescriptor, field: PropertyDescriptor,
with: With with: With
): SimpleFunctionDescriptor? { ): SimpleFunctionDescriptor? {
if (with.visibility == AccessLevel.NONE) return null
val functionName = "with" + toPropertyNameCapitalized(field.name.identifier) val functionName = "with" + toPropertyNameCapitalized(field.name.identifier)
@@ -39,7 +40,7 @@ class WithProcessor(private val config: LombokConfig) : Processor {
Name.identifier(functionName), Name.identifier(functionName),
listOf(ValueParameter(field.name, field.type)), listOf(ValueParameter(field.name, field.type)),
classDescriptor.defaultType, classDescriptor.defaultType,
visibility = with.visibility visibility = with.visibility.toDescriptorVisibility()
) )
} }
} }
@@ -5,25 +5,18 @@
package org.jetbrains.kotlin.lombok.utils package org.jetbrains.kotlin.lombok.utils
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.DescriptorVisibility import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities import org.jetbrains.kotlin.lombok.config.AccessLevel
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.constants.* import org.jetbrains.kotlin.resolve.constants.*
fun getVisibility(annotation: AnnotationDescriptor, field: String = "value"): DescriptorVisibility { fun getVisibility(annotation: AnnotationDescriptor, field: String = "value"): DescriptorVisibility =
val value = annotation.getStringArgument(field) ?: "PUBLIC" getAccessLevel(annotation, field).toDescriptorVisibility()
val visibility = when (value) {
"PUBLIC" -> Visibilities.Public fun getAccessLevel(annotation: AnnotationDescriptor, field: String = "value"): AccessLevel {
"PROTECTED" -> Visibilities.Protected val value = annotation.getStringArgument(field) ?: return AccessLevel.PUBLIC
"PRIVATE" -> Visibilities.Private return AccessLevel.valueOf(value)
"PACKAGE" -> JavaVisibilities.PackageVisibility
else -> Visibilities.Public
}
return JavaDescriptorVisibilities.toDescriptorVisibility(visibility)
} }
fun AnnotationDescriptor.getStringArgument(argumentName: String): String? { fun AnnotationDescriptor.getStringArgument(argumentName: String): String? {
@@ -12,9 +12,12 @@ public class GetterTest {
@Getter private Boolean boxedBoolean; @Getter private Boolean boxedBoolean;
@Getter(AccessLevel.NONE) private Boolean invisible;
void test() { void test() {
getAge(); getAge();
isPrimitiveBoolean(); isPrimitiveBoolean();
// getInvisible();
} }
} }
@@ -38,6 +41,8 @@ class Test {
//shouldn't be accesible from here //shouldn't be accesible from here
// obj.getName() // obj.getName()
// obj.getInvisible()
OverridenGetterTest().usage() OverridenGetterTest().usage()
} }