From 80fa861cd688c8e7c92e27feaf6623ecfaa4901e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 5 Aug 2018 17:24:44 +0300 Subject: index expr --- src/grammar.ron | 1 + src/grammar/expressions/mod.rs | 14 ++++++++++++++ src/syntax_kinds/generated.rs | 2 ++ src/yellow/red.rs | 2 +- 4 files changed, 18 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/grammar.ron b/src/grammar.ron index a73e4e1f1..1eb76abdd 100644 --- a/src/grammar.ron +++ b/src/grammar.ron @@ -153,6 +153,7 @@ Grammar( // postfix "CALL_EXPR", + "INDEX_EXPR", "METHOD_CALL_EXPR", "FIELD_EXPR", "TRY_EXPR", diff --git a/src/grammar/expressions/mod.rs b/src/grammar/expressions/mod.rs index 4421a444c..7f3bc78f2 100644 --- a/src/grammar/expressions/mod.rs +++ b/src/grammar/expressions/mod.rs @@ -147,6 +147,7 @@ fn postfix_expr(p: &mut Parser, mut lhs: CompletedMarker) -> CompletedMarker { loop { lhs = match p.current() { L_PAREN => call_expr(p, lhs), + L_BRACK => index_expr(p, lhs), DOT if p.nth(1) == IDENT => if p.nth(2) == L_PAREN || p.nth(2) == COLONCOLON { method_call_expr(p, lhs) } else { @@ -172,6 +173,19 @@ fn call_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker { m.complete(p, CALL_EXPR) } +// test index_expr +// fn foo() { +// x[1][2]; +// } +fn index_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker { + assert!(p.at(L_BRACK)); + let m = lhs.precede(p); + p.bump(); + expr(p); + p.expect(R_BRACK); + m.complete(p, INDEX_EXPR) +} + // test method_call_expr // fn foo() { // x.foo(); diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs index fe1a6694c..8855e980e 100644 --- a/src/syntax_kinds/generated.rs +++ b/src/syntax_kinds/generated.rs @@ -141,6 +141,7 @@ pub enum SyntaxKind { STRUCT_LIT, STRUCT_LIT_FIELD, CALL_EXPR, + INDEX_EXPR, METHOD_CALL_EXPR, FIELD_EXPR, TRY_EXPR, @@ -367,6 +368,7 @@ impl SyntaxKind { STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" }, STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" }, CALL_EXPR => &SyntaxInfo { name: "CALL_EXPR" }, + INDEX_EXPR => &SyntaxInfo { name: "INDEX_EXPR" }, METHOD_CALL_EXPR => &SyntaxInfo { name: "METHOD_CALL_EXPR" }, FIELD_EXPR => &SyntaxInfo { name: "FIELD_EXPR" }, TRY_EXPR => &SyntaxInfo { name: "TRY_EXPR" }, diff --git a/src/yellow/red.rs b/src/yellow/red.rs index 91c4cd77f..f57c4a9b7 100644 --- a/src/yellow/red.rs +++ b/src/yellow/red.rs @@ -71,7 +71,7 @@ impl RedNode { match &self.children.read()[idx] { Some(child) => return Some(child.into()), None => (), - } + }; let green_children = self.green.children(); let start_offset = self.start_offset() + green_children[..idx] -- cgit v1.2.3