From aa06a4c782ca3642aef8a3fd43f70bd81df3c42c Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sat, 14 Feb 2015 18:09:29 -0800 Subject: [PATCH] Improve parsing of an invalid SmaliMethod with no .end method This ensures that we still generate a SmaliMethod in this case, instead of erroring out when not matching the END_METHOD_DIRECTIVE and aborting the main SmaliMethod mark. --- smalidea/src/main/antlr3/smalideaParser.g | 6 +++- .../test/java/org/jf/smalidea/ParserTest.java | 1 + smalidea/testData/InvalidMethod.smalidea | 4 +++ smalidea/testData/InvalidMethod.txt | 33 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 smalidea/testData/InvalidMethod.smalidea create mode 100644 smalidea/testData/InvalidMethod.txt diff --git a/smalidea/src/main/antlr3/smalideaParser.g b/smalidea/src/main/antlr3/smalideaParser.g index f24f071a..581fae5f 100644 --- a/smalidea/src/main/antlr3/smalideaParser.g +++ b/smalidea/src/main/antlr3/smalideaParser.g @@ -308,13 +308,17 @@ method mark().done(SmaliElementTypes.MODIFIER_LIST); } : METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives - END_METHOD_DIRECTIVE + end_method_directive { marker.done(SmaliElementTypes.METHOD); }; catch [RecognitionException re] { recover(input, re); reportError(marker, re, false); } +end_method_directive + : END_METHOD_DIRECTIVE; + + statements_and_directives : ( ( ordered_method_item diff --git a/smalidea/src/test/java/org/jf/smalidea/ParserTest.java b/smalidea/src/test/java/org/jf/smalidea/ParserTest.java index 3692ae99..e4f24969 100644 --- a/smalidea/src/test/java/org/jf/smalidea/ParserTest.java +++ b/smalidea/src/test/java/org/jf/smalidea/ParserTest.java @@ -101,4 +101,5 @@ public class ParserTest extends ParsingTestCase { public void testParamListInvalidParameter() throws Exception { doTest(true); } public void testSuperClassInvalidSyntax() throws Exception { doTest(true); } public void testSuperClassInvalidSyntax2() throws Exception { doTest(true); } + public void testInvalidMethod() throws Exception { doTest(true); } } diff --git a/smalidea/testData/InvalidMethod.smalidea b/smalidea/testData/InvalidMethod.smalidea new file mode 100644 index 00000000..57245e9f --- /dev/null +++ b/smalidea/testData/InvalidMethod.smalidea @@ -0,0 +1,4 @@ +.class Ltest; +.super Ljava/lang/Object; + +.method .blah \ No newline at end of file diff --git a/smalidea/testData/InvalidMethod.txt b/smalidea/testData/InvalidMethod.txt new file mode 100644 index 00000000..f23139df --- /dev/null +++ b/smalidea/testData/InvalidMethod.txt @@ -0,0 +1,33 @@ +smali.FILE + SmaliClass(CLASS) + SmaliModifierList(MODIFIER_LIST) + + SmaliExtendsList(EXTENDS_LIST) + + SmaliImplementsList(IMPLEMENTS_LIST) + + PsiElement(CLASS_STATEMENT) + PsiElement(CLASS_DIRECTIVE)('.class') + PsiWhiteSpace(' ') + PsiElement(ACCESS_LIST) + + PsiElement(CLASS_TYPE) + PsiElement(CLASS_DESCRIPTOR)('Ltest;') + PsiWhiteSpace('\n') + PsiElement(SUPER_STATEMENT) + PsiElement(SUPER_DIRECTIVE)('.super') + PsiWhiteSpace(' ') + PsiElement(CLASS_TYPE) + PsiElement(CLASS_DESCRIPTOR)('Ljava/lang/Object;') + PsiWhiteSpace('\n\n') + SmaliMethod(METHOD) + SmaliModifierList(MODIFIER_LIST) + + PsiElement(METHOD_DIRECTIVE)('.method') + PsiWhiteSpace(' ') + PsiElement(ACCESS_LIST) + + PsiErrorElement:no viable alternative at input '.blah' + PsiElement(BAD_CHARACTER)('.blah') + SmaliMethodPrototype(METHOD_PROTOTYPE) + \ No newline at end of file