[lombok] Support for lombok.accessors.prefix config
This commit is contained in:
committed by
TeamCityServer
parent
17e4a6142c
commit
be4a518a25
@@ -17,11 +17,11 @@ Features support:
|
|||||||
- [x] lombok.getter.noIsPrefix
|
- [x] lombok.getter.noIsPrefix
|
||||||
- [x] lombok.accessors.fluent
|
- [x] lombok.accessors.fluent
|
||||||
- [x] lombok.accessors.chain
|
- [x] lombok.accessors.chain
|
||||||
- [ ] lombok.accessors.prefix
|
- [x] lombok.accessors.prefix
|
||||||
- [ ] lombok.noArgsConstructor.extraPrivate
|
- [ ] lombok.noArgsConstructor.extraPrivate (probably we don't need to support it - it is private after all)
|
||||||
- [ ] lombok.copyableAnnotations
|
- [ ] lombok.copyableAnnotations
|
||||||
- [ ] Copy annotations
|
- [ ] Copy annotations
|
||||||
- [~] Strip defined prefixes - in config and @Accessors
|
- [x] Strip defined prefixes - in config and @Accessors
|
||||||
- [ ] Skip generation with AccessLevel.NONE
|
- [ ] Skip generation with AccessLevel.NONE
|
||||||
- [x] Strip 'is' prefix for boolean fields
|
- [x] Strip 'is' prefix for boolean fields
|
||||||
|
|
||||||
|
|||||||
+62
-10
@@ -7,30 +7,82 @@ package org.jetbrains.kotlin.lombok.config
|
|||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class LombokConfig(private val config: Map<String, String>) {
|
class LombokConfig(private val config: Map<String, List<String>>) {
|
||||||
|
|
||||||
fun getString(key: String): String? = config[key]
|
fun getString(key: String): String? = config[key]?.firstOrNull()
|
||||||
|
|
||||||
fun getBoolean(key: String): Boolean? = getString(key)?.toBoolean()
|
fun getBoolean(key: String): Boolean? = getString(key)?.toBoolean()
|
||||||
|
|
||||||
fun getBooleanOrDefault(key: String, default: Boolean = false): Boolean = getBoolean(key) ?: default
|
fun getMultiString(key: String): List<String>? = config[key]
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
val Empty = LombokConfig(emptyMap())
|
val Empty = LombokConfig(emptyMap())
|
||||||
|
|
||||||
fun parse(path: File): LombokConfig {
|
fun parse(path: File): LombokConfig = ConfigParser.parse(path)
|
||||||
|
}
|
||||||
|
|
||||||
val config = mutableMapOf<String, String>()
|
}
|
||||||
|
|
||||||
path.forEachLine { line ->
|
/**
|
||||||
val parts = line.split("=", limit = 2)
|
* Simplified Lombok config parser.
|
||||||
if (parts.size == 2) {
|
* Ignores everything it doesn't understand
|
||||||
config[parts[0].trim()] = parts[1].trim()
|
*/
|
||||||
|
object ConfigParser {
|
||||||
|
|
||||||
|
//regex is from lombok source code
|
||||||
|
private val LINE = "(?:clear\\s+([^=]+))|(?:(\\S*?)\\s*([-+]?=)\\s*(.*?))".toRegex()
|
||||||
|
|
||||||
|
fun parse(path: File): LombokConfig {
|
||||||
|
val builder = ConfigBuilder()
|
||||||
|
path.forEachLine { parseLine(it, builder) }
|
||||||
|
return builder.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun parseLine(line: String, builder: ConfigBuilder) {
|
||||||
|
LINE.matchEntire(line)?.let { matchResult ->
|
||||||
|
if (matchResult.groups[1] == null) {
|
||||||
|
val keyName = matchResult.groupValues[2]
|
||||||
|
val operator = matchResult.groupValues[3]
|
||||||
|
val stringValue = matchResult.groupValues[4]
|
||||||
|
when (operator) {
|
||||||
|
"=" -> builder.setValue(keyName, stringValue)
|
||||||
|
"+=" -> builder.plusValue(keyName, stringValue)
|
||||||
|
"-=" -> builder.minusValue(keyName, stringValue)
|
||||||
|
else -> {
|
||||||
|
//do nothing
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
//clear
|
||||||
|
val keyName = matchResult.groupValues[1]
|
||||||
|
builder.clearValue(keyName)
|
||||||
}
|
}
|
||||||
return LombokConfig(config)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ConfigBuilder {
|
||||||
|
private val state: MutableMap<String, List<String>> = mutableMapOf()
|
||||||
|
|
||||||
|
fun setValue(name: String, value: String) {
|
||||||
|
state[name] = listOf(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun clearValue(name: String) {
|
||||||
|
state.remove(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun plusValue(name: String, value: String) {
|
||||||
|
state.merge(name, listOf(value)) { a, b -> a + b }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun minusValue(name: String, value: String) {
|
||||||
|
state.merge(name, listOf(value)) { a, b -> a - b }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun build(): LombokConfig = LombokConfig(state)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -73,8 +73,10 @@ data class Accessors(
|
|||||||
?: config.getBoolean("lombok.accessors.chain")
|
?: config.getBoolean("lombok.accessors.chain")
|
||||||
?: fluent
|
?: fluent
|
||||||
val noIsPrefix = config.getBoolean("lombok.getter.noIsPrefix") ?: false
|
val noIsPrefix = config.getBoolean("lombok.getter.noIsPrefix") ?: false
|
||||||
val prefix = annotation?.getStringArrayArgument("prefix")
|
val prefix =
|
||||||
?: emptyList()
|
annotation?.getStringArrayArgument("prefix")
|
||||||
|
?: config.getMultiString("lombok.accessors.prefix")
|
||||||
|
?: emptyList()
|
||||||
|
|
||||||
return Accessors(fluent, chain, noIsPrefix, prefix)
|
return Accessors(fluent, chain, noIsPrefix, prefix)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -6,7 +6,7 @@ import lombok.experimental.*;
|
|||||||
@Getter @Setter
|
@Getter @Setter
|
||||||
@Accessors(prefix = {"f", "field"})
|
@Accessors(prefix = {"f", "field"})
|
||||||
public class AccessorsTest {
|
public class AccessorsTest {
|
||||||
@Accessors
|
// @Accessors
|
||||||
private int age = 10;
|
private int age = 10;
|
||||||
private int fTarget = 42;
|
private int fTarget = 42;
|
||||||
private String fieldValue;
|
private String fieldValue;
|
||||||
@@ -48,8 +48,8 @@ class Test {
|
|||||||
fun run() {
|
fun run() {
|
||||||
val obj = AccessorsTest()
|
val obj = AccessorsTest()
|
||||||
|
|
||||||
obj.getAge()
|
// obj.getAge()
|
||||||
obj.setAge(123)
|
// obj.setAge(123)
|
||||||
|
|
||||||
obj.getTarget()
|
obj.getTarget()
|
||||||
obj.setTarget(34)
|
obj.setTarget(34)
|
||||||
|
|||||||
+74
@@ -0,0 +1,74 @@
|
|||||||
|
//FILE: AccessorsTest.java
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
import lombok.experimental.*;
|
||||||
|
|
||||||
|
@Getter @Setter
|
||||||
|
public class AccessorsTest {
|
||||||
|
// @Accessors
|
||||||
|
private int age = 10;
|
||||||
|
private int fTarget = 42;
|
||||||
|
private String fieldValue;
|
||||||
|
|
||||||
|
@Accessors(prefix = {})
|
||||||
|
private boolean isHuman;
|
||||||
|
private boolean fPrefixedBoolean;
|
||||||
|
@Accessors(prefix = {})
|
||||||
|
private Boolean isNonPrimitiveHuman;
|
||||||
|
|
||||||
|
static void test() {
|
||||||
|
val obj = new AccessorsTest();
|
||||||
|
|
||||||
|
// obj.getAge();
|
||||||
|
// obj.setAge(123);
|
||||||
|
|
||||||
|
obj.getTarget();
|
||||||
|
obj.setTarget(34);
|
||||||
|
|
||||||
|
obj.getValue();
|
||||||
|
obj.setValue("sdf");
|
||||||
|
|
||||||
|
obj.isHuman();
|
||||||
|
obj.setHuman(true);
|
||||||
|
|
||||||
|
obj.isPrefixedBoolean();
|
||||||
|
obj.setPrefixedBoolean(false);
|
||||||
|
|
||||||
|
obj.getIsNonPrimitiveHuman();
|
||||||
|
obj.setIsNonPrimitiveHuman(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//FILE: test.kt
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
fun run() {
|
||||||
|
val obj = AccessorsTest()
|
||||||
|
|
||||||
|
// obj.getAge()
|
||||||
|
// obj.setAge(123)
|
||||||
|
|
||||||
|
obj.getTarget()
|
||||||
|
obj.setTarget(34)
|
||||||
|
|
||||||
|
obj.getValue()
|
||||||
|
obj.setValue("sdf")
|
||||||
|
|
||||||
|
obj.isHuman()
|
||||||
|
obj.setHuman(true)
|
||||||
|
|
||||||
|
obj.isPrefixedBoolean()
|
||||||
|
obj.setPrefixedBoolean(false)
|
||||||
|
|
||||||
|
obj.getIsNonPrimitiveHuman()
|
||||||
|
obj.setIsNonPrimitiveHuman(false)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//FILE: lombok.config
|
||||||
|
lombok.accessors.prefix += f
|
||||||
|
lombok.accessors.prefix+=field
|
||||||
+5
@@ -36,6 +36,11 @@ public class LombokCompileTestGenerated extends AbstractLombokCompileTest {
|
|||||||
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/accessorsStripPrefix.kt");
|
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/accessorsStripPrefix.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("accessorsStripPrefixConfig.kt")
|
||||||
|
public void testAccessorsStripPrefixConfig() throws Exception {
|
||||||
|
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/accessorsStripPrefixConfig.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("allArgsConstructor.kt")
|
@TestMetadata("allArgsConstructor.kt")
|
||||||
public void testAllArgsConstructor() throws Exception {
|
public void testAllArgsConstructor() throws Exception {
|
||||||
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructor.kt");
|
runTest("plugins/lombok/lombok-compiler-plugin/testData/compile/allArgsConstructor.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user