fix: like "a=some", "a_b=some" style's property key name will fail on build

This commit is contained in:
2023-11-04 01:21:32 +08:00
parent d2aed2120e
commit d9c8c5dc84

View File

@@ -85,6 +85,9 @@ internal class PropertiesAccessorsGenerator {
/** 生成的属性键值连续名称重复次数数组 */ /** 生成的属性键值连续名称重复次数数组 */
private val grandSuccessiveDuplicateIndexs = mutableMapOf<String, Int>() private val grandSuccessiveDuplicateIndexs = mutableMapOf<String, Int>()
/** 生成的属性键值不重复调用方法数组 */
private val usedSuccessiveMethods = mutableMapOf<String, MutableList<String>>()
/** 生成的属性键值不重复 TAG 数组 */ /** 生成的属性键值不重复 TAG 数组 */
private val usedSuccessiveTags = mutableSetOf<String>() private val usedSuccessiveTags = mutableSetOf<String>()
@@ -178,7 +181,7 @@ internal class PropertiesAccessorsGenerator {
*/ */
private fun TypeSpec.Builder.addSuccessiveMethod(accessorsName: String, methodName: String, className: String) = private fun TypeSpec.Builder.addSuccessiveMethod(accessorsName: String, methodName: String, className: String) =
addMethod( addMethod(
MethodSpec.methodBuilder("get${methodName.capitalize()}") MethodSpec.methodBuilder("get${getOrCreateUsedSuccessiveMethodName(methodName, className).capitalize()}")
.addJavadoc("Resolve the \"$accessorsName\" accessors") .addJavadoc("Resolve the \"$accessorsName\" accessors")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL) .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addAnnotation(Nonnull::class.java) .addAnnotation(Nonnull::class.java)
@@ -191,12 +194,13 @@ internal class PropertiesAccessorsGenerator {
* 向通用构建器描述类添加最终键值方法 * 向通用构建器描述类添加最终键值方法
* @param accessorsName 接续名 * @param accessorsName 接续名
* @param methodName 方法名 * @param methodName 方法名
* @param className 类名
* @param value 键值内容 * @param value 键值内容
* @return [TypeSpec.Builder] * @return [TypeSpec.Builder]
*/ */
private fun TypeSpec.Builder.addFinalValueMethod(accessorsName: String, methodName: String, value: Any) = private fun TypeSpec.Builder.addFinalValueMethod(accessorsName: String, methodName: String, className: String, value: Any) =
addMethod( addMethod(
MethodSpec.methodBuilder("get${methodName.capitalize()}").apply { MethodSpec.methodBuilder("get${getOrCreateUsedSuccessiveMethodName(methodName, className).capitalize()}").apply {
val typedValue = value.parseTypedValue(configs.isEnableTypeAutoConversion) val typedValue = value.parseTypedValue(configs.isEnableTypeAutoConversion)
addJavadoc("Resolve the \"$accessorsName\" value ${typedValue.second}") addJavadoc("Resolve the \"$accessorsName\" value ${typedValue.second}")
addModifiers(Modifier.PUBLIC, Modifier.FINAL) addModifiers(Modifier.PUBLIC, Modifier.FINAL)
@@ -214,6 +218,20 @@ internal class PropertiesAccessorsGenerator {
private fun MethodSpec.Builder.addSuccessiveStatement(className: String) = private fun MethodSpec.Builder.addSuccessiveStatement(className: String) =
addStatement("${className.uncapitalized()} = new ${className.capitalized()}()") addStatement("${className.uncapitalized()} = new ${className.capitalized()}()")
/**
* 获取不重复调用方法名称
* @param methodName 方法名
* @param className 类名
* @return [String]
*/
private fun getOrCreateUsedSuccessiveMethodName(methodName: String, className: String): String {
if (usedSuccessiveMethods[className] == null) usedSuccessiveMethods[className] = mutableListOf()
val methods = usedSuccessiveMethods[className]!!
val finalName = if (methods.contains(methodName)) "$methodName${methods.filter { it == methodName }.size + 1}" else methodName
methods.add(methodName)
return finalName
}
/** /**
* 获取、创建通用构建器描述类 * 获取、创建通用构建器描述类
* @param name 名称 * @param name 名称
@@ -282,9 +300,10 @@ internal class PropertiesAccessorsGenerator {
val nextAccessorsName = nextItem?.first ?: "" val nextAccessorsName = nextItem?.first ?: ""
val nextClassName = nextItem?.second ?: "" val nextClassName = nextItem?.second ?: ""
val nextMethodName = nextItem?.third ?: "" val nextMethodName = nextItem?.third ?: ""
val lastClassName = lastItem?.second ?: ""
val lastMethodName = lastItem?.third ?: "" val lastMethodName = lastItem?.third ?: ""
val isPreLastIndex = index == successiveNames.lastIndex - 1 val isPreLastIndex = index == successiveNames.lastIndex - 1
if (successiveNames.size == 1) getOrCreateClassSpec(TOP_SUCCESSIVE_NAME).addFinalValueMethod(successiveName, methodName, value) if (successiveNames.size == 1) getOrCreateClassSpec(TOP_SUCCESSIVE_NAME).addFinalValueMethod(successiveName, methodName, className, value)
if (index == successiveNames.lastIndex) return@forEachIndexed if (index == successiveNames.lastIndex) return@forEachIndexed
if (index == 0) noRepeated(TOP_SUCCESSIVE_NAME, methodName, className) { if (index == 0) noRepeated(TOP_SUCCESSIVE_NAME, methodName, className) {
getOrCreateClassSpec(TOP_SUCCESSIVE_NAME, accessorsName) getOrCreateClassSpec(TOP_SUCCESSIVE_NAME, accessorsName)
@@ -297,7 +316,7 @@ internal class PropertiesAccessorsGenerator {
if (isPreLastIndex.not()) { if (isPreLastIndex.not()) {
addSuccessiveField(nextAccessorsName, nextClassName) addSuccessiveField(nextAccessorsName, nextClassName)
addSuccessiveMethod(nextAccessorsName, nextMethodName, nextClassName) addSuccessiveMethod(nextAccessorsName, nextMethodName, nextClassName)
} else addFinalValueMethod(successiveName, lastMethodName, value) } else addFinalValueMethod(successiveName, lastMethodName, lastClassName, value)
} }
if (isPreLastIndex.not()) preAddConstructorSpecNames.add(className to nextClassName) if (isPreLastIndex.not()) preAddConstructorSpecNames.add(className to nextClassName)
} }
@@ -345,6 +364,7 @@ internal class PropertiesAccessorsGenerator {
preAddConstructorSpecNames.clear() preAddConstructorSpecNames.clear()
grandSuccessiveNames.clear() grandSuccessiveNames.clear()
grandSuccessiveDuplicateIndexs.clear() grandSuccessiveDuplicateIndexs.clear()
usedSuccessiveMethods.clear()
usedSuccessiveTags.clear() usedSuccessiveTags.clear()
if (isClearAll) memoryExtensionClasses.clear() if (isClearAll) memoryExtensionClasses.clear()
} }