summaryrefslogtreecommitdiff
path: root/compiler/src/main/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/src/main/java/android')
-rw-r--r--compiler/src/main/java/android/databinding/tool/CompilerChef.java5
-rw-r--r--compiler/src/main/java/android/databinding/tool/ExpressionParser.java3
-rw-r--r--compiler/src/main/java/android/databinding/tool/ExpressionVisitor.java7
-rw-r--r--compiler/src/main/java/android/databinding/tool/LayoutBinder.java7
-rw-r--r--compiler/src/main/java/android/databinding/tool/expr/ExprModel.java6
-rw-r--r--compiler/src/main/java/android/databinding/tool/expr/ResourceExpr.java47
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());
}