diff options
author | Yigit Boyar <yboyar@google.com> | 2015-10-07 13:37:23 -0700 |
---|---|---|
committer | Yigit Boyar <yboyar@google.com> | 2015-10-07 13:44:56 -0700 |
commit | fd8342a51a96282df315cd27055ba539e89a8c9e (patch) | |
tree | 091a7001896fe75286e672e64cfedfd10e143226 /compiler/src/main | |
parent | 8510dab6a17ccd59a2a9cbc07f900dfc2f11ff2b (diff) | |
download | data-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.java | 14 | ||||
-rw-r--r-- | compiler/src/main/java/android/databinding/tool/LayoutBinder.java | 9 |
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(); |