2
2
* Sonar Rust Plugin (Community)
3
3
* Copyright (C) 2021 Eric Le Goff
4
4
* http://github.com/elegoff/sonar-rust
5
- *
5
+ * <p>
6
6
* This program is free software; you can redistribute it and/or
7
7
* modify it under the terms of the GNU Lesser General Public
8
8
* License as published by the Free Software Foundation; either
9
9
* version 3 of the License, or (at your option) any later version.
10
- *
10
+ * <p>
11
11
* This program is distributed in the hope that it will be useful,
12
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
14
* Lesser General Public License for more details.
15
- *
15
+ * <p>
16
16
* You should have received a copy of the GNU Lesser General Public License
17
17
* along with this program; if not, write to the Free Software Foundation,
18
18
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -60,6 +60,7 @@ public enum RustGrammar implements GrammarRuleKey {
60
60
BLOCK_EXPRESSION ,
61
61
BOOLEAN_LITERAL ,
62
62
BORROW_EXPRESSION ,
63
+ BOX_EXPRESSION ,
63
64
BREAK_EXPRESSION ,
64
65
BYTE_ESCAPE ,
65
66
BYTE_LITERAL ,
@@ -344,7 +345,7 @@ public static LexerlessGrammarBuilder create() {
344
345
LexerlessGrammarBuilder b = LexerlessGrammarBuilder .create ();
345
346
346
347
347
- b .rule (COMPILATION_UNIT ).is (SPC , b .zeroOrMore (INNER_ATTRIBUTE ), SPC , b .zeroOrMore (STATEMENT , SPC ), EOF );
348
+ b .rule (COMPILATION_UNIT ).is (SPC , b .zeroOrMore (INNER_ATTRIBUTE , SPC ), SPC , b .zeroOrMore (STATEMENT , SPC ), EOF );
348
349
349
350
punctuators (b );
350
351
keywords (b );
@@ -385,29 +386,34 @@ private static void literals(LexerlessGrammarBuilder b) {
385
386
b .token (GenericTokenType .UNKNOWN_CHAR , b .regexp ("(?s)." )),
386
387
SPC ).skip ();
387
388
388
-
389
389
b .rule (CHAR_LITERAL ).is (b .token (RustTokenType .CHARACTER_LITERAL ,
390
- b .firstOf (b .regexp ("^\\ '[^\\ \r \\ n\\ t\\ '].*\\ '" ),
391
- b .sequence ("'" , UNICODE_ESCAPE , "'" ),
392
- b .sequence ("'" , QUOTE_ESCAPE , "'" ),
393
- b .sequence ("'" , ASCII_ESCAPE , "'" )))).skip ();
390
+ b .sequence ("'" ,
391
+ b .firstOf (
392
+ UNICODE_ESCAPE ,
393
+ QUOTE_ESCAPE ,
394
+ ASCII_ESCAPE ,
395
+ b .regexp ("[\\ x00-\\ x08\\ x11-\\ x12\\ x14-\\ x26\\ x28-x5b\\ x5d-\\ x{1ffff}]" )
396
+ ), "'"
397
+
398
+ ))).skip ();
394
399
395
400
b .rule (STRING_CONTENT ).is (b .oneOrMore (b .regexp ("[\\ x{0000}-\\ x{0021}\\ x{0023}-\\ x{005b}\\ x{005d}-\\ x{1ffff}]" )));
396
401
397
402
b .rule (STRING_LITERAL ).is (b .token (RustTokenType .STRING_LITERAL ,
398
- b .firstOf (
399
- "\" \\ \\ \" " ,
400
- b .sequence (
401
- "\" " , b .zeroOrMore (b .firstOf (
402
- "\\ n//" ,
403
- QUOTE_ESCAPE
404
- , ASCII_ESCAPE
405
- , UNICODE_ESCAPE
406
- , STRING_CONTINUE
407
- , STRING_CONTENT
408
- ), SPC ),
409
- "\" "
410
- ))
403
+ b .sequence (
404
+ "\" " , b .zeroOrMore (b .firstOf (
405
+ UNICODE_ESCAPE ,
406
+ "\\ n//" ,
407
+ "\\ \\ " ,
408
+ QUOTE_ESCAPE
409
+
410
+ , ASCII_ESCAPE
411
+
412
+ , STRING_CONTINUE
413
+ , STRING_CONTENT
414
+ ), SPC ),
415
+ "\" "
416
+ )
411
417
));
412
418
413
419
@@ -713,7 +719,7 @@ private static void implItem(LexerlessGrammarBuilder b) {
713
719
714
720
b .rule (TRAIT_IMPL ).is (
715
721
b .optional (RustKeyword .KW_UNSAFE , SPC ), RustKeyword .KW_IMPL , SPC , b .optional (GENERIC_PARAMS , SPC ),
716
- b .optional (RustPunctuator .NOT ), TYPE_PATH , SPC , RustKeyword .KW_FOR , SPC , TYPE ,
722
+ b .optional (RustPunctuator .NOT ), TYPE_PATH , SPC , RustKeyword .KW_FOR , SPC , TYPE , SPC ,
717
723
b .optional (WHERE_CLAUSE , SPC ), "{" , SPC ,
718
724
b .zeroOrMore (b .firstOf (INNER_ATTRIBUTE , OUTER_ATTRIBUTE ), SPC ),
719
725
b .zeroOrMore (ASSOCIATED_ITEM , SPC ), "}"
@@ -928,6 +934,7 @@ private static void patterns(LexerlessGrammarBuilder b) {
928
934
TUPLE_STRUCT_PATTERN ,
929
935
STRUCT_PATTERN ,
930
936
MACRO_INVOCATION ,
937
+ b .sequence (LITERAL_PATTERN , b .nextNot (RustPunctuator .DOTDOT )),
931
938
932
939
933
940
//unambigous PATH_PATTERN,
@@ -950,9 +957,9 @@ private static void patterns(LexerlessGrammarBuilder b) {
950
957
951
958
TUPLE_PATTERN ,
952
959
GROUPED_PATTERN ,
953
- SLICE_PATTERN ,
960
+ SLICE_PATTERN
961
+
954
962
955
- LITERAL_PATTERN
956
963
));
957
964
b .rule (LITERAL_PATTERN ).is (b .firstOf (
958
965
BOOLEAN_LITERAL ,
@@ -1016,7 +1023,7 @@ private static void patterns(LexerlessGrammarBuilder b) {
1016
1023
b .rule (STRUCT_PATTERN_ETCETERA ).is (b .zeroOrMore (OUTER_ATTRIBUTE , SPC ), RustPunctuator .DOTDOT );
1017
1024
1018
1025
b .rule (TUPLE_STRUCT_PATTERN ).is (
1019
- PATH_IN_EXPRESSION , "(" , b .optional (TUPLE_STRUCT_ITEMS ), ")"
1026
+ PATH_IN_EXPRESSION , "(" , SPC , b . optional ( RustKeyword . KW_BOX , SPC ), b .optional (TUPLE_STRUCT_ITEMS ), ")"
1020
1027
);
1021
1028
b .rule (TUPLE_STRUCT_ITEMS ).is (seq (b , PATTERN , RustPunctuator .COMMA ));
1022
1029
@@ -1031,8 +1038,8 @@ private static void patterns(LexerlessGrammarBuilder b) {
1031
1038
));
1032
1039
1033
1040
b .rule (GROUPED_PATTERN ).is ("(" , SPC , PATTERN , SPC , ")" );
1034
- b . rule ( SLICE_PATTERN ). is ( "[" , SPC , PATTERN , SPC ,
1035
- b . zeroOrMore ( b . sequence ( RustPunctuator . COMMA , SPC , PATTERN )), b . optional ( RustPunctuator .COMMA , SPC ), SPC , "]"
1041
+
1042
+ b . rule ( SLICE_PATTERN ). is ( "[" , b . optional ( seq ( b , PATTERN , RustPunctuator .COMMA )) , "]"
1036
1043
);
1037
1044
b .rule (PATH_PATTERN ).is (b .firstOf (PATH_IN_EXPRESSION , QUALIFIED_PATH_IN_EXPRESSION ));
1038
1045
}
@@ -1137,6 +1144,7 @@ public static void expressions(LexerlessGrammarBuilder b) {
1137
1144
b .firstOf (
1138
1145
b .sequence (LITERAL_EXPRESSION , b .zeroOrMore (SPC , EXPRESSION_TERM )),
1139
1146
b .sequence (BREAK_EXPRESSION , b .zeroOrMore (SPC , EXPRESSION_TERM )),
1147
+ b .sequence (BOX_EXPRESSION , b .zeroOrMore (SPC , EXPRESSION_TERM )),
1140
1148
b .sequence (RustPunctuator .DOTDOT , b .next (b .firstOf (")" , "]" , "}" ))),
1141
1149
b .sequence (RANGE_TO_INCLUSIVE_EXPR , b .zeroOrMore (SPC , EXPRESSION_TERM )),
1142
1150
b .sequence (RustPunctuator .DOTDOT , b .nextNot (RustPunctuator .EQ ), b .endOfInput ()),
@@ -1169,6 +1177,7 @@ public static void expressions(LexerlessGrammarBuilder b) {
1169
1177
b .zeroOrMore (OUTER_ATTRIBUTE , SPC ),
1170
1178
b .firstOf (
1171
1179
b .sequence (BREAK_EXPRESSION , b .zeroOrMore (SPC , EXPRESSION_TERM_EXCEPT_STRUCT )),
1180
+ b .sequence (BOX_EXPRESSION , b .zeroOrMore (SPC , EXPRESSION_TERM_EXCEPT_STRUCT )),
1172
1181
b .sequence (CONTINUE_EXPRESSION , b .zeroOrMore (SPC , EXPRESSION_TERM_EXCEPT_STRUCT )),
1173
1182
b .sequence (RustPunctuator .DOTDOT , b .next (")" )),
1174
1183
b .sequence (RANGE_TO_INCLUSIVE_EXPR , b .zeroOrMore (SPC , EXPRESSION_TERM_EXCEPT_STRUCT )),
@@ -1362,6 +1371,7 @@ public static void expressions(LexerlessGrammarBuilder b) {
1362
1371
b .rule (EXPRESSION_WITHOUT_BLOCK ).is (b .zeroOrMore (OUTER_ATTRIBUTE , SPC ),
1363
1372
b .firstOf (
1364
1373
b .sequence (BREAK_EXPRESSION , b .zeroOrMore (SPC , EXPRESSION_TERM )),
1374
+ b .sequence (BOX_EXPRESSION , b .zeroOrMore (SPC , EXPRESSION_TERM )),
1365
1375
b .sequence (CONTINUE_EXPRESSION , b .zeroOrMore (SPC , EXPRESSION_TERM )),
1366
1376
b .sequence (EXPRESSION_WITH_BLOCK , b .oneOrMore (SPC , EXPRESSION_TERM )),
1367
1377
@@ -1502,6 +1512,7 @@ private static void loops(LexerlessGrammarBuilder b) {
1502
1512
);
1503
1513
b .rule (LOOP_LABEL ).is (LIFETIME_OR_LABEL , SPC , RustPunctuator .COLON );
1504
1514
b .rule (BREAK_EXPRESSION ).is (RustKeyword .KW_BREAK , SPC , b .optional (LIFETIME_OR_LABEL , SPC ), b .optional (EXPRESSION , SPC ));
1515
+ b .rule (BOX_EXPRESSION ).is (RustKeyword .KW_BOX , SPC , EXPRESSION );
1505
1516
b .rule (CONTINUE_EXPRESSION ).is (
1506
1517
RustKeyword .KW_CONTINUE , b .optional (SPC , LIFETIME_OR_LABEL ));
1507
1518
@@ -1803,8 +1814,8 @@ public static void struct(LexerlessGrammarBuilder b) {
1803
1814
1804
1815
b .rule (STRUCT_EXPR_FIELD ).is (b .firstOf (
1805
1816
1806
- b .sequence (b .firstOf (IDENTIFIER , TUPLE_INDEX ), SPC , RustPunctuator .COLON , SPC , EXPRESSION ),
1807
- IDENTIFIER
1817
+ b .sequence (b .optional ( OUTER_ATTRIBUTE , SPC ), b . firstOf (IDENTIFIER , TUPLE_INDEX ), SPC , RustPunctuator .COLON , SPC , EXPRESSION ),
1818
+ b . sequence ( b . optional ( OUTER_ATTRIBUTE , SPC ), IDENTIFIER )
1808
1819
1809
1820
));
1810
1821
@@ -2063,7 +2074,8 @@ private static void bytes(LexerlessGrammarBuilder b) {
2063
2074
2064
2075
b .rule (BYTE_LITERAL ).is (b .token (RustTokenType .BYTE_LITERAL ,
2065
2076
b .firstOf (
2066
- b .regexp ("^b\\ '" + "[^\\ '\\ n\\ r\\ t\\ \\ ].*" + "\\ '" ),
2077
+ "b'\\ ''" ,
2078
+ b .sequence ("b'" , b .regexp ("[\\ x00-\\ x08\\ x11-\\ x12\\ x14-\\ x26\\ x28-x5b\\ x5d-\\ x7f]" ), "'" ),
2067
2079
b .sequence ("b'" , BYTE_ESCAPE , "'" )
2068
2080
)));
2069
2081
@@ -2133,7 +2145,7 @@ private static void characters(LexerlessGrammarBuilder b) {
2133
2145
2134
2146
b .rule (QUOTE_ESCAPE ).is (b .firstOf ("\\ '" , "\\ \" " ));
2135
2147
b .rule (ASCII_ESCAPE ).is (b .firstOf (b .sequence ("\\ x" , OCT_DIGIT , HEX_DIGIT ),
2136
- "\\ n" , "\\ r" , "\\ t" , "\\ " , "\0 " ));
2148
+ "\\ n" , "\\ r" , "\\ t" , "\\ \\ " , "\ \ 0" ));
2137
2149
b .rule (UNICODE_ESCAPE ).is ("\\ u{" , b .oneOrMore (b .sequence (HEX_DIGIT , b .zeroOrMore (RustPunctuator .UNDERSCORE ))), "}" );
2138
2150
b .rule (STRING_CONTINUE ).is ("\\ \n " );
2139
2151
0 commit comments