Improve error recovery when missing an .end array-data
diff --git a/smalidea/src/main/antlr3/smalideaParser.g b/smalidea/src/main/antlr3/smalideaParser.g
index 9ac2087..ea3369d 100644
--- a/smalidea/src/main/antlr3/smalideaParser.g
+++ b/smalidea/src/main/antlr3/smalideaParser.g
@@ -1297,7 +1297,15 @@
insn_array_data_directive
: ARRAY_DATA_DIRECTIVE
integer_literal
- array_data_element* END_ARRAY_DATA_DIRECTIVE;
+ array_data_element* end_array_data_directive;
+
+end_array_data_directive
+ : END_ARRAY_DATA_DIRECTIVE;
+ catch [RecognitionException re] {
+ Marker errorMarker = mark();
+ recover(input, re);
+ reportError(errorMarker, re, false);
+ }
array_data_element
@init { Marker marker = mark(); }
diff --git a/smalidea/testData/InvalidInstruction.smalidea b/smalidea/testData/InvalidInstruction.smalidea
index 9ef110b..9855250 100644
--- a/smalidea/testData/InvalidInstruction.smalidea
+++ b/smalidea/testData/InvalidInstruction.smalidea
@@ -6,4 +6,11 @@
.method blah2()V
.registers 1
invoke-virtual {v1, v2} .blah Lblah;->blah()V
+.end method
+
+.method blah3()V
+ .array-data 4
+ 1
+ 2
+ .blah
.end method
\ No newline at end of file
diff --git a/smalidea/testData/InvalidInstruction.txt b/smalidea/testData/InvalidInstruction.txt
index 65fc8b7..197c68c 100644
--- a/smalidea/testData/InvalidInstruction.txt
+++ b/smalidea/testData/InvalidInstruction.txt
@@ -104,4 +104,40 @@
PsiElement(VOID_TYPE)
PsiElement(VOID_TYPE)('V')
PsiWhiteSpace('\n')
+ PsiElement(END_METHOD_DIRECTIVE)('.end method')
+ PsiWhiteSpace('\n\n')
+ SmaliMethod(METHOD)
+ SmaliThrowsList(THROWS_LIST)
+ <empty list>
+ PsiElement(METHOD_DIRECTIVE)('.method')
+ PsiWhiteSpace(' ')
+ SmaliModifierList(MODIFIER_LIST)
+ <empty list>
+ PsiElement(MEMBER_NAME)
+ PsiElement(SIMPLE_NAME)('blah3')
+ SmaliMethodPrototype(METHOD_PROTOTYPE)
+ PsiElement(OPEN_PAREN)('(')
+ SmaliMethodParamList(METHOD_PARAM_LIST)
+ <empty list>
+ PsiElement(CLOSE_PAREN)(')')
+ PsiElement(VOID_TYPE)
+ PsiElement(VOID_TYPE)('V')
+ PsiWhiteSpace('\n ')
+ PsiElement(INSTRUCTION)
+ PsiElement(ARRAY_DATA_DIRECTIVE)('.array-data')
+ PsiWhiteSpace(' ')
+ PsiElement(LITERAL)
+ PsiElement(POSITIVE_INTEGER_LITERAL)('4')
+ PsiWhiteSpace('\n ')
+ PsiElement(ARRAY_DATA_ELEMENT)
+ PsiElement(LITERAL)
+ PsiElement(POSITIVE_INTEGER_LITERAL)('1')
+ PsiWhiteSpace('\n ')
+ PsiElement(ARRAY_DATA_ELEMENT)
+ PsiElement(LITERAL)
+ PsiElement(POSITIVE_INTEGER_LITERAL)('2')
+ PsiWhiteSpace('\n ')
+ PsiErrorElement:mismatched input '.blah' expecting END_ARRAY_DATA_DIRECTIVE
+ PsiElement(BAD_CHARACTER)('.blah')
+ PsiWhiteSpace('\n')
PsiElement(END_METHOD_DIRECTIVE)('.end method')
\ No newline at end of file