From 21d509aa6cd995d3aa2d6084e89a65d6ac4c359f Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Thu, 26 Feb 2015 19:33:41 -0800 Subject: [PATCH] Add better error recovery for the type_descriptor rule --- smalidea/src/main/antlr3/smalideaParser.g | 5 ++ smalidea/testData/InvalidMethod4.smalidea | 2 + smalidea/testData/InvalidMethod4.txt | 20 ++++++++ .../testData/InvalidMethodReference.smalidea | 5 ++ smalidea/testData/InvalidMethodReference.txt | 48 +++++++++++++++++++ 5 files changed, 80 insertions(+) diff --git a/smalidea/src/main/antlr3/smalideaParser.g b/smalidea/src/main/antlr3/smalideaParser.g index ff25d397..cbf0ec94 100644 --- a/smalidea/src/main/antlr3/smalideaParser.g +++ b/smalidea/src/main/antlr3/smalideaParser.g @@ -536,6 +536,11 @@ type_descriptor | primitive_type | class_descriptor | array_descriptor; + catch [RecognitionException re] { + Marker marker = mark(); + recover(input, re); + reportError(marker, re, false); + } nonvoid_type_descriptor : primitive_type diff --git a/smalidea/testData/InvalidMethod4.smalidea b/smalidea/testData/InvalidMethod4.smalidea index 961a161f..ff86bf37 100644 --- a/smalidea/testData/InvalidMethod4.smalidea +++ b/smalidea/testData/InvalidMethod4.smalidea @@ -4,3 +4,5 @@ .method blah(I .blah V .end method +.method blah())V +.end method \ No newline at end of file diff --git a/smalidea/testData/InvalidMethod4.txt b/smalidea/testData/InvalidMethod4.txt index 88e31c1a..aae80654 100644 --- a/smalidea/testData/InvalidMethod4.txt +++ b/smalidea/testData/InvalidMethod4.txt @@ -50,4 +50,24 @@ smali.FILE PsiElement(VOID_TYPE) PsiElement(VOID_TYPE)('V') PsiWhiteSpace('\n') + PsiElement(END_METHOD_DIRECTIVE)('.end method') + PsiWhiteSpace('\n\n') + SmaliMethod(METHOD) + SmaliThrowsList(THROWS_LIST) + + PsiElement(METHOD_DIRECTIVE)('.method') + PsiWhiteSpace(' ') + SmaliModifierList(MODIFIER_LIST) + + PsiElement(MEMBER_NAME) + PsiElement(SIMPLE_NAME)('blah') + SmaliMethodPrototype(METHOD_PROTOTYPE) + PsiElement(OPEN_PAREN)('(') + SmaliMethodParamList(METHOD_PARAM_LIST) + + PsiElement(CLOSE_PAREN)(')') + PsiErrorElement:no viable alternative at input ')' + PsiElement(CLOSE_PAREN)(')') + PsiElement(VOID_TYPE)('V') + PsiWhiteSpace('\n') PsiElement(END_METHOD_DIRECTIVE)('.end method') \ No newline at end of file diff --git a/smalidea/testData/InvalidMethodReference.smalidea b/smalidea/testData/InvalidMethodReference.smalidea index d304dd04..8ee6d79a 100644 --- a/smalidea/testData/InvalidMethodReference.smalidea +++ b/smalidea/testData/InvalidMethodReference.smalidea @@ -17,3 +17,8 @@ invoke-virtual {v0}, Lblah;->blah .blah )V .registers 1 invoke-virtual {v0}, Lblah;->blah(I .blah V .end method + +.method blah5()V +.registers 1 +invoke-virtual {v0}, Lblah;->blah())V +.end method diff --git a/smalidea/testData/InvalidMethodReference.txt b/smalidea/testData/InvalidMethodReference.txt index aa2135cf..a3cba170 100644 --- a/smalidea/testData/InvalidMethodReference.txt +++ b/smalidea/testData/InvalidMethodReference.txt @@ -186,4 +186,52 @@ smali.FILE PsiElement(VOID_TYPE) PsiElement(VOID_TYPE)('V') PsiWhiteSpace('\n') + PsiElement(END_METHOD_DIRECTIVE)('.end method') + PsiWhiteSpace('\n\n') + SmaliMethod(METHOD) + SmaliThrowsList(THROWS_LIST) + + PsiElement(METHOD_DIRECTIVE)('.method') + PsiWhiteSpace(' ') + SmaliModifierList(MODIFIER_LIST) + + PsiElement(MEMBER_NAME) + PsiElement(SIMPLE_NAME)('blah5') + SmaliMethodPrototype(METHOD_PROTOTYPE) + PsiElement(OPEN_PAREN)('(') + SmaliMethodParamList(METHOD_PARAM_LIST) + + PsiElement(CLOSE_PAREN)(')') + PsiElement(VOID_TYPE) + PsiElement(VOID_TYPE)('V') + PsiWhiteSpace('\n') + PsiElement(REGISTERS_STATEMENT) + PsiElement(REGISTERS_DIRECTIVE)('.registers') + PsiWhiteSpace(' ') + PsiElement(LITERAL) + PsiElement(POSITIVE_INTEGER_LITERAL)('1') + PsiWhiteSpace('\n') + PsiElement(INSTRUCTION) + PsiElement(INSTRUCTION_FORMAT35c_METHOD)('invoke-virtual') + PsiWhiteSpace(' ') + PsiElement(OPEN_BRACE)('{') + PsiElement(REGISTER_REFERENCE) + PsiElement(REGISTER)('v0') + PsiElement(CLOSE_BRACE)('}') + PsiElement(COMMA)(',') + PsiWhiteSpace(' ') + PsiElement(METHOD_REFERENCE) + PsiElement(CLASS_TYPE) + PsiElement(CLASS_DESCRIPTOR)('Lblah;') + PsiElement(ARROW)('->') + PsiElement(MEMBER_NAME) + PsiElement(SIMPLE_NAME)('blah') + PsiElement(OPEN_PAREN)('(') + PsiElement(METHOD_REFERENCE_PARAM_LIST) + + PsiElement(CLOSE_PAREN)(')') + PsiErrorElement:no viable alternative at input ')' + PsiElement(CLOSE_PAREN)(')') + PsiElement(VOID_TYPE)('V') + PsiWhiteSpace('\n') PsiElement(END_METHOD_DIRECTIVE)('.end method') \ No newline at end of file