diff options
Diffstat (limited to 'compiler/src/main/java/android/databinding/tool')
6 files changed, 54 insertions, 21 deletions
diff --git a/compiler/src/main/java/android/databinding/tool/CompilerChef.java b/compiler/src/main/java/android/databinding/tool/CompilerChef.java index 611f3b8f..c167207a 100644 --- a/compiler/src/main/java/android/databinding/tool/CompilerChef.java +++ b/compiler/src/main/java/android/databinding/tool/CompilerChef.java @@ -135,6 +135,11 @@ public class CompilerChef { "java.lang.Object"); injectedClass.addMethod(new InjectedMethod(injectedClass, true, "getColorFromResource", "int", "android.view.View", "int")); + injectedClass.addMethod(new InjectedMethod(injectedClass, true, + "getColorStateListFromResource", "android.content.res.ColorStateList", + "android.view.View", "int")); + injectedClass.addMethod(new InjectedMethod(injectedClass, true, "getDrawableFromResource", + "android.graphics.drawable.Drawable", "android.view.View", "int")); injectedClass.addMethod(new InjectedMethod(injectedClass, true, "parse", "boolean", "java.lang.String", "boolean")); injectedClass.addMethod(new InjectedMethod(injectedClass, true, "parse", diff --git a/compiler/src/main/java/android/databinding/tool/ExpressionParser.java b/compiler/src/main/java/android/databinding/tool/ExpressionParser.java index 8deebc4d..18fb8399 100644 --- a/compiler/src/main/java/android/databinding/tool/ExpressionParser.java +++ b/compiler/src/main/java/android/databinding/tool/ExpressionParser.java @@ -50,11 +50,12 @@ public class ExpressionParser { visitor = new ExpressionVisitor(mModel); } - public Expr parse(String input, @Nullable Location locationInFile) { + public Expr parse(String input, @Nullable Location locationInFile, BindingTarget target) { ANTLRInputStream inputStream = new ANTLRInputStream(input); BindingExpressionLexer lexer = new BindingExpressionLexer(inputStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); final BindingExpressionParser parser = new BindingExpressionParser(tokenStream); + visitor.setBindingTarget(target); parser.addErrorListener(new BaseErrorListener() { @Override public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, diff --git a/compiler/src/main/java/android/databinding/tool/ExpressionVisitor.java b/compiler/src/main/java/android/databinding/tool/ExpressionVisitor.java index 87426c0f..d273f387 100644 --- a/compiler/src/main/java/android/databinding/tool/ExpressionVisitor.java +++ b/compiler/src/main/java/android/databinding/tool/ExpressionVisitor.java @@ -47,6 +47,7 @@ class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { private ExprModel mModel; private ParseTreeListener mParseTreeListener; private ArrayDeque<ExprModel> mModelStack = new ArrayDeque<ExprModel>(); + private BindingTarget mTarget; ExpressionVisitor(ExprModel model) { mModel = model; @@ -56,6 +57,10 @@ class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { mParseTreeListener = parseTreeListener; } + public void setBindingTarget(BindingTarget bindingTarget) { + mTarget = bindingTarget; + } + private void onEnter(ParserRuleContext context) { if (mParseTreeListener != null) { mParseTreeListener.enterEveryRule(context); @@ -398,7 +403,7 @@ class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { final int startIndex = Math.max(1, colonIndex + 1); final String resourceType = resourceReference.substring(startIndex, slashIndex).trim(); final String resourceName = resourceReference.substring(slashIndex + 1).trim(); - return mModel.resourceExpr(packageName, resourceType, resourceName, args); + return mModel.resourceExpr(mTarget, packageName, resourceType, resourceName, args); } finally { onExit(ctx); } diff --git a/compiler/src/main/java/android/databinding/tool/LayoutBinder.java b/compiler/src/main/java/android/databinding/tool/LayoutBinder.java index c7704682..bcbafda6 100644 --- a/compiler/src/main/java/android/databinding/tool/LayoutBinder.java +++ b/compiler/src/main/java/android/databinding/tool/LayoutBinder.java @@ -222,7 +222,8 @@ public class LayoutBinder implements FileScopeProvider { try { Scope.enter(bindingBundle.getValueLocation()); Expr expr = parse(bindingBundle.getExpr(), - bindingBundle.getValueLocation()); + bindingBundle.getValueLocation(), + bindingTarget); bindingTarget.addBinding(bindingBundle.getName(), expr); if (bindingBundle.isTwoWay()) { bindingTarget.addInverseBinding(bindingBundle.getName(), expr, @@ -295,8 +296,8 @@ public class LayoutBinder implements FileScopeProvider { return target; } - public Expr parse(String input, @Nullable Location locationInFile) { - final Expr parsed = mExpressionParser.parse(input, locationInFile); + public Expr parse(String input, @Nullable Location locationInFile, BindingTarget target) { + final Expr parsed = mExpressionParser.parse(input, locationInFile, target); parsed.setBindingExpression(true); return parsed; } diff --git a/compiler/src/main/java/android/databinding/tool/expr/ExprModel.java b/compiler/src/main/java/android/databinding/tool/expr/ExprModel.java index 87169cee..34b25690 100644 --- a/compiler/src/main/java/android/databinding/tool/expr/ExprModel.java +++ b/compiler/src/main/java/android/databinding/tool/expr/ExprModel.java @@ -273,9 +273,9 @@ public class ExprModel { return register(new UnaryExpr(op, expr)); } - public Expr resourceExpr(String packageName, String resourceType, String resourceName, - List<Expr> args) { - return register(new ResourceExpr(packageName, resourceType, resourceName, args)); + public Expr resourceExpr(BindingTarget target, String packageName, String resourceType, + String resourceName, List<Expr> args) { + return register(new ResourceExpr(target, packageName, resourceType, resourceName, args)); } public Expr bracketExpr(Expr variableExpr, Expr argExpr) { diff --git a/compiler/src/main/java/android/databinding/tool/expr/ResourceExpr.java b/compiler/src/main/java/android/databinding/tool/expr/ResourceExpr.java index 2ecf5fb0..df36cf63 100644 --- a/compiler/src/main/java/android/databinding/tool/expr/ResourceExpr.java +++ b/compiler/src/main/java/android/databinding/tool/expr/ResourceExpr.java @@ -15,9 +15,11 @@ */ package android.databinding.tool.expr; +import android.databinding.tool.BindingTarget; import android.databinding.tool.reflection.ModelAnalyzer; import android.databinding.tool.reflection.ModelClass; import android.databinding.tool.writer.KCode; +import android.databinding.tool.writer.LayoutBinderWriterKt; import java.util.HashMap; import java.util.List; @@ -45,9 +47,12 @@ public class ResourceExpr extends Expr { protected final String mResourceId; - public ResourceExpr(String packageName, String resourceType, String resourceName, - List<Expr> args) { + protected final BindingTarget mTarget; + + public ResourceExpr(BindingTarget target, String packageName, String resourceType, + String resourceName, List<Expr> args) { super(args); + mTarget = target; if ("android".equals(packageName)) { mPackage = "android."; } else { @@ -121,7 +126,11 @@ public class ResourceExpr extends Expr { @Override protected String computeUniqueKey() { String base = toString(); - return join(base, computeChildrenKey()); + String view = ""; + if (requiresView()) { + view = LayoutBinderWriterKt.getFieldName(mTarget); + } + return join(base, view, computeChildrenKey()); } @Override @@ -132,7 +141,7 @@ public class ResourceExpr extends Expr { @Override public Expr cloneToModel(ExprModel model) { String pkg = mPackage.isEmpty() ? "" : "android"; - return model.resourceExpr(pkg, mResourceType, mResourceId, + return model.resourceExpr(mTarget, pkg, mResourceType, mResourceId, cloneToModel(model, getChildren())); } @@ -146,19 +155,31 @@ public class ResourceExpr extends Expr { computeUniqueKey(); } + private boolean requiresView() { + return !mTarget.isBinder() && !("anim".equals(mResourceType) || + "animator".equals(mResourceType) || + "id".equals(mResourceType) || + "interpolator".equals(mResourceType) || + "layout".equals(mResourceType) || + "stateListAnimator".equals(mResourceType) || + "transition".equals(mResourceType)); + } + public String toJava() { final String context = "getRoot().getContext()"; - final String resources = "getRoot().getResources()"; + final String viewName = requiresView() ? LayoutBinderWriterKt.getFieldName(mTarget) : + "getRoot()"; + final String resources = viewName + ".getResources()"; final String resourceName = mPackage + "R." + getResourceObject() + "." + mResourceId; if ("anim".equals(mResourceType)) return "android.view.animation.AnimationUtils.loadAnimation(" + context + ", " + resourceName + ")"; if ("animator".equals(mResourceType)) return "android.animation.AnimatorInflater.loadAnimator(" + context + ", " + resourceName + ")"; if ("bool".equals(mResourceType)) return resources + ".getBoolean(" + resourceName + ")"; - if ("color".equals(mResourceType)) return "android.databinding.DynamicUtil.getColorFromResource(getRoot(), " + resourceName + ")"; - if ("colorStateList".equals(mResourceType)) return "getColorStateListFromResource(" + resourceName + ")"; + if ("color".equals(mResourceType)) return "android.databinding.DynamicUtil.getColorFromResource(" + viewName + ", " + resourceName + ")"; + if ("colorStateList".equals(mResourceType)) return "android.databinding.DynamicUtil.getColorStateListFromResource(" + viewName + ", " + resourceName + ")"; if ("dimen".equals(mResourceType)) return resources + ".getDimension(" + resourceName + ")"; if ("dimenOffset".equals(mResourceType)) return resources + ".getDimensionPixelOffset(" + resourceName + ")"; if ("dimenSize".equals(mResourceType)) return resources + ".getDimensionPixelSize(" + resourceName + ")"; - if ("drawable".equals(mResourceType)) return "getDrawableFromResource(" + resourceName + ")"; + if ("drawable".equals(mResourceType)) return "android.databinding.DynamicUtil.getDrawableFromResource(" + viewName + ", " + resourceName + ")"; if ("fraction".equals(mResourceType)) { String base = getChildCode(0, "1"); String pbase = getChildCode(1, "1"); @@ -174,11 +195,11 @@ public class ResourceExpr extends Expr { if (getChildren().isEmpty()) { return resourceName; } else { - return makeParameterCall(resourceName, "getQuantityString"); + return makeParameterCall(resources, resourceName, "getQuantityString"); } } if ("stateListAnimator".equals(mResourceType)) return "android.animation.AnimatorInflater.loadStateListAnimator(" + context + ", " + resourceName + ")"; - if ("string".equals(mResourceType)) return makeParameterCall(resourceName, "getString"); + if ("string".equals(mResourceType)) return makeParameterCall(resources, resourceName, "getString"); if ("stringArray".equals(mResourceType)) return resources + ".getStringArray(" + resourceName + ")"; if ("transition".equals(mResourceType)) return "android.transition.TransitionInflater.from(" + context + ").inflateTransition(" + resourceName + ")"; if ("typedArray".equals(mResourceType)) return resources + ".obtainTypedArray(" + resourceName + ")"; @@ -196,9 +217,9 @@ public class ResourceExpr extends Expr { } } - private String makeParameterCall(String resourceName, String methodCall) { - StringBuilder sb = new StringBuilder("getRoot().getResources()."); - sb.append(methodCall).append("(").append(resourceName); + private String makeParameterCall(String resources, String resourceName, String methodCall) { + StringBuilder sb = new StringBuilder(resources); + sb.append('.').append(methodCall).append("(").append(resourceName); for (Expr expr : getChildren()) { sb.append(", ").append(expr.toCode().generate()); } |