diff options
author | George Mount <mount@google.com> | 2015-10-05 17:10:10 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-10-05 17:10:10 +0000 |
commit | 219d16f518d161d9fcc1f0eca950863105990568 (patch) | |
tree | 4c1ffadf50c2177a495356227a65f9ae67ac7ba8 /compiler | |
parent | 74c69a5dfad22472ceace07480e564610dc481e0 (diff) | |
parent | 975c05c00dae9193a636c4775df81d8665fc6749 (diff) | |
download | data-binding-219d16f518d161d9fcc1f0eca950863105990568.tar.gz |
Merge "Fix resolving listeners for multi-attribute binding adapters." into studio-master-dev
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) { |