diff options
12 files changed, 589 insertions, 168 deletions
diff --git a/build.gradle b/build.gradle index 3c945c68..717b9a60 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -ext.kotlinVersion = '0.9.206' +ext.kotlinVersion = '0.10.195' ext.releaseVersion = "0.3" ext.snapshotVersion = "0.3-SNAPSHOT" diff --git a/compiler/src/main/java/com/example/databinding/ExpressionVisitor.java b/compiler/src/main/java/com/example/databinding/ExpressionVisitor.java index 3b7bd902..74f389c1 100644 --- a/compiler/src/main/java/com/example/databinding/ExpressionVisitor.java +++ b/compiler/src/main/java/com/example/databinding/ExpressionVisitor.java @@ -17,10 +17,19 @@ package com.example.databinding; import com.android.databinding.BindingExpressionBaseVisitor; import com.android.databinding.BindingExpressionParser; +import com.android.databinding.parser.AndOrOpExpr; +import com.android.databinding.parser.BinaryOpExpr; +import com.android.databinding.parser.ComparisonOpExpr; import com.android.databinding.parser.Expr; import com.android.databinding.parser.ExprModel; +import com.android.databinding.parser.FieldExpr; +import com.android.databinding.parser.MethodCallExpr; +import com.android.databinding.parser.OpExpr; +import com.android.databinding.parser.SymbolExpr; +import com.android.databinding.parser.TernaryExpr; import com.android.databinding.parser.VariableRef; -import com.android.databinding.util.Log; +import com.android.databinding.util.ClassAnalyzer; +import static com.android.databinding.BindingExpressionParser.*; import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.runtime.tree.ParseTree; @@ -53,19 +62,7 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { javaString = ctx.DoubleQuoteString().getText(); } - return new Expr() { - @org.jetbrains.annotations.NotNull - @Override - public String toJava() { - return javaString; - } - - @org.jetbrains.annotations.NotNull - @Override - public String toReadableString() { - return javaString; - } - }; + return new SymbolExpr(javaString, String.class); } @Override @@ -76,6 +73,13 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { return new Expr() { @org.jetbrains.annotations.NotNull @Override + public Class<? extends Object> resolveValueType( + @org.jetbrains.annotations.NotNull ClassAnalyzer classAnalyzer) { + return expression.getResolvedClass(); + } + + @org.jetbrains.annotations.NotNull + @Override public String toJava() { return expression.toJava(); } @@ -106,6 +110,13 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { return new Expr() { @org.jetbrains.annotations.NotNull @Override + public Class<? extends Object> resolveValueType( + @org.jetbrains.annotations.NotNull ClassAnalyzer classAnalyzer) { + return variableRef.getVariable().getResolvedClass(); + } + + @org.jetbrains.annotations.NotNull + @Override public String toReadableString() { return variableRef.getFullName(); } @@ -126,6 +137,14 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { return new Expr() { @org.jetbrains.annotations.NotNull @Override + public Class<? extends Object> resolveValueType( + @org.jetbrains.annotations.NotNull ClassAnalyzer classAnalyzer) { + return classAnalyzer.commonParentOf(nullCheckExpression.getResolvedClass(), + isNullExpression.getResolvedClass()); + } + + @org.jetbrains.annotations.NotNull + @Override public String toJava() { return "((" + nullCheckExpression.toJava() + " != null) ? (" + nullCheckExpression.toJava() + ") : (" + isNullExpression.toJava() + "))"; @@ -145,19 +164,7 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { final VariableRef variableRef = mModel.getOrCreateVariable(identifier, null); mAccessedVariables.add(variableRef); - return new Expr() { - @org.jetbrains.annotations.NotNull - @Override - public String toJava() { - return identifier; - } - - @org.jetbrains.annotations.NotNull - @Override - public String toReadableString() { - return identifier; - } - }; + return new FieldExpr(variableRef, new ArrayList<VariableRef>(0)); } @Override @@ -169,21 +176,58 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { } @Override + public Expr visitTernaryOp(@NotNull TernaryOpContext ctx) { + return new TernaryExpr(ctx.left.accept(this), ctx.iftrue.accept(this), ctx.iffalse.accept(this)); + } + + @Override public Expr visitTerminal(@NotNull TerminalNode node) { - final String text = " " + node.getText() + " "; - return new Expr() { - @org.jetbrains.annotations.NotNull - @Override - public String toReadableString() { - return text; - } - @org.jetbrains.annotations.NotNull - @Override - public String toJava() { - return text; - } - }; + final int type = node.getSymbol().getType(); + switch (type) { + case IntegerLiteral: + return new SymbolExpr(node.getText(), Integer.class); + case FloatingPointLiteral: + return new SymbolExpr(node.getText(), Float.class); + case BooleanLiteral: + return new SymbolExpr(node.getText(), Boolean.class); + case CharacterLiteral: + return new SymbolExpr(node.getText(), Character.class); + case SingleQuoteString: + return new SymbolExpr(node.getText(), String.class); + case DoubleQuoteString: + return new SymbolExpr(node.getText(), String.class); + case NullLiteral: + return new SymbolExpr(node.getText(), Object.class); + default: + throw new RuntimeException("cannot create expression from terminal node " + node.toString()); + } + } + + @Override + public Expr visitMathOp(@NotNull MathOpContext ctx) { + // TODO must support upper cast + return new OpExpr(ctx.left.accept(this), ctx.op.getText(), ctx.right.accept(this)); + } + + @Override + public Expr visitBitShiftOp(@NotNull BitShiftOpContext ctx) { + return new BinaryOpExpr(ctx.left.accept(this), ctx.op.getText(), ctx.right.accept(this)); + } + + @Override + public Expr visitComparisonOp(@NotNull ComparisonOpContext ctx) { + return new ComparisonOpExpr(ctx.left.accept(this), ctx.op.getText(), ctx.right.accept(this)); + } + + @Override + public Expr visitBinaryOp(@NotNull BinaryOpContext ctx) { + return new BinaryOpExpr(ctx.left.accept(this), ctx.op.getText(), ctx.right.accept(this)); + } + + @Override + public Expr visitAndOrOp(@NotNull AndOrOpContext ctx) { + return new AndOrOpExpr(ctx.left.accept(this), ctx.op.getText(), ctx.right.accept(this)); } @Override @@ -194,6 +238,13 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { return new Expr() { @org.jetbrains.annotations.NotNull @Override + public Class<? extends Object> resolveValueType( + @org.jetbrains.annotations.NotNull ClassAnalyzer classAnalyzer) { + return classAnalyzer.commonParentOf(aggregate.getResolvedClass(), nextResult.getResolvedClass()); + } + + @org.jetbrains.annotations.NotNull + @Override public String toReadableString() { return aggregate.toReadableString() + ' ' + nextResult.toReadableString(); } @@ -224,40 +275,6 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { parameters.add(visit(parameter)); } } - return new Expr() { - @org.jetbrains.annotations.NotNull - @Override - public String toJava() { - StringBuilder sb = new StringBuilder(); - sb.append(expression.toJava()) - .append('.') - .append(methodName) - .append('('); - for (int i = 0; i < parameters.size(); i++) { - if (i != 0) { - sb.append(", "); - } - sb.append(parameters.get(i).toJava()); - } - sb.append(')'); - return sb.toString(); - } - - @org.jetbrains.annotations.NotNull - @Override - public String toReadableString() { - StringBuilder sb = new StringBuilder(); - sb.append(expression.toReadableString()) - .append('('); - for (int i = 0; i < parameters.size(); i++) { - if (i != 0) { - sb.append(", "); - } - sb.append(parameters.get(i).toReadableString()); - } - sb.append(')'); - return sb.toString(); - } - }; + return new MethodCallExpr(expression, methodName, parameters); } } diff --git a/compiler/src/main/kotlin/com/android/databinding/parser/expression_parser.kt b/compiler/src/main/kotlin/com/android/databinding/parser/expression_parser.kt index 30de0215..f13af57c 100644 --- a/compiler/src/main/kotlin/com/android/databinding/parser/expression_parser.kt +++ b/compiler/src/main/kotlin/com/android/databinding/parser/expression_parser.kt @@ -64,7 +64,7 @@ class ExprVisitor(val model : ExprModel) : DataBinderBaseVisitor<Expr>() { } override fun visitNilExpr(ctx: DataBinderParser.NilExprContext?): Expr? { - return SymbolExpr("null") + return SymbolExpr("null", javaClass<Any>()) } override fun visitTernaryExpr(ctx: DataBinderParser.TernaryExprContext): Expr { @@ -117,10 +117,11 @@ class ExprVisitor(val model : ExprModel) : DataBinderBaseVisitor<Expr>() { override fun visitHackyStringExpr(ctx: DataBinderParser.HackyStringExprContext): Expr? { val s = ctx.getText() - return SymbolExpr("\"${s.substring(1, s.size - 1)}\""); + return SymbolExpr("\"${s.substring(1, s.size - 1)}\"", javaClass<String>()); } override fun visitSymbol(ctx: DataBinderParser.SymbolContext): Expr? { - return SymbolExpr(ctx.getText()) + // TODO need to know what this is. + return SymbolExpr(ctx.getText(), javaClass<String>()) } }
\ No newline at end of file diff --git a/compiler/src/main/kotlin/com/android/databinding/parser/expressions.kt b/compiler/src/main/kotlin/com/android/databinding/parser/expressions.kt index 48713350..5fbd3a49 100644 --- a/compiler/src/main/kotlin/com/android/databinding/parser/expressions.kt +++ b/compiler/src/main/kotlin/com/android/databinding/parser/expressions.kt @@ -20,6 +20,7 @@ import kotlin.properties.Delegates import java.util.HashSet import com.android.databinding.vo.Variable import com.android.databinding.util.Log +import com.android.databinding.util.ClassAnalyzer public open class ExprModel { var start : Expr by Delegates.notNull() @@ -45,6 +46,11 @@ public open class ExprModel { abstract public class Expr { // ordered by depth var referencedVariables = arrayListOf<VariableRef>() + + val resolvedClass by Delegates.lazy { + resolveValueType(ClassAnalyzer.instance) + } + fun setReferencedVariables(refs : Collection<VariableRef>) { referencedVariables.clear() refs.groupBy{it.depth}.toSortedMap().forEach { referencedVariables.addAll(it.value)} @@ -52,6 +58,8 @@ abstract public class Expr { abstract fun toReadableString() : String abstract fun toJava() : String + + abstract fun resolveValueType(classAnalyzer : ClassAnalyzer) : Class<*> } public class VariableRef(val id : Int, val fullName: String, val parent : VariableRef? = null) { @@ -66,19 +74,29 @@ public class VariableRef(val id : Int, val fullName: String, val parent : Variab override fun toString(): String = "VariableRef(id=$id name=$fullName hasParent:${parent != null})" } -public data class SymbolExpr(val text : String) : Expr() { +public data class SymbolExpr(val text : String, val javaType : Class<out Any?>) : Expr() { override fun toJava(): String = text override fun toReadableString() = text + override fun resolveValueType(classAnalyzer: ClassAnalyzer): Class<out Any?> { + return javaType + } } public data class FieldExpr(val rootVariable : VariableRef, val subVariables : List<VariableRef>) : Expr() { + override fun resolveValueType(classAnalyzer: ClassAnalyzer): Class<out Any?> = + if (subVariables.size == 0) rootVariable.variable.resolvedClass else subVariables.last!!.variable.resolvedClass + override fun toJava(): String = if (subVariables.size == 0) rootVariable.variable.localName else subVariables.last!!.variable.localName override fun toReadableString(): String = if (subVariables.size == 0) rootVariable.fullName else subVariables.last!!.fullName } public data class GlobalMethodCallExpr(val methodName : String, val args : List<Expr>) : Expr() { + override fun resolveValueType(classAnalyzer: ClassAnalyzer): Class<out Any?> { + throw UnsupportedOperationException() + } + override fun toJava(): String { throw UnsupportedOperationException() } @@ -88,6 +106,10 @@ public data class GlobalMethodCallExpr(val methodName : String, val args : List< } public data class MethodCallExpr(val owner : Expr, val methodName : String, val args : List<Expr>) : Expr() { + override fun resolveValueType(classAnalyzer: ClassAnalyzer): Class<out Any?> { + val method = classAnalyzer.findMethod(owner.resolvedClass, methodName, args) + return method.getReturnType() + } override fun toJava(): String = "${owner.toJava()}.$methodName(${args.map{it.toJava()}.join(", ")})" @@ -96,15 +118,37 @@ public data class MethodCallExpr(val owner : Expr, val methodName : String, val } public data class TernaryExpr(val predicate : Expr, val ifTrue : Expr, val ifFalse : Expr) : Expr() { + override fun resolveValueType(classAnalyzer: ClassAnalyzer): Class<out Any?> = + classAnalyzer.commonParentOf(ifTrue.resolvedClass, ifFalse.resolvedClass) + override fun toJava(): String = "${predicate.toJava()} ? ${ifTrue.toJava()} : ${ifFalse.toJava()}" override fun toReadableString(): String = "${predicate.toReadableString()} ? ${ifTrue.toReadableString()} : ${ifFalse.toReadableString()}" } -public data class OpExpr(val left : Expr, val op : String, val right : Expr) : Expr() { +public open data class OpExpr(val left : Expr, val op : String, val right : Expr) : Expr() { override fun toJava(): String = "${left.toJava()} $op ${right.toJava()}" override fun toReadableString(): String = "${left.toReadableString()} $op ${right.toReadableString()}" -}
\ No newline at end of file + override fun resolveValueType(classAnalyzer: ClassAnalyzer): Class<out Any?> { + return classAnalyzer.commonParentOf(left.resolvedClass, right.resolvedClass) + } +} + +public data class BitShiftOpExpr(left : Expr, op : String, right : Expr) : OpExpr(left, op, right) { + override fun resolveValueType(classAnalyzer: ClassAnalyzer): Class<out Any?> = left.resolvedClass +} + +public data class BinaryOpExpr(left : Expr, op : String, right : Expr) : OpExpr(left, op, right) { + override fun resolveValueType(classAnalyzer: ClassAnalyzer): Class<out Any?> = left.resolvedClass +} + +public data class ComparisonOpExpr(left : Expr, op : String, right : Expr) : OpExpr(left, op, right) { + override fun resolveValueType(classAnalyzer: ClassAnalyzer): Class<out Any?> = javaClass<Boolean>() +} + +public data class AndOrOpExpr(left : Expr, op : String, right : Expr) : OpExpr(left, op, right) { + override fun resolveValueType(classAnalyzer: ClassAnalyzer): Class<out Any?> = javaClass<Boolean>() +} diff --git a/compiler/src/main/kotlin/com/android/databinding/renderer/view_expr_binder_renderer.kt b/compiler/src/main/kotlin/com/android/databinding/renderer/view_expr_binder_renderer.kt index 421c04d1..0d05bd53 100644 --- a/compiler/src/main/kotlin/com/android/databinding/renderer/view_expr_binder_renderer.kt +++ b/compiler/src/main/kotlin/com/android/databinding/renderer/view_expr_binder_renderer.kt @@ -148,6 +148,7 @@ ${lb.bindingTargets.filter { it.bindings.size > 0 }.map { """ ${lb.bindings.map { binding -> """ if ( (dirty & (${binding.isDirtyName})) != 0 ) { // ${binding.expr.toReadableString()} + // resolved type: ${binding.expr.resolvedClass.getCanonicalName()} ${binding.target.resolvedViewName}.${binding.setter}(${binding.expr.toJava()}); }"""}.joinIndented(2)} } diff --git a/compiler/src/main/kotlin/com/android/databinding/util/class_analyzer.kt b/compiler/src/main/kotlin/com/android/databinding/util/class_analyzer.kt index cc2c0819..56ac2644 100644 --- a/compiler/src/main/kotlin/com/android/databinding/util/class_analyzer.kt +++ b/compiler/src/main/kotlin/com/android/databinding/util/class_analyzer.kt @@ -21,11 +21,31 @@ import kotlin.properties.Delegates import com.android.databinding.ext.toCamelCase import com.android.databinding.util.Log import java.lang.reflect.Modifier +import com.android.databinding.parser.Expr +import java.lang.reflect.Method +import kotlin.reflect.jvm.* public fun Class<*>.isObservable() : Boolean = ClassAnalyzer.instance.observable.isAssignableFrom(this) public fun Class<*>.getCodeName() : String = getName().replace("$", ".") +public fun Method.canBeCalledWith(name : String, args : List<Class<*>>) : Boolean { + // TODO this is dumb, we need arg checking + if (name != getName()) { + return false + } + val params = getParameterTypes() + if (args.size() != params.size()) { + return false + } + return true +} + + +public fun Class<*>.findMethodWithAutoCasting(name : String, args : List<Class<*>>) : Method { + return getMethods().first { it.canBeCalledWith(name, args) } +} + public fun Class<*>.getMethodOrField(identifier : String) : Pair<String, String> { val getterName = "get${identifier.toCamelCase()}" try { @@ -53,6 +73,29 @@ class ClassAnalyzer(val classLoader : URLClassLoader) { } val loadedClasses = hashMapOf<String, Class<*>>() val observable = loadClass("com.android.databinding.library.Observable"); + val VOID by Delegates.lazy { + loadClass("java.lang.Void") + } + + val STRING = javaClass<String>() + + val LONG = javaClass<Long>() + + val INTEGER = javaClass<Integer>() + + val DOUBLE = javaClass<Double>() + + val FLOAT = javaClass<Float>() + + val pLONG = javaClass<kotlin.Long>() + + val pINTEGER = javaClass<kotlin.Int>() + + val pDOUBLE = javaClass<kotlin.Double>() + + val pFLOAT = javaClass<kotlin.Float>() + + private val CLASS_PRIORITY = arrayListOf(STRING, DOUBLE, pDOUBLE, FLOAT, pFLOAT, LONG, pLONG, INTEGER, pINTEGER) class object { var instance : ClassAnalyzer by Delegates.notNull() @@ -74,7 +117,7 @@ class ClassAnalyzer(val classLoader : URLClassLoader) { if("double".equals(className)) { return javaClass<kotlin.Double>() } - if("boolean".equals(className)) { + if("boolean".equals(className) || "bool".equals(className)) { return javaClass<kotlin.Boolean>() } return null @@ -127,4 +170,24 @@ class ClassAnalyzer(val classLoader : URLClassLoader) { return loadRecursively("${klassName.substring(0, lastIndexOfDot)}\$${klassName.substring(lastIndexOfDot + 1)}") } } + + fun findMethod(klass: Class<out Any?>, methodName: String, args: List<Expr>): Method { + val argClasses = args.map { it.resolvedClass } + + try { + return klass.findMethodWithAutoCasting(methodName, argClasses) + } catch(t:Throwable) { + val msg = "Could not find method with name $methodName and args $args as converted to ${argClasses.map { it }.joinToString(",")}" + Log.d(msg) + throw RuntimeException(msg) + } + } + + fun commonParentOf(klass1 : Class<*>, klass2 : Class<*>): Class<*> { + val clazz = CLASS_PRIORITY.firstOrNull { klass1 == it || klass2 == it } + if (clazz == null) { + throw RuntimeException("cannot find common parent for $klass1 and $klass2") + } + return clazz + } }
\ No newline at end of file diff --git a/grammerBuilder/BindingExpression.g4 b/grammerBuilder/BindingExpression.g4 index 723f13b1..b329faa5 100644 --- a/grammerBuilder/BindingExpression.g4 +++ b/grammerBuilder/BindingExpression.g4 @@ -40,19 +40,19 @@ expression | '(' type ')' expression # CastOp | ('+'|'-') expression # UnaryOp | ('~'|'!') expression # UnaryOp - | expression ('*'|'/'|'%') expression # BinaryOp - | expression ('+'|'-') expression # BinaryOp - | expression ('<<' | '>>>' | '>>') expression # BinaryOp - | expression ('<=' | '>=' | '>' | '<') expression # BinaryOp + | left=expression op=('*'|'/'|'%') right=expression # MathOp + | left=expression op=('+'|'-') right=expression # MathOp + | left=expression op=('<<' | '>>>' | '>>') right=expression # BitShiftOp + | left=expression op=('<=' | '>=' | '>' | '<') right=expression # ComparisonOp | expression 'instanceof' type # InstanceOfOp - | expression ('==' | '!=') expression # BinaryOp - | expression '&' expression # BinaryOp - | expression '^' expression # BinaryOp - | expression '|' expression # BinaryOp - | expression '&&' expression # BinaryOp - | expression '||' expression # BinaryOp - | expression '?' expression ':' expression # TernaryOp - | expression '??' expression # QuestionQuestionOp + | left=expression op=('==' | '!=') right=expression # ComparisonOp + | left=expression op='&' right=expression # BinaryOp + | left=expression op='^' right=expression # BinaryOp + | left=expression op='|' right=expression # BinaryOp + | left=expression op='&&' right=expression # AndOrOp + | left=expression op='||' right=expression # AndOrOp + | left=expression op='?' iftrue=expression ':' iffalse=expression # TernaryOp + | left=expression op='??' right=expression # QuestionQuestionOp ; THIS diff --git a/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionBaseListener.java b/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionBaseListener.java index b683c655..ed390b47 100644 --- a/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionBaseListener.java +++ b/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionBaseListener.java @@ -44,39 +44,39 @@ public class BindingExpressionBaseListener implements BindingExpressionListener * * <p>The default implementation does nothing.</p> */ - @Override public void enterCastOp(@NotNull BindingExpressionParser.CastOpContext ctx) { } + @Override public void enterUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx) { } /** * {@inheritDoc} * * <p>The default implementation does nothing.</p> */ - @Override public void exitCastOp(@NotNull BindingExpressionParser.CastOpContext ctx) { } + @Override public void exitUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx) { } /** * {@inheritDoc} * * <p>The default implementation does nothing.</p> */ - @Override public void enterUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx) { } + @Override public void enterCastOp(@NotNull BindingExpressionParser.CastOpContext ctx) { } /** * {@inheritDoc} * * <p>The default implementation does nothing.</p> */ - @Override public void exitUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx) { } + @Override public void exitCastOp(@NotNull BindingExpressionParser.CastOpContext ctx) { } /** * {@inheritDoc} * * <p>The default implementation does nothing.</p> */ - @Override public void enterMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx) { } + @Override public void enterAndOrOp(@NotNull BindingExpressionParser.AndOrOpContext ctx) { } /** * {@inheritDoc} * * <p>The default implementation does nothing.</p> */ - @Override public void exitMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx) { } + @Override public void exitAndOrOp(@NotNull BindingExpressionParser.AndOrOpContext ctx) { } /** * {@inheritDoc} @@ -96,6 +96,19 @@ public class BindingExpressionBaseListener implements BindingExpressionListener * * <p>The default implementation does nothing.</p> */ + @Override public void enterMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx) { } + /** + * {@inheritDoc} + * + * <p>The default implementation does nothing.</p> + */ + @Override public void exitMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx) { } + + /** + * {@inheritDoc} + * + * <p>The default implementation does nothing.</p> + */ @Override public void enterClassOrInterfaceType(@NotNull BindingExpressionParser.ClassOrInterfaceTypeContext ctx) { } /** * {@inheritDoc} @@ -161,6 +174,19 @@ public class BindingExpressionBaseListener implements BindingExpressionListener * * <p>The default implementation does nothing.</p> */ + @Override public void enterComparisonOp(@NotNull BindingExpressionParser.ComparisonOpContext ctx) { } + /** + * {@inheritDoc} + * + * <p>The default implementation does nothing.</p> + */ + @Override public void exitComparisonOp(@NotNull BindingExpressionParser.ComparisonOpContext ctx) { } + + /** + * {@inheritDoc} + * + * <p>The default implementation does nothing.</p> + */ @Override public void enterTernaryOp(@NotNull BindingExpressionParser.TernaryOpContext ctx) { } /** * {@inheritDoc} @@ -213,6 +239,19 @@ public class BindingExpressionBaseListener implements BindingExpressionListener * * <p>The default implementation does nothing.</p> */ + @Override public void enterBitShiftOp(@NotNull BindingExpressionParser.BitShiftOpContext ctx) { } + /** + * {@inheritDoc} + * + * <p>The default implementation does nothing.</p> + */ + @Override public void exitBitShiftOp(@NotNull BindingExpressionParser.BitShiftOpContext ctx) { } + + /** + * {@inheritDoc} + * + * <p>The default implementation does nothing.</p> + */ @Override public void enterInstanceOfOp(@NotNull BindingExpressionParser.InstanceOfOpContext ctx) { } /** * {@inheritDoc} @@ -317,6 +356,19 @@ public class BindingExpressionBaseListener implements BindingExpressionListener * * <p>The default implementation does nothing.</p> */ + @Override public void enterMathOp(@NotNull BindingExpressionParser.MathOpContext ctx) { } + /** + * {@inheritDoc} + * + * <p>The default implementation does nothing.</p> + */ + @Override public void exitMathOp(@NotNull BindingExpressionParser.MathOpContext ctx) { } + + /** + * {@inheritDoc} + * + * <p>The default implementation does nothing.</p> + */ @Override public void enterClassExtraction(@NotNull BindingExpressionParser.ClassExtractionContext ctx) { } /** * {@inheritDoc} diff --git a/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionBaseVisitor.java b/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionBaseVisitor.java index c13b41ff..aa91ac9c 100644 --- a/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionBaseVisitor.java +++ b/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionBaseVisitor.java @@ -35,7 +35,7 @@ public class BindingExpressionBaseVisitor<Result> extends AbstractParseTreeVisit * <p>The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.</p> */ - @Override public Result visitCastOp(@NotNull BindingExpressionParser.CastOpContext ctx) { return visitChildren(ctx); } + @Override public Result visitUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} @@ -43,7 +43,7 @@ public class BindingExpressionBaseVisitor<Result> extends AbstractParseTreeVisit * <p>The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.</p> */ - @Override public Result visitUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx) { return visitChildren(ctx); } + @Override public Result visitCastOp(@NotNull BindingExpressionParser.CastOpContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} @@ -51,7 +51,7 @@ public class BindingExpressionBaseVisitor<Result> extends AbstractParseTreeVisit * <p>The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.</p> */ - @Override public Result visitMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx) { return visitChildren(ctx); } + @Override public Result visitAndOrOp(@NotNull BindingExpressionParser.AndOrOpContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} @@ -67,6 +67,14 @@ public class BindingExpressionBaseVisitor<Result> extends AbstractParseTreeVisit * <p>The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.</p> */ + @Override public Result visitMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx) { return visitChildren(ctx); } + + /** + * {@inheritDoc} + * + * <p>The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.</p> + */ @Override public Result visitClassOrInterfaceType(@NotNull BindingExpressionParser.ClassOrInterfaceTypeContext ctx) { return visitChildren(ctx); } /** @@ -107,6 +115,14 @@ public class BindingExpressionBaseVisitor<Result> extends AbstractParseTreeVisit * <p>The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.</p> */ + @Override public Result visitComparisonOp(@NotNull BindingExpressionParser.ComparisonOpContext ctx) { return visitChildren(ctx); } + + /** + * {@inheritDoc} + * + * <p>The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.</p> + */ @Override public Result visitTernaryOp(@NotNull BindingExpressionParser.TernaryOpContext ctx) { return visitChildren(ctx); } /** @@ -139,6 +155,14 @@ public class BindingExpressionBaseVisitor<Result> extends AbstractParseTreeVisit * <p>The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.</p> */ + @Override public Result visitBitShiftOp(@NotNull BindingExpressionParser.BitShiftOpContext ctx) { return visitChildren(ctx); } + + /** + * {@inheritDoc} + * + * <p>The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.</p> + */ @Override public Result visitInstanceOfOp(@NotNull BindingExpressionParser.InstanceOfOpContext ctx) { return visitChildren(ctx); } /** @@ -203,6 +227,14 @@ public class BindingExpressionBaseVisitor<Result> extends AbstractParseTreeVisit * <p>The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.</p> */ + @Override public Result visitMathOp(@NotNull BindingExpressionParser.MathOpContext ctx) { return visitChildren(ctx); } + + /** + * {@inheritDoc} + * + * <p>The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.</p> + */ @Override public Result visitClassExtraction(@NotNull BindingExpressionParser.ClassExtractionContext ctx) { return visitChildren(ctx); } /** diff --git a/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionListener.java b/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionListener.java index d3d1dbda..0b4c24a0 100644 --- a/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionListener.java +++ b/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionListener.java @@ -34,43 +34,43 @@ public interface BindingExpressionListener extends ParseTreeListener { void exitBracketOp(@NotNull BindingExpressionParser.BracketOpContext ctx); /** - * Enter a parse tree produced by the {@code CastOp} + * Enter a parse tree produced by the {@code UnaryOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree */ - void enterCastOp(@NotNull BindingExpressionParser.CastOpContext ctx); + void enterUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx); /** - * Exit a parse tree produced by the {@code CastOp} + * Exit a parse tree produced by the {@code UnaryOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree */ - void exitCastOp(@NotNull BindingExpressionParser.CastOpContext ctx); + void exitUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx); /** - * Enter a parse tree produced by the {@code UnaryOp} + * Enter a parse tree produced by the {@code CastOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree */ - void enterUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx); + void enterCastOp(@NotNull BindingExpressionParser.CastOpContext ctx); /** - * Exit a parse tree produced by the {@code UnaryOp} + * Exit a parse tree produced by the {@code CastOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree */ - void exitUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx); + void exitCastOp(@NotNull BindingExpressionParser.CastOpContext ctx); /** - * Enter a parse tree produced by the {@code MethodInvocation} + * Enter a parse tree produced by the {@code AndOrOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree */ - void enterMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx); + void enterAndOrOp(@NotNull BindingExpressionParser.AndOrOpContext ctx); /** - * Exit a parse tree produced by the {@code MethodInvocation} + * Exit a parse tree produced by the {@code AndOrOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree */ - void exitMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx); + void exitAndOrOp(@NotNull BindingExpressionParser.AndOrOpContext ctx); /** * Enter a parse tree produced by {@link BindingExpressionParser#expressionList}. @@ -84,6 +84,19 @@ public interface BindingExpressionListener extends ParseTreeListener { void exitExpressionList(@NotNull BindingExpressionParser.ExpressionListContext ctx); /** + * Enter a parse tree produced by the {@code MethodInvocation} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + */ + void enterMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx); + /** + * Exit a parse tree produced by the {@code MethodInvocation} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + */ + void exitMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx); + + /** * Enter a parse tree produced by {@link BindingExpressionParser#classOrInterfaceType}. * @param ctx the parse tree */ @@ -141,6 +154,19 @@ public interface BindingExpressionListener extends ParseTreeListener { void exitBindingSyntax(@NotNull BindingExpressionParser.BindingSyntaxContext ctx); /** + * Enter a parse tree produced by the {@code ComparisonOp} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + */ + void enterComparisonOp(@NotNull BindingExpressionParser.ComparisonOpContext ctx); + /** + * Exit a parse tree produced by the {@code ComparisonOp} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + */ + void exitComparisonOp(@NotNull BindingExpressionParser.ComparisonOpContext ctx); + + /** * Enter a parse tree produced by the {@code TernaryOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree @@ -189,6 +215,19 @@ public interface BindingExpressionListener extends ParseTreeListener { void exitDefaults(@NotNull BindingExpressionParser.DefaultsContext ctx); /** + * Enter a parse tree produced by the {@code BitShiftOp} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + */ + void enterBitShiftOp(@NotNull BindingExpressionParser.BitShiftOpContext ctx); + /** + * Exit a parse tree produced by the {@code BitShiftOp} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + */ + void exitBitShiftOp(@NotNull BindingExpressionParser.BitShiftOpContext ctx); + + /** * Enter a parse tree produced by the {@code InstanceOfOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree @@ -289,6 +328,19 @@ public interface BindingExpressionListener extends ParseTreeListener { void exitGenericCall(@NotNull BindingExpressionParser.GenericCallContext ctx); /** + * Enter a parse tree produced by the {@code MathOp} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + */ + void enterMathOp(@NotNull BindingExpressionParser.MathOpContext ctx); + /** + * Exit a parse tree produced by the {@code MathOp} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + */ + void exitMathOp(@NotNull BindingExpressionParser.MathOpContext ctx); + + /** * Enter a parse tree produced by {@link BindingExpressionParser#classExtraction}. * @param ctx the parse tree */ diff --git a/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionParser.java b/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionParser.java index c20a7ba1..4d328371 100644 --- a/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionParser.java +++ b/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionParser.java @@ -352,22 +352,20 @@ public class BindingExpressionParser extends Parser { else return visitor.visitChildren(this); } } - public static class UnaryOpContext extends ExpressionContext { - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public UnaryOpContext(ExpressionContext ctx) { copyFrom(ctx); } + public static class ResourceContext extends ExpressionContext { + public TerminalNode ResourceReference() { return getToken(BindingExpressionParser.ResourceReference, 0); } + public ResourceContext(ExpressionContext ctx) { copyFrom(ctx); } @Override public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).enterUnaryOp(this); + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).enterResource(this); } @Override public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).exitUnaryOp(this); + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).exitResource(this); } @Override public <Result> Result accept(ParseTreeVisitor<? extends Result> visitor) { - if ( visitor instanceof BindingExpressionVisitor<?> ) return ((BindingExpressionVisitor<? extends Result>)visitor).visitUnaryOp(this); + if ( visitor instanceof BindingExpressionVisitor<?> ) return ((BindingExpressionVisitor<? extends Result>)visitor).visitResource(this); else return visitor.visitChildren(this); } } @@ -393,20 +391,47 @@ public class BindingExpressionParser extends Parser { else return visitor.visitChildren(this); } } - public static class ResourceContext extends ExpressionContext { - public TerminalNode ResourceReference() { return getToken(BindingExpressionParser.ResourceReference, 0); } - public ResourceContext(ExpressionContext ctx) { copyFrom(ctx); } + public static class UnaryOpContext extends ExpressionContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public UnaryOpContext(ExpressionContext ctx) { copyFrom(ctx); } @Override public void enterRule(ParseTreeListener listener) { - if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).enterResource(this); + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).enterUnaryOp(this); } @Override public void exitRule(ParseTreeListener listener) { - if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).exitResource(this); + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).exitUnaryOp(this); } @Override public <Result> Result accept(ParseTreeVisitor<? extends Result> visitor) { - if ( visitor instanceof BindingExpressionVisitor<?> ) return ((BindingExpressionVisitor<? extends Result>)visitor).visitResource(this); + if ( visitor instanceof BindingExpressionVisitor<?> ) return ((BindingExpressionVisitor<? extends Result>)visitor).visitUnaryOp(this); + else return visitor.visitChildren(this); + } + } + public static class AndOrOpContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext right; + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List<? extends ExpressionContext> expression() { + return getRuleContexts(ExpressionContext.class); + } + public AndOrOpContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).enterAndOrOp(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).exitAndOrOp(this); + } + @Override + public <Result> Result accept(ParseTreeVisitor<? extends Result> visitor) { + if ( visitor instanceof BindingExpressionVisitor<?> ) return ((BindingExpressionVisitor<? extends Result>)visitor).visitAndOrOp(this); else return visitor.visitChildren(this); } } @@ -500,6 +525,10 @@ public class BindingExpressionParser extends Parser { } } public static class TernaryOpContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext iftrue; + public ExpressionContext iffalse; public ExpressionContext expression(int i) { return getRuleContext(ExpressionContext.class,i); } @@ -521,6 +550,56 @@ public class BindingExpressionParser extends Parser { else return visitor.visitChildren(this); } } + public static class ComparisonOpContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext right; + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List<? extends ExpressionContext> expression() { + return getRuleContexts(ExpressionContext.class); + } + public ComparisonOpContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).enterComparisonOp(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).exitComparisonOp(this); + } + @Override + public <Result> Result accept(ParseTreeVisitor<? extends Result> visitor) { + if ( visitor instanceof BindingExpressionVisitor<?> ) return ((BindingExpressionVisitor<? extends Result>)visitor).visitComparisonOp(this); + else return visitor.visitChildren(this); + } + } + public static class MathOpContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext right; + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List<? extends ExpressionContext> expression() { + return getRuleContexts(ExpressionContext.class); + } + public MathOpContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).enterMathOp(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).exitMathOp(this); + } + @Override + public <Result> Result accept(ParseTreeVisitor<? extends Result> visitor) { + if ( visitor instanceof BindingExpressionVisitor<?> ) return ((BindingExpressionVisitor<? extends Result>)visitor).visitMathOp(this); + else return visitor.visitChildren(this); + } + } public static class DotOpContext extends ExpressionContext { public TerminalNode Identifier() { return getToken(BindingExpressionParser.Identifier, 0); } public ExpressionContext expression() { @@ -566,7 +645,35 @@ public class BindingExpressionParser extends Parser { else return visitor.visitChildren(this); } } + public static class BitShiftOpContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext right; + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List<? extends ExpressionContext> expression() { + return getRuleContexts(ExpressionContext.class); + } + public BitShiftOpContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).enterBitShiftOp(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof BindingExpressionListener ) ((BindingExpressionListener)listener).exitBitShiftOp(this); + } + @Override + public <Result> Result accept(ParseTreeVisitor<? extends Result> visitor) { + if ( visitor instanceof BindingExpressionVisitor<?> ) return ((BindingExpressionVisitor<? extends Result>)visitor).visitBitShiftOp(this); + else return visitor.visitChildren(this); + } + } public static class QuestionQuestionOpContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext right; public ExpressionContext expression(int i) { return getRuleContext(ExpressionContext.class,i); } @@ -611,6 +718,9 @@ public class BindingExpressionParser extends Parser { } } public static class BinaryOpContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext right; public ExpressionContext expression(int i) { return getRuleContext(ExpressionContext.class,i); } @@ -780,160 +890,177 @@ public class BindingExpressionParser extends Parser { switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); + _localctx = new MathOpContext(new ExpressionContext(_parentctx, _parentState)); + ((MathOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(87); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); setState(88); + ((MathOpContext)_localctx).op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__35) | (1L << T__18) | (1L << T__7))) != 0)) ) { - _errHandler.recoverInline(this); + ((MathOpContext)_localctx).op = _errHandler.recoverInline(this); } consume(); - setState(89); expression(14); + setState(89); ((MathOpContext)_localctx).right = expression(14); } break; case 2: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); + _localctx = new MathOpContext(new ExpressionContext(_parentctx, _parentState)); + ((MathOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(90); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); setState(91); + ((MathOpContext)_localctx).op = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__33 || _la==T__13) ) { - _errHandler.recoverInline(this); + ((MathOpContext)_localctx).op = _errHandler.recoverInline(this); } consume(); - setState(92); expression(13); + setState(92); ((MathOpContext)_localctx).right = expression(13); } break; case 3: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); + _localctx = new BitShiftOpContext(new ExpressionContext(_parentctx, _parentState)); + ((BitShiftOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(93); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); setState(94); + ((BitShiftOpContext)_localctx).op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__41) | (1L << T__25) | (1L << T__20))) != 0)) ) { - _errHandler.recoverInline(this); + ((BitShiftOpContext)_localctx).op = _errHandler.recoverInline(this); } consume(); - setState(95); expression(12); + setState(95); ((BitShiftOpContext)_localctx).right = expression(12); } break; case 4: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); + _localctx = new ComparisonOpContext(new ExpressionContext(_parentctx, _parentState)); + ((ComparisonOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(96); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); setState(97); + ((ComparisonOpContext)_localctx).op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__30) | (1L << T__27) | (1L << T__9) | (1L << T__4))) != 0)) ) { - _errHandler.recoverInline(this); + ((ComparisonOpContext)_localctx).op = _errHandler.recoverInline(this); } consume(); - setState(98); expression(11); + setState(98); ((ComparisonOpContext)_localctx).right = expression(11); } break; case 5: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); + _localctx = new ComparisonOpContext(new ExpressionContext(_parentctx, _parentState)); + ((ComparisonOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(99); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); setState(100); + ((ComparisonOpContext)_localctx).op = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__28 || _la==T__6) ) { - _errHandler.recoverInline(this); + ((ComparisonOpContext)_localctx).op = _errHandler.recoverInline(this); } consume(); - setState(101); expression(9); + setState(101); ((ComparisonOpContext)_localctx).right = expression(9); } break; case 6: { _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); + ((BinaryOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(102); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(103); match(T__38); - setState(104); expression(8); + setState(103); ((BinaryOpContext)_localctx).op = match(T__38); + setState(104); ((BinaryOpContext)_localctx).right = expression(8); } break; case 7: { _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); + ((BinaryOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(105); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(106); match(T__17); - setState(107); expression(7); + setState(106); ((BinaryOpContext)_localctx).op = match(T__17); + setState(107); ((BinaryOpContext)_localctx).right = expression(7); } break; case 8: { _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); + ((BinaryOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(108); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(109); match(T__2); - setState(110); expression(6); + setState(109); ((BinaryOpContext)_localctx).op = match(T__2); + setState(110); ((BinaryOpContext)_localctx).right = expression(6); } break; case 9: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); + _localctx = new AndOrOpContext(new ExpressionContext(_parentctx, _parentState)); + ((AndOrOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(111); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(112); match(T__11); - setState(113); expression(5); + setState(112); ((AndOrOpContext)_localctx).op = match(T__11); + setState(113); ((AndOrOpContext)_localctx).right = expression(5); } break; case 10: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); + _localctx = new AndOrOpContext(new ExpressionContext(_parentctx, _parentState)); + ((AndOrOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(114); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(115); match(T__10); - setState(116); expression(4); + setState(115); ((AndOrOpContext)_localctx).op = match(T__10); + setState(116); ((AndOrOpContext)_localctx).right = expression(4); } break; case 11: { _localctx = new TernaryOpContext(new ExpressionContext(_parentctx, _parentState)); + ((TernaryOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(117); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(118); match(T__26); - setState(119); expression(0); + setState(118); ((TernaryOpContext)_localctx).op = match(T__26); + setState(119); ((TernaryOpContext)_localctx).iftrue = expression(0); setState(120); match(T__31); - setState(121); expression(3); + setState(121); ((TernaryOpContext)_localctx).iffalse = expression(3); } break; case 12: { _localctx = new QuestionQuestionOpContext(new ExpressionContext(_parentctx, _parentState)); + ((QuestionQuestionOpContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(123); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(124); match(T__8); - setState(125); expression(2); + setState(124); ((QuestionQuestionOpContext)_localctx).op = match(T__8); + setState(125); ((QuestionQuestionOpContext)_localctx).right = expression(2); } break; diff --git a/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionVisitor.java b/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionVisitor.java index f4beb0fb..70fb7d0f 100644 --- a/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionVisitor.java +++ b/grammerBuilder/src/main/java-gen/com/android/databinding/BindingExpressionVisitor.java @@ -28,28 +28,28 @@ public interface BindingExpressionVisitor<Result> extends ParseTreeVisitor<Resul Result visitBracketOp(@NotNull BindingExpressionParser.BracketOpContext ctx); /** - * Visit a parse tree produced by the {@code CastOp} + * Visit a parse tree produced by the {@code UnaryOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree * @return the visitor result */ - Result visitCastOp(@NotNull BindingExpressionParser.CastOpContext ctx); + Result visitUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx); /** - * Visit a parse tree produced by the {@code UnaryOp} + * Visit a parse tree produced by the {@code CastOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree * @return the visitor result */ - Result visitUnaryOp(@NotNull BindingExpressionParser.UnaryOpContext ctx); + Result visitCastOp(@NotNull BindingExpressionParser.CastOpContext ctx); /** - * Visit a parse tree produced by the {@code MethodInvocation} + * Visit a parse tree produced by the {@code AndOrOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree * @return the visitor result */ - Result visitMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx); + Result visitAndOrOp(@NotNull BindingExpressionParser.AndOrOpContext ctx); /** * Visit a parse tree produced by {@link BindingExpressionParser#expressionList}. @@ -59,6 +59,14 @@ public interface BindingExpressionVisitor<Result> extends ParseTreeVisitor<Resul Result visitExpressionList(@NotNull BindingExpressionParser.ExpressionListContext ctx); /** + * Visit a parse tree produced by the {@code MethodInvocation} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + Result visitMethodInvocation(@NotNull BindingExpressionParser.MethodInvocationContext ctx); + + /** * Visit a parse tree produced by {@link BindingExpressionParser#classOrInterfaceType}. * @param ctx the parse tree * @return the visitor result @@ -95,6 +103,14 @@ public interface BindingExpressionVisitor<Result> extends ParseTreeVisitor<Resul Result visitBindingSyntax(@NotNull BindingExpressionParser.BindingSyntaxContext ctx); /** + * Visit a parse tree produced by the {@code ComparisonOp} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + Result visitComparisonOp(@NotNull BindingExpressionParser.ComparisonOpContext ctx); + + /** * Visit a parse tree produced by the {@code TernaryOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree @@ -125,6 +141,14 @@ public interface BindingExpressionVisitor<Result> extends ParseTreeVisitor<Resul Result visitDefaults(@NotNull BindingExpressionParser.DefaultsContext ctx); /** + * Visit a parse tree produced by the {@code BitShiftOp} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + Result visitBitShiftOp(@NotNull BindingExpressionParser.BitShiftOpContext ctx); + + /** * Visit a parse tree produced by the {@code InstanceOfOp} * labeled alternative in {@link BindingExpressionParser#expression}. * @param ctx the parse tree @@ -187,6 +211,14 @@ public interface BindingExpressionVisitor<Result> extends ParseTreeVisitor<Resul Result visitGenericCall(@NotNull BindingExpressionParser.GenericCallContext ctx); /** + * Visit a parse tree produced by the {@code MathOp} + * labeled alternative in {@link BindingExpressionParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + Result visitMathOp(@NotNull BindingExpressionParser.MathOpContext ctx); + + /** * Visit a parse tree produced by {@link BindingExpressionParser#classExtraction}. * @param ctx the parse tree * @return the visitor result |