Skip to content

Commit d30e432

Browse files
committed
Support the let...else... statement
1 parent 2747808 commit d30e432

File tree

4 files changed

+2762
-8465
lines changed

4 files changed

+2762
-8465
lines changed

community-rust-frontend/src/main/java/org/sonar/rust/RustGrammar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1062,7 +1062,7 @@ public static void statement(LexerlessGrammarBuilder b) {
10621062
b.zeroOrMore(OUTER_ATTRIBUTE, SPC),
10631063
RustKeyword.KW_LET, SPC, PATTERN_NO_TOP_ALT, SPC,
10641064
b.optional(RustPunctuator.COLON, SPC, TYPE, SPC),
1065-
b.optional(RustPunctuator.EQ, SPC, EXPRESSION, SPC),
1065+
b.optional(RustPunctuator.EQ, SPC, EXPRESSION, SPC, b.optional(RustKeyword.KW_ELSE, SPC, BLOCK_EXPRESSION)),
10661066
RustPunctuator.SEMI);
10671067

10681068
b.rule(EXPRESSION_STATEMENT).is(b.firstOf(

community-rust-frontend/src/test/java/org/sonar/rust/RustLexerTest.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,9 @@ public void testTokens() {
6666

6767
@Test
6868
public void testParsing() {
69-
String sexpr = "fn into(self) -> (String, ::prisma_client_rust::PrismaValue) {\n" +
70-
" match self { SetParam :: SetId(value) => (\"id\" . to_string() , :: prisma_client_rust :: PrismaValue :: String(value)) , " +
71-
"SetParam :: SetUsername(value) => (\"username\" . to_string () , :: prisma_client_rust :: PrismaValue :: String(value)) , " +
72-
"SetParam :: SetEmail(value) => (\"email\" . to_string () , :: prisma_client_rust :: PrismaValue :: String(value)) , " +
73-
"SetParam :: SetFirstName(value) => (\"first_name\" . to_string () , :: prisma_client_rust :: PrismaValue :: String(value)) , " +
74-
"SetParam :: SetLastName(value) => (\"last_name\" . to_string () , :: prisma_client_rust :: PrismaValue :: String(value)) , " +
75-
"SetParam :: SetIsActive(value) => (\"is_active\" . to_string () , :: prisma_client_rust :: PrismaValue :: Boolean(value)) , " +
76-
"SetParam :: SetCreated(value) => (\"created\" . to_string () , :: prisma_client_rust :: PrismaValue :: DateTime(value)) , " +
77-
"SetParam :: SetUpdated(value) => (\"updated\" . to_string() , value . map(| value | :: prisma_client_rust :: PrismaValue :: DateTime(value)) . unwrap_or(:: prisma_client_rust :: PrismaValue :: Null)) , " +
78-
"SetParam :: ConnectAccounts(where_params) =>(\"accounts\" . to_string() , :: prisma_client_rust :: PrismaValue :: Object(vec ! [(\"connect\" . to_string() , :: prisma_client_rust :: PrismaValue :: List(where_params . into_iter() . map(Into :: < super :: account :: WhereParam > :: into) . map(:: prisma_client_rust :: WhereInput :: serialize) . map(:: prisma_client_rust :: SerializedWhereInput :: transform_equals) . map(| v | :: prisma_client_rust :: PrismaValue :: Object(vec ! [v])) . collect()))])) , SetParam :: DisconnectAccounts(where_params) =>(\"accounts\" . to_string() , :: prisma_client_rust :: PrismaValue :: Object(vec ! [(\"disconnect\" . to_string() , :: prisma_client_rust :: PrismaValue :: List(where_params . into_iter() . map(Into :: < super :: account :: WhereParam > :: into) . map(:: prisma_client_rust :: WhereInput :: serialize) . map(:: prisma_client_rust :: SerializedWhereInput :: transform_equals) . map(| v | :: prisma_client_rust :: PrismaValue :: Object(vec ! [v])) . collect()))])) , SetParam :: SetAccounts(where_params) => (\"accounts\" . to_string() , :: prisma_client_rust :: PrismaValue :: Object(vec ! [(\"set\" . to_string() , :: prisma_client_rust :: PrismaValue :: List(where_params . into_iter() . map(Into :: < super :: account :: WhereParam > :: into) . map(:: prisma_client_rust :: WhereInput :: serialize) . map(:: prisma_client_rust :: SerializedWhereInput :: transform_equals) . map(| v | :: prisma_client_rust :: PrismaValue :: Object(vec ! [v])) . collect()))])) }\n" +
79-
" }";
69+
String sexpr = " let Some(f1) = pieces.next() else {\n" +
70+
" return Err(de::Error::invalid_length(0, &\"2\"));\n" +
71+
" };";
8072

8173
// Print out Ast node content for debugging purpose
8274

community-rust-frontend/src/test/java/org/sonar/rust/parser/statements/StatementTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ public void testLetStatement() {
6262
.matches("let ref mut refmut = fut.await;")
6363
.matches("let x = i32;")
6464
.matches("let zero = <X as Default>::default();")
65+
.matches("let Some(f1) = pieces.next() else {\n" +
66+
" return Err(de::Error::invalid_length(0, &\"2\"));\n" +
67+
" };")
6568

6669
;
6770
}

0 commit comments

Comments
 (0)