summaryrefslogtreecommitdiff
path: root/compiler/src/main
diff options
context:
space:
mode:
authorYigit Boyar <yboyar@google.com>2015-10-07 13:37:23 -0700
committerYigit Boyar <yboyar@google.com>2015-10-07 13:44:56 -0700
commitfd8342a51a96282df315cd27055ba539e89a8c9e (patch)
tree091a7001896fe75286e672e64cfedfd10e143226 /compiler/src/main
parent8510dab6a17ccd59a2a9cbc07f900dfc2f11ff2b (diff)
downloaddata-binding-fd8342a51a96282df315cd27055ba539e89a8c9e.tar.gz
Report syntax errors even though Antlr can recover
This CL makes Antlr parser more strict by not allowing errors. Antlr usually tries to recover from these errors but thats not what we really want for this use case. This CL also updates version codes to rc4 since rc3 is already out. Change-Id: I0d305e06a6cdcbae2f37573c3c6ae4233cdd7958
Diffstat (limited to 'compiler/src/main')
-rw-r--r--compiler/src/main/java/android/databinding/tool/ExpressionParser.java14
-rw-r--r--compiler/src/main/java/android/databinding/tool/LayoutBinder.java9
2 files changed, 21 insertions, 2 deletions
diff --git a/compiler/src/main/java/android/databinding/tool/ExpressionParser.java b/compiler/src/main/java/android/databinding/tool/ExpressionParser.java
index 467f658b..27168a63 100644
--- a/compiler/src/main/java/android/databinding/tool/ExpressionParser.java
+++ b/compiler/src/main/java/android/databinding/tool/ExpressionParser.java
@@ -17,17 +17,23 @@
package android.databinding.tool;
import org.antlr.v4.runtime.ANTLRInputStream;
+import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.RecognitionException;
+import org.antlr.v4.runtime.Recognizer;
+import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.misc.Nullable;
import org.antlr.v4.runtime.tree.ErrorNode;
import org.antlr.v4.runtime.tree.ParseTreeListener;
import org.antlr.v4.runtime.tree.TerminalNode;
+import org.apache.commons.lang3.StringUtils;
import android.databinding.parser.BindingExpressionLexer;
import android.databinding.parser.BindingExpressionParser;
import android.databinding.tool.expr.Expr;
import android.databinding.tool.expr.ExprModel;
+import android.databinding.tool.processing.ErrorMessages;
import android.databinding.tool.store.Location;
import android.databinding.tool.util.L;
import android.databinding.tool.util.Preconditions;
@@ -49,6 +55,14 @@ public class ExpressionParser {
BindingExpressionLexer lexer = new BindingExpressionLexer(inputStream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
final BindingExpressionParser parser = new BindingExpressionParser(tokenStream);
+ parser.addErrorListener(new BaseErrorListener() {
+ @Override
+ public <T extends Token> void syntaxError(Recognizer<T, ?> recognizer,
+ @Nullable T offendingSymbol, int line, int charPositionInLine, String msg,
+ @Nullable RecognitionException e) {
+ L.e(ErrorMessages.SYNTAX_ERROR, msg);
+ }
+ });
BindingExpressionParser.BindingSyntaxContext root = parser.bindingSyntax();
try {
mModel.setCurrentLocationInFile(locationInFile);
diff --git a/compiler/src/main/java/android/databinding/tool/LayoutBinder.java b/compiler/src/main/java/android/databinding/tool/LayoutBinder.java
index 1871577b..e099f286 100644
--- a/compiler/src/main/java/android/databinding/tool/LayoutBinder.java
+++ b/compiler/src/main/java/android/databinding/tool/LayoutBinder.java
@@ -199,8 +199,13 @@ public class LayoutBinder implements FileScopeProvider {
final BindingTarget bindingTarget = createBindingTarget(targetBundle);
for (BindingTargetBundle.BindingBundle bindingBundle : targetBundle
.getBindingBundleList()) {
- bindingTarget.addBinding(bindingBundle.getName(),
- parse(bindingBundle.getExpr(), bindingBundle.getValueLocation()));
+ try {
+ Scope.enter(bindingBundle.getValueLocation());
+ bindingTarget.addBinding(bindingBundle.getName(),
+ parse(bindingBundle.getExpr(), bindingBundle.getValueLocation()));
+ } finally {
+ Scope.exit();
+ }
}
bindingTarget.resolveMultiSetters();
bindingTarget.resolveListeners();