summaryrefslogtreecommitdiff
path: root/compiler/src/main/java/android/databinding
diff options
context:
space:
mode:
authorGeorge Mount <mount@google.com>2015-08-05 16:25:15 -0700
committerGeorge Mount <mount@google.com>2015-08-05 17:21:21 -0700
commit91beb3a1a89a58b1c0b6b874d889394a3be90b6c (patch)
tree58d990c20b06ee509d83cf9b3d99ee4d678643e1 /compiler/src/main/java/android/databinding
parent793e979f25e190162eacf46d6a4efc3efc1d2f91 (diff)
downloaddata-binding-91beb3a1a89a58b1c0b6b874d889394a3be90b6c.tar.gz
Fix ternary operator with null assigned to listener.
Bug 22907244 When finding a common type, null is an Object and the listener is an interface, so the types don't match. Change-Id: I0c5a88ec02230767b894b2feda17a1a1c8cef9f7
Diffstat (limited to 'compiler/src/main/java/android/databinding')
-rw-r--r--compiler/src/main/java/android/databinding/tool/expr/TernaryExpr.java13
-rw-r--r--compiler/src/main/java/android/databinding/tool/reflection/ModelAnalyzer.java6
2 files changed, 19 insertions, 0 deletions
diff --git a/compiler/src/main/java/android/databinding/tool/expr/TernaryExpr.java b/compiler/src/main/java/android/databinding/tool/expr/TernaryExpr.java
index f8f61123..a1a4432a 100644
--- a/compiler/src/main/java/android/databinding/tool/expr/TernaryExpr.java
+++ b/compiler/src/main/java/android/databinding/tool/expr/TernaryExpr.java
@@ -48,10 +48,23 @@ public class TernaryExpr extends Expr {
@Override
protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) {
+ final Expr ifTrue = getIfTrue();
+ final Expr ifFalse = getIfFalse();
+ if (isNullLiteral(ifTrue)) {
+ return ifFalse.getResolvedType();
+ } else if (isNullLiteral(ifFalse)) {
+ return ifTrue.getResolvedType();
+ }
return modelAnalyzer.findCommonParentOf(getIfTrue().getResolvedType(),
getIfFalse().getResolvedType());
}
+ private static boolean isNullLiteral(Expr expr) {
+ final ModelClass type = expr.getResolvedType();
+ return (type.isObject() && (expr instanceof SymbolExpr) &&
+ "null".equals(((SymbolExpr)expr).getText()));
+ }
+
@Override
protected List<Dependency> constructDependencies() {
List<Dependency> deps = new ArrayList<>();
diff --git a/compiler/src/main/java/android/databinding/tool/reflection/ModelAnalyzer.java b/compiler/src/main/java/android/databinding/tool/reflection/ModelAnalyzer.java
index 739c9e0b..b1de46e4 100644
--- a/compiler/src/main/java/android/databinding/tool/reflection/ModelAnalyzer.java
+++ b/compiler/src/main/java/android/databinding/tool/reflection/ModelAnalyzer.java
@@ -94,6 +94,12 @@ public abstract class ModelAnalyzer {
curr = curr.getSuperclass();
}
if (curr == null) {
+ if (modelClass1.isObject() && modelClass2.isInterface()) {
+ return modelClass1;
+ } else if (modelClass2.isObject() && modelClass1.isInterface()) {
+ return modelClass2;
+ }
+
ModelClass primitive1 = modelClass1.unbox();
ModelClass primitive2 = modelClass2.unbox();
if (!modelClass1.equals(primitive1) || !modelClass2.equals(primitive2)) {