From 599ca1ad890f7b8e1e3919f1727c21dad353f595 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Jul 2018 20:44:54 +0300 Subject: [PATCH] dref-expr --- src/grammar.ron | 1 + src/parser/grammar/expressions.rs | 13 ++++++++++ src/syntax_kinds/generated.rs | 2 ++ tests/data/parser/inline/0062_deref_expr.rs | 3 +++ tests/data/parser/inline/0062_deref_expr.txt | 26 ++++++++++++++++++++ 5 files changed, 45 insertions(+) create mode 100644 tests/data/parser/inline/0062_deref_expr.rs create mode 100644 tests/data/parser/inline/0062_deref_expr.txt diff --git a/src/grammar.ron b/src/grammar.ron index 5642492001a..aa01cb20588 100644 --- a/src/grammar.ron +++ b/src/grammar.ron @@ -129,6 +129,7 @@ Grammar( "METHOD_CALL_EXPR", "FIELD_EXPR", "REF_EXPR", + "DEREF_EXPR", "STRUCT_LIT", "STRUCT_LIT_FIELD", diff --git a/src/parser/grammar/expressions.rs b/src/parser/grammar/expressions.rs index 5b18e2294db..881d947acc0 100644 --- a/src/parser/grammar/expressions.rs +++ b/src/parser/grammar/expressions.rs @@ -48,6 +48,7 @@ pub(super) fn expr(p: &mut Parser) { fn prefix_expr(p: &mut Parser) -> Option { match p.current() { AMPERSAND => Some(ref_expr(p)), + STAR => Some(deref_expr(p)), _ => atom_expr(p), } } @@ -66,6 +67,18 @@ fn ref_expr(p: &mut Parser) -> CompletedMarker { m.complete(p, REF_EXPR) } +// test deref_expr +// fn foo() { +// **&1; +// } +fn deref_expr(p: &mut Parser) -> CompletedMarker { + assert!(p.at(STAR)); + let m = p.start(); + p.bump(); + expr(p); + m.complete(p, DEREF_EXPR) +} + fn atom_expr(p: &mut Parser) -> Option { match literal(p) { Some(m) => return Some(m), diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs index 6557645288e..a37fdea0b15 100644 --- a/src/syntax_kinds/generated.rs +++ b/src/syntax_kinds/generated.rs @@ -120,6 +120,7 @@ pub enum SyntaxKind { METHOD_CALL_EXPR, FIELD_EXPR, REF_EXPR, + DEREF_EXPR, STRUCT_LIT, STRUCT_LIT_FIELD, EXTERN_BLOCK, @@ -279,6 +280,7 @@ impl SyntaxKind { METHOD_CALL_EXPR => &SyntaxInfo { name: "METHOD_CALL_EXPR" }, FIELD_EXPR => &SyntaxInfo { name: "FIELD_EXPR" }, REF_EXPR => &SyntaxInfo { name: "REF_EXPR" }, + DEREF_EXPR => &SyntaxInfo { name: "DEREF_EXPR" }, STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" }, STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" }, EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, diff --git a/tests/data/parser/inline/0062_deref_expr.rs b/tests/data/parser/inline/0062_deref_expr.rs new file mode 100644 index 00000000000..b1e35defcfa --- /dev/null +++ b/tests/data/parser/inline/0062_deref_expr.rs @@ -0,0 +1,3 @@ +fn foo() { + **&1; +} diff --git a/tests/data/parser/inline/0062_deref_expr.txt b/tests/data/parser/inline/0062_deref_expr.txt new file mode 100644 index 00000000000..62e8e677889 --- /dev/null +++ b/tests/data/parser/inline/0062_deref_expr.txt @@ -0,0 +1,26 @@ +FILE@[0; 23) + FN_ITEM@[0; 23) + FN_KW@[0; 2) + NAME@[2; 6) + WHITESPACE@[2; 3) + IDENT@[3; 6) "foo" + PARAM_LIST@[6; 9) + L_PAREN@[6; 7) + R_PAREN@[7; 8) + WHITESPACE@[8; 9) + BLOCK@[9; 23) + L_CURLY@[9; 10) + EXPR_STMT@[10; 21) + DEREF_EXPR@[10; 19) + WHITESPACE@[10; 15) + STAR@[15; 16) + DEREF_EXPR@[16; 19) + STAR@[16; 17) + REF_EXPR@[17; 19) + AMPERSAND@[17; 18) + LITERAL@[18; 19) + INT_NUMBER@[18; 19) + SEMI@[19; 20) + WHITESPACE@[20; 21) + R_CURLY@[21; 22) + WHITESPACE@[22; 23)