diff options
author | George Mount <mount@google.com> | 2015-09-30 13:23:48 -0700 |
---|---|---|
committer | George Mount <mount@google.com> | 2015-09-30 13:58:52 -0700 |
commit | 975c05c00dae9193a636c4775df81d8665fc6749 (patch) | |
tree | bb532733cdb01554a7b03b4d0de513d0db275502 /compiler | |
parent | a128d1c99ea98bb48c45d648906652e3d618d513 (diff) | |
download | data-binding-975c05c00dae9193a636c4775df81d8665fc6749.tar.gz |
Fix resolving listeners for multi-attribute binding adapters.
Bug 24538724
Change-Id: I39a72fd701abf9d2368d2a0a7fc5a4c1ac63c0a0
Diffstat (limited to 'compiler')
4 files changed, 29 insertions, 7 deletions
diff --git a/compiler/src/main/java/android/databinding/tool/Binding.java b/compiler/src/main/java/android/databinding/tool/Binding.java index 57f6489e..c2bee938 100644 --- a/compiler/src/main/java/android/databinding/tool/Binding.java +++ b/compiler/src/main/java/android/databinding/tool/Binding.java @@ -33,19 +33,13 @@ import java.util.List; public class Binding implements LocationScopeProvider { private final String mName; - private final Expr mExpr; + private Expr mExpr; private final BindingTarget mTarget; private SetterStore.SetterCall mSetterCall; public Binding(BindingTarget target, String name, Expr expr) { mTarget = target; mName = name; - final ModelClass listenerParameter = getListenerParameter(target, name, expr); - Expr listenerExpr = expr.resolveListeners(listenerParameter, null); - if (listenerExpr != expr) { - listenerExpr.setBindingExpression(true); - expr = listenerExpr; - } mExpr = expr; } @@ -54,6 +48,15 @@ public class Binding implements LocationScopeProvider { return mExpr.getLocations(); } + public void resolveListeners() { + final ModelClass listenerParameter = getListenerParameter(mTarget, mName, mExpr); + Expr listenerExpr = mExpr.resolveListeners(listenerParameter, null); + if (listenerExpr != mExpr) { + listenerExpr.setBindingExpression(true); + mExpr = listenerExpr; + } + } + private SetterStore.BindingSetterCall getSetterCall() { if (mSetterCall == null) { try { diff --git a/compiler/src/main/java/android/databinding/tool/BindingTarget.java b/compiler/src/main/java/android/databinding/tool/BindingTarget.java index 5c3fac5e..9a05d8d2 100644 --- a/compiler/src/main/java/android/databinding/tool/BindingTarget.java +++ b/compiler/src/main/java/android/databinding/tool/BindingTarget.java @@ -114,6 +114,12 @@ public class BindingTarget implements LocationScopeProvider { mModel = model; } + public void resolveListeners() { + for (Binding binding : mBindings) { + binding.resolveListeners(); + } + } + /** * Called after BindingTarget is finalized. * <p> diff --git a/compiler/src/main/java/android/databinding/tool/LayoutBinder.java b/compiler/src/main/java/android/databinding/tool/LayoutBinder.java index fc31affc..1871577b 100644 --- a/compiler/src/main/java/android/databinding/tool/LayoutBinder.java +++ b/compiler/src/main/java/android/databinding/tool/LayoutBinder.java @@ -203,6 +203,7 @@ public class LayoutBinder implements FileScopeProvider { parse(bindingBundle.getExpr(), bindingBundle.getValueLocation())); } bindingTarget.resolveMultiSetters(); + bindingTarget.resolveListeners(); } finally { Scope.exit(); } diff --git a/compiler/src/main/java/android/databinding/tool/MergedBinding.java b/compiler/src/main/java/android/databinding/tool/MergedBinding.java index 195e8280..53278752 100644 --- a/compiler/src/main/java/android/databinding/tool/MergedBinding.java +++ b/compiler/src/main/java/android/databinding/tool/MergedBinding.java @@ -19,6 +19,7 @@ package android.databinding.tool; import android.databinding.tool.expr.ArgListExpr; import android.databinding.tool.expr.Expr; import android.databinding.tool.expr.ExprModel; +import android.databinding.tool.reflection.ModelClass; import android.databinding.tool.store.SetterStore; import android.databinding.tool.util.L; import android.databinding.tool.writer.WriterPackage; @@ -40,6 +41,17 @@ public class MergedBinding extends Binding { mMultiAttributeSetter = multiAttributeSetter; } + @Override + public void resolveListeners() { + ModelClass[] parameters = mMultiAttributeSetter.getParameterTypes(); + List<Expr> children = getExpr().getChildren(); + final Expr expr = getExpr(); + for (int i = 0; i < children.size(); i++) { + final Expr child = children.get(i); + child.resolveListeners(parameters[i], expr); + } + } + private static Expr createArgListExpr(ExprModel model, final Iterable<Binding> bindings) { List<Expr> args = new ArrayList<>(); for (Binding binding : bindings) { |