summaryrefslogtreecommitdiff
path: root/compiler/src/main/java/android/databinding/tool/expr/MethodCallExpr.java
diff options
context:
space:
mode:
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.java56
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();
+ }
}