From c2afbe53da09f2e2a0c0b0d494180050db82f73d Mon Sep 17 00:00:00 2001 From: johnsonlee Date: Sat, 8 May 2021 16:35:17 +0800 Subject: [PATCH] fix issue #226 --- .../com/didiglobal/booster/kotlinx/text.kt | 5 +++ .../didiglobal/booster/kotlinx/TextTest.kt | 32 +++++++++++++++++++ .../r/inline/RetainedSymbolCollector.kt | 20 ++++++++++-- .../booster/transform/r/inline/RegexTest.kt | 9 +++++- 4 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 booster-kotlinx/src/test/kotlin/com/didiglobal/booster/kotlinx/TextTest.kt diff --git a/booster-kotlinx/src/main/kotlin/com/didiglobal/booster/kotlinx/text.kt b/booster-kotlinx/src/main/kotlin/com/didiglobal/booster/kotlinx/text.kt index a276f6fa0..4d004cd39 100644 --- a/booster-kotlinx/src/main/kotlin/com/didiglobal/booster/kotlinx/text.kt +++ b/booster-kotlinx/src/main/kotlin/com/didiglobal/booster/kotlinx/text.kt @@ -3,6 +3,9 @@ package com.didiglobal.booster.kotlinx import java.io.File import java.math.BigInteger import java.security.MessageDigest +import java.util.regex.Pattern + +private val PATTERN_JAVA_IDENTIFIER = Pattern.compile("[a-zA-Z_\$][a-zA-Z\\d_\$]*") fun String.separatorsToUnix(): String { return if ('/' == File.separatorChar) this else this.replace(File.separatorChar, '/') @@ -19,3 +22,5 @@ fun String.md5(): String { fun String.matches(wildcard: Wildcard): Boolean { return wildcard.matches(this) } + +fun String.isValidJavaIdentifier(): Boolean = PATTERN_JAVA_IDENTIFIER.matcher(this).matches() diff --git a/booster-kotlinx/src/test/kotlin/com/didiglobal/booster/kotlinx/TextTest.kt b/booster-kotlinx/src/test/kotlin/com/didiglobal/booster/kotlinx/TextTest.kt new file mode 100644 index 000000000..e8c8576e8 --- /dev/null +++ b/booster-kotlinx/src/test/kotlin/com/didiglobal/booster/kotlinx/TextTest.kt @@ -0,0 +1,32 @@ +package com.didiglobal.booster.kotlinx + +import kotlin.test.Test +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +/** + * Unit test for String extension + * + * @author johnsonlee + */ +class TextTest { + + @Test + fun `test java identifier validation`() { + assertFalse("".isValidJavaIdentifier()) + assertFalse("1".isValidJavaIdentifier()) + assertFalse(".".isValidJavaIdentifier()) + assertTrue("_".isValidJavaIdentifier()) + assertTrue("$".isValidJavaIdentifier()) + assertFalse("1a".isValidJavaIdentifier()) + assertFalse(".a".isValidJavaIdentifier()) + assertTrue("_a".isValidJavaIdentifier()) + assertTrue("\$a".isValidJavaIdentifier()) + assertTrue("ab".isValidJavaIdentifier()) + assertTrue("ab1".isValidJavaIdentifier()) + assertTrue("ab$".isValidJavaIdentifier()) + assertTrue("ab_".isValidJavaIdentifier()) + assertFalse("ab.".isValidJavaIdentifier()) + } + +} diff --git a/booster-transform-r-inline/src/main/kotlin/com/didiglobal/booster/transform/r/inline/RetainedSymbolCollector.kt b/booster-transform-r-inline/src/main/kotlin/com/didiglobal/booster/transform/r/inline/RetainedSymbolCollector.kt index 022229d86..59d2c00fb 100644 --- a/booster-transform-r-inline/src/main/kotlin/com/didiglobal/booster/transform/r/inline/RetainedSymbolCollector.kt +++ b/booster-transform-r-inline/src/main/kotlin/com/didiglobal/booster/transform/r/inline/RetainedSymbolCollector.kt @@ -5,6 +5,7 @@ import com.didiglobal.booster.aapt2.MAGIC import com.didiglobal.booster.aapt2.RES_FILE import com.didiglobal.booster.aapt2.Resources import com.didiglobal.booster.aapt2.ResourcesInternal +import com.didiglobal.booster.kotlinx.isValidJavaIdentifier import com.didiglobal.booster.kotlinx.stackTraceAsString import org.gradle.api.logging.Logging import java.io.File @@ -112,10 +113,21 @@ internal fun Resources.XmlNode.findAllRetainedSymbols(): Collection { }.attributeList?.forEach { attr -> when (attr.name) { "constraint_referenced_ids" -> addAll(attr.value.split(PATTERN_COMMA)) + "layout_constraintHorizontal_bias", + "layout_constraintVertical_bias", + "layout_constraintCircleRadius", + "layout_constraintCircleAngle", + "layout_constraintDimensionRatio", + "layout_constraintWidth_default", + "layout_constraintHeight_default", + "layout_constraintWidth_percent", + "layout_constraintHeight_percent", + "layout_constraintHorizontal_chainStyle", + "layout_constraintVertical_chainStyle", + "layout_constraintHorizontal_weight", + "layout_constraintVertical_weight" -> Unit // just ignore else -> if (attr.name.startsWith("layout_constraint")) { - addAll(attr.value.split(PATTERN_COMMA).filter { - it != "parent" - }.map { + addAll(attr.value.split(PATTERN_COMMA).filter(::isValidSymbol).map { it.substringAfter('/') }) } @@ -125,6 +137,8 @@ internal fun Resources.XmlNode.findAllRetainedSymbols(): Collection { } } +internal fun isValidSymbol(token: String) = token.isNotEmpty() && "parent" != token && token.isValidJavaIdentifier() + private val logger = Logging.getLogger(RetainedSymbolCollector::class.java) private val PATTERN_COMMA = Pattern.compile("\\s*,\\s*") diff --git a/booster-transform-r-inline/src/test/kotlin/com/didiglobal/booster/transform/r/inline/RegexTest.kt b/booster-transform-r-inline/src/test/kotlin/com/didiglobal/booster/transform/r/inline/RegexTest.kt index 07908a5d5..e73f70318 100644 --- a/booster-transform-r-inline/src/test/kotlin/com/didiglobal/booster/transform/r/inline/RegexTest.kt +++ b/booster-transform-r-inline/src/test/kotlin/com/didiglobal/booster/transform/r/inline/RegexTest.kt @@ -1,6 +1,5 @@ package com.didiglobal.booster.transform.r.inline -import java.io.File import java.util.regex.Pattern import kotlin.test.Test import kotlin.test.assertFalse @@ -23,4 +22,12 @@ class RegexTest { } } + @Test + fun `valid symbol`() { + assertTrue(isValidSymbol("H")) + assertTrue(isValidSymbol("icon")) + assertTrue(isValidSymbol("ic_app")) + assertFalse(isValidSymbol("4:1")) + } + }