diff options
Diffstat (limited to 'compiler/src/main/java/android/databinding/tool/expr/MethodCallExpr.java')
-rw-r--r-- | compiler/src/main/java/android/databinding/tool/expr/MethodCallExpr.java | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/compiler/src/main/java/android/databinding/tool/expr/MethodCallExpr.java b/compiler/src/main/java/android/databinding/tool/expr/MethodCallExpr.java index 71822fb5..6acbfa2e 100644 --- a/compiler/src/main/java/android/databinding/tool/expr/MethodCallExpr.java +++ b/compiler/src/main/java/android/databinding/tool/expr/MethodCallExpr.java @@ -36,8 +36,9 @@ import static android.databinding.tool.reflection.Callable.STATIC; public class MethodCallExpr extends Expr { final String mName; - Callable mGetter; + // Allow protected calls -- only used for ViewDataBinding methods. + private boolean mAllowProtected; static List<Expr> concat(Expr e, List<Expr> list) { List<Expr> merged = new ArrayList<Expr>(); @@ -64,18 +65,24 @@ public class MethodCallExpr extends Expr { } @Override - protected KCode generateCode(boolean expand) { + protected KCode generateCode() { KCode code = new KCode() - .app("", getTarget().toCode(expand)) + .app("", getTarget().toCode()) .app(".") .app(getGetter().name) .app("("); - appendArgs(code, expand); + appendArgs(code); code.app(")"); return code; } - private void appendArgs(KCode code, boolean expand) { + @Override + public Expr cloneToModel(ExprModel model) { + return model.methodCall(getTarget().cloneToModel(model), mName, + cloneToModel(model, getArgs())); + } + + private void appendArgs(KCode code) { boolean first = true; for (Expr arg : getArgs()) { if (first) { @@ -83,7 +90,7 @@ public class MethodCallExpr extends Expr { } else { code.app(", "); } - code.app("", arg.toCode(expand)); + code.app("", arg.toCode()); } } @@ -122,12 +129,20 @@ public class MethodCallExpr extends Expr { Expr target = getTarget(); boolean isStatic = target instanceof StaticIdentifierExpr; - ModelMethod method = target.getResolvedType().getMethod(mName, args, isStatic); + ModelMethod method = target.getResolvedType().getMethod(mName, args, isStatic, + mAllowProtected); if (method == null) { - String message = "cannot find method '" + mName + "' in class " + + StringBuilder argTypes = new StringBuilder(); + for (ModelClass arg : args) { + if (argTypes.length() != 0) { + argTypes.append(", "); + } + argTypes.append(arg.toJavaCode()); + } + String message = "cannot find method '" + mName + "(" + argTypes + ")' in class " + target.getResolvedType().toJavaCode(); IllegalArgumentException e = new IllegalArgumentException(message); - L.e(e, "cannot find method %s in class %s", mName, + L.e(e, "cannot find method %s(%s) in class %s", mName, argTypes, target.getResolvedType().toJavaCode()); throw e; } @@ -185,8 +200,31 @@ public class MethodCallExpr extends Expr { return mGetter; } + public void setAllowProtected() { + mAllowProtected = true; + } + @Override public String getInvertibleError() { return "Method calls may not be used in two-way expressions"; } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(getTarget()) + .append('.') + .append(mName) + .append('('); + final List<Expr> args = getArgs(); + for (int i = 0; i < args.size(); i++) { + Expr arg = args.get(i); + if (i != 0) { + buf.append(", "); + } + buf.append(arg); + } + buf.append(')'); + return buf.toString(); + } } |