diff options
author | Yigit Boyar <yboyar@google.com> | 2019-10-07 17:13:54 -0700 |
---|---|---|
committer | Yigit Boyar <yboyar@google.com> | 2019-10-10 21:51:58 -0700 |
commit | b0dd90109e7bb47af5191aad9c211c6bd89f8448 (patch) | |
tree | 97b1dd28dbbb58f1ddbea03e571ae56c29738d5c /compiler | |
parent | 103e4e323372565802ecb09ee689b77f43acc92e (diff) | |
download | data-binding-b0dd90109e7bb47af5191aad9c211c6bd89f8448.tar.gz |
Ensure all strings are capitalized w/ US locale
This CL fixes a bug in data binding where in some places,
capitalization did not specify a locale, which created
problems on windows machines that are set to Turkish since
turkish i is still an i when capiltalized (not an I).
Surprisingly, it works fine on linux machines while fails
to compile on windows machines but i was able to create a
test case which broke data bindng when two way binding is used.
This CL is a bit risky if some turkish user depended on this
behavior on a linux machine and accessed those fields in
their code but i think it is better to fix this way since that
is what kotlin does as well.
https://github.com/JetBrains/kotlin/blob/64e85e8a0c7b0c0392296bcd8b3dd9335bbf1ef4/core/descriptors/src/org/jetbrains/kotlin/name/NameUtils.kt
Bug: 141925966
Bug: 118943890
Test: NonEnglishLocaleTest in compilation tests
Change-Id: If879c52639530431a0710537136fc934f421b489
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/src/main/java/android/databinding/tool/expr/ResourceExpr.java | 6 | ||||
-rw-r--r-- | compiler/src/main/kotlin/android/databinding/tool/writer/LayoutBinderWriter.kt | 14 |
2 files changed, 11 insertions, 9 deletions
diff --git a/compiler/src/main/java/android/databinding/tool/expr/ResourceExpr.java b/compiler/src/main/java/android/databinding/tool/expr/ResourceExpr.java index ce32889c..ad74e517 100644 --- a/compiler/src/main/java/android/databinding/tool/expr/ResourceExpr.java +++ b/compiler/src/main/java/android/databinding/tool/expr/ResourceExpr.java @@ -25,7 +25,8 @@ import android.databinding.tool.writer.LayoutBinderWriterKt; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; + +import static android.databinding.tool.ext.ExtKt.capitalizeUS; public class ResourceExpr extends Expr { @@ -204,8 +205,7 @@ public class ResourceExpr extends Expr { if ("transition".equals(mResourceType)) return "android.transition.TransitionInflater.from(" + context + ").inflateTransition(" + resourceName + ")"; if ("text".equals(mResourceType)) return resources + ".getText(" + resourceName + ")"; if ("typedArray".equals(mResourceType)) return resources + ".obtainTypedArray(" + resourceName + ")"; - final String property = Character.toUpperCase(mResourceType.charAt(0)) + - mResourceType.substring(1); + final String property = capitalizeUS(mResourceType); return resources + ".get" + property + "(" + resourceName + ")"; } diff --git a/compiler/src/main/kotlin/android/databinding/tool/writer/LayoutBinderWriter.kt b/compiler/src/main/kotlin/android/databinding/tool/writer/LayoutBinderWriter.kt index 00e2bfad..64146c40 100644 --- a/compiler/src/main/kotlin/android/databinding/tool/writer/LayoutBinderWriter.kt +++ b/compiler/src/main/kotlin/android/databinding/tool/writer/LayoutBinderWriter.kt @@ -31,6 +31,8 @@ import android.databinding.tool.expr.localizeGlobalVariables import android.databinding.tool.expr.shouldLocalizeInCallbacks import android.databinding.tool.expr.toCode import android.databinding.tool.ext.br +import android.databinding.tool.ext.capitalizeUS +import android.databinding.tool.ext.decapitalizeUS import android.databinding.tool.ext.lazyProp import android.databinding.tool.ext.parseXmlResourceReference import android.databinding.tool.ext.stripNonJava @@ -91,7 +93,7 @@ class ExprModelExt { var candidateBase = base var candidate = candidateBase if (scope == Scope.CALLBACK || scope == Scope.EXECUTE_PENDING_METHOD) { - candidate = candidate.decapitalize() + candidate = candidate.decapitalizeUS() } val checkFields = scope != Scope.METHOD var i = 0 @@ -178,7 +180,7 @@ val Expr.readableName by lazyProp { expr: Expr -> } val Expr.fieldName by lazyProp { expr: Expr -> - expr.model.getUniqueFieldName("m${expr.readableName.capitalize()}", false) + expr.model.getUniqueFieldName("m${expr.readableName.capitalizeUS()}", false) } val InverseBinding.fieldName by lazyProp { inverseBinding: InverseBinding -> @@ -192,7 +194,7 @@ val Expr.listenerClassName by lazyProp { expr: Expr -> } val Expr.oldValueName by lazyProp { expr: Expr -> - expr.model.getUniqueFieldName("mOld${expr.readableName.capitalize()}", false) + expr.model.getUniqueFieldName("mOld${expr.readableName.capitalizeUS()}", false) } fun Expr.scopedName() : String = when(Scope.currentScope) { @@ -211,15 +213,15 @@ val Expr.executePendingLocalName by lazyProp { expr: Expr -> } val Expr.setterName by lazyProp { expr: Expr -> - expr.model.getUniqueMethodName("set${expr.readableName.capitalize()}", true) + expr.model.getUniqueMethodName("set${expr.readableName.capitalizeUS()}", true) } val Expr.onChangeName by lazyProp { expr: Expr -> - expr.model.getUniqueMethodName("onChange${expr.readableName.capitalize()}", false) + expr.model.getUniqueMethodName("onChange${expr.readableName.capitalizeUS()}", false) } val Expr.getterName by lazyProp { expr: Expr -> - expr.model.getUniqueMethodName("get${expr.readableName.capitalize()}", true) + expr.model.getUniqueMethodName("get${expr.readableName.capitalizeUS()}", true) } fun Expr.isVariable() = this is IdentifierExpr && this.isDynamic |