summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorYigit Boyar <yboyar@google.com>2019-10-07 17:13:54 -0700
committerYigit Boyar <yboyar@google.com>2019-10-10 21:51:58 -0700
commitb0dd90109e7bb47af5191aad9c211c6bd89f8448 (patch)
tree97b1dd28dbbb58f1ddbea03e571ae56c29738d5c /compiler
parent103e4e323372565802ecb09ee689b77f43acc92e (diff)
downloaddata-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.java6
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/LayoutBinderWriter.kt14
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