diff --git a/smalidea/src/main/antlr3/smalideaParser.g b/smalidea/src/main/antlr3/smalideaParser.g index 0483f3e3..f6695bd3 100644 --- a/smalidea/src/main/antlr3/smalideaParser.g +++ b/smalidea/src/main/antlr3/smalideaParser.g @@ -668,13 +668,21 @@ type_field_method_literal // TODO: check missing initial token subannotation @init { Marker marker = mark(); } - : SUBANNOTATION_DIRECTIVE class_descriptor annotation_element* END_SUBANNOTATION_DIRECTIVE + : SUBANNOTATION_DIRECTIVE class_descriptor annotation_element* end_subannotation_directive { marker.done(SmaliElementTypes.LITERAL); }; catch [RecognitionException re] { recover(input, re); reportError(marker, re, false); } +end_subannotation_directive + : END_SUBANNOTATION_DIRECTIVE; + catch [RecognitionException re] { + Marker errorMarker = mark(); + recover(input, re); + reportError(errorMarker, re, false); + } + literal : long_literal | integer_literal diff --git a/smalidea/testData/InvalidAnnotation.smalidea b/smalidea/testData/InvalidAnnotation.smalidea index c9ea7be6..9825e293 100644 --- a/smalidea/testData/InvalidAnnotation.smalidea +++ b/smalidea/testData/InvalidAnnotation.smalidea @@ -10,4 +10,10 @@ .annotation runtime Lblah; blah = .blah .blah +.end annotation + +.annotation runtime Lblah; + blah = .subannotation Lblah2; + blah = "blah" + .blah .end annotation \ No newline at end of file diff --git a/smalidea/testData/InvalidAnnotation.txt b/smalidea/testData/InvalidAnnotation.txt index 56290d71..ad6aca78 100644 --- a/smalidea/testData/InvalidAnnotation.txt +++ b/smalidea/testData/InvalidAnnotation.txt @@ -69,4 +69,39 @@ smali.FILE PsiWhiteSpace(' ') PsiElement(BAD_CHARACTER)('.blah') PsiWhiteSpace('\n') + PsiElement(END_ANNOTATION_DIRECTIVE)('.end annotation') + PsiWhiteSpace('\n\n') + SmaliAnnotation(ANNOTATION) + PsiElement(ANNOTATION_DIRECTIVE)('.annotation') + PsiWhiteSpace(' ') + PsiElement(ANNOTATION_VISIBILITY)('runtime') + PsiWhiteSpace(' ') + PsiElement(CLASS_TYPE) + PsiElement(CLASS_DESCRIPTOR)('Lblah;') + PsiWhiteSpace('\n ') + PsiElement(ANNOTATION_PARAMETER_LIST) + PsiElement(ANNOTATION_ELEMENT) + PsiElement(ANNOTATION_ELEMENT_NAME) + PsiElement(SIMPLE_NAME)('blah') + PsiWhiteSpace(' ') + PsiElement(EQUAL)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL) + PsiElement(SUBANNOTATION_DIRECTIVE)('.subannotation') + PsiWhiteSpace(' ') + PsiElement(CLASS_TYPE) + PsiElement(CLASS_DESCRIPTOR)('Lblah2;') + PsiWhiteSpace('\n ') + PsiElement(ANNOTATION_ELEMENT) + PsiElement(ANNOTATION_ELEMENT_NAME) + PsiElement(SIMPLE_NAME)('blah') + PsiWhiteSpace(' ') + PsiElement(EQUAL)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL) + PsiElement(STRING_LITERAL)('"blah"') + PsiWhiteSpace('\n ') + PsiErrorElement:mismatched input '.blah' expecting END_SUBANNOTATION_DIRECTIVE + PsiElement(BAD_CHARACTER)('.blah') + PsiWhiteSpace('\n') PsiElement(END_ANNOTATION_DIRECTIVE)('.end annotation') \ No newline at end of file