diff --git a/plugins/lombok/lombok-compiler-plugin/README.md b/plugins/lombok/lombok-compiler-plugin/README.md index 6fb3a6313bd..a5b9bc03d1a 100644 --- a/plugins/lombok/lombok-compiler-plugin/README.md +++ b/plugins/lombok/lombok-compiler-plugin/README.md @@ -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) 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 76c0d32af76..7b34258dd63 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 @@ -25,7 +25,7 @@ class LombokSyntheticJavaPartsProvider(private val config: LombokConfig) : Synth listOf( GetterProcessor(config), SetterProcessor(config), - WithProcessor(config), + WithProcessor(), NoArgsConstructorProcessor(), AllArgsConstructorProcessor(), RequiredArgsConstructorProcessor() diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/AccessLevel.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/AccessLevel.kt new file mode 100644 index 00000000000..a5bf522d74c --- /dev/null +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/AccessLevel.kt @@ -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) + } + } +} diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/annotationConfig.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/annotationConfig.kt index 9ebcd2aff2d..9bda346a17a 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/annotationConfig.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/config/annotationConfig.kt @@ -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() { 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() { 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() { override val name: FqName = LombokNames.WITH override fun extract(annotation: AnnotationDescriptor): With = With( - visibility = getVisibility(annotation) + visibility = getAccessLevel(annotation) ) } } diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/GetterProcessor.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/GetterProcessor.kt index 2149bce2cbd..a1c11b82fc9 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/GetterProcessor.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/GetterProcessor.kt @@ -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() ) } } diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/SetterProcessor.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/SetterProcessor.kt index 283c51fac0d..e8043e6cc28 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/SetterProcessor.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/SetterProcessor.kt @@ -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() ) } } diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/WithProcessor.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/WithProcessor.kt index 3d5652a9c5f..8aff601a7f1 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/WithProcessor.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/processor/WithProcessor.kt @@ -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() ) } } diff --git a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/utils/annotationUtils.kt b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/utils/annotationUtils.kt index 2533ae9837d..ae99965c00c 100644 --- a/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/utils/annotationUtils.kt +++ b/plugins/lombok/lombok-compiler-plugin/src/org/jetbrains/kotlin/lombok/utils/annotationUtils.kt @@ -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? { diff --git a/plugins/lombok/lombok-compiler-plugin/testData/compile/getters.kt b/plugins/lombok/lombok-compiler-plugin/testData/compile/getters.kt index 871d32a357e..9f6807fc258 100644 --- a/plugins/lombok/lombok-compiler-plugin/testData/compile/getters.kt +++ b/plugins/lombok/lombok-compiler-plugin/testData/compile/getters.kt @@ -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() }