From 85c42fba1291f1cc41fb7bfec63117895b394fc5 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 4 Feb 2018 16:46:26 +0300 Subject: Support contextual tokens --- grammar.ron | 5 + src/parser/event.rs | 27 +++-- src/parser/grammar/items/mod.rs | 22 ++++- src/parser/input.rs | 7 +- src/parser/parser.rs | 19 +++- src/syntax_kinds.rs | 110 +++++++++++---------- tests/data/parser/inline/0009_unsafe_auto_trait.rs | 1 + .../data/parser/inline/0009_unsafe_auto_trait.txt | 13 +++ .../data/parser/inline/0010_unsafe_default_impl.rs | 1 + .../parser/inline/0010_unsafe_default_impl.txt | 13 +++ tools/src/bin/gen.rs | 9 +- 11 files changed, 155 insertions(+), 72 deletions(-) create mode 100644 tests/data/parser/inline/0009_unsafe_auto_trait.rs create mode 100644 tests/data/parser/inline/0009_unsafe_auto_trait.txt create mode 100644 tests/data/parser/inline/0010_unsafe_default_impl.rs create mode 100644 tests/data/parser/inline/0010_unsafe_default_impl.txt diff --git a/grammar.ron b/grammar.ron index c2fcc44f5..e97ef0c2c 100644 --- a/grammar.ron +++ b/grammar.ron @@ -27,6 +27,11 @@ Grammar( "mut", "unsafe", ], + contextual_keywords: [ + "auto", + "default", + "union", + ], tokens: [ "ERROR", "IDENT", diff --git a/src/parser/event.rs b/src/parser/event.rs index fd6bdc086..64d751d63 100644 --- a/src/parser/event.rs +++ b/src/parser/event.rs @@ -1,4 +1,4 @@ -use {File, FileBuilder, Sink, SyntaxKind, Token}; +use {File, FileBuilder, Sink, SyntaxKind, Token, TextUnit}; use syntax_kinds::TOMBSTONE; use super::is_insignificant; @@ -120,18 +120,25 @@ pub(super) fn to_file(text: String, tokens: &[Token], events: Vec) -> Fil builder.finish_internal() } &Event::Token { - kind: _, + kind, mut n_raw_tokens, - } => loop { - let token = tokens[idx]; - if !is_insignificant(token.kind) { - n_raw_tokens -= 1; + } => { + // FIXME: currently, we attach whitespace to some random node + // this should be done in a sensible manner instead + loop { + let token = tokens[idx]; + if !is_insignificant(token.kind) { + break; + } + builder.leaf(token.kind, token.len); + idx += 1 } - idx += 1; - builder.leaf(token.kind, token.len); - if n_raw_tokens == 0 { - break; + let mut len = TextUnit::new(0); + for _ in 0..n_raw_tokens { + len += tokens[idx].len; + idx += 1; } + builder.leaf(kind, len); }, &Event::Error { ref message } => builder.error().message(message.clone()).emit(), } diff --git a/src/parser/grammar/items/mod.rs b/src/parser/grammar/items/mod.rs index 3612802e1..4afe2e418 100644 --- a/src/parser/grammar/items/mod.rs +++ b/src/parser/grammar/items/mod.rs @@ -81,7 +81,6 @@ fn item(p: &mut Parser) { CONST_ITEM } }, - // TODO: auto trait // test unsafe_trait // unsafe trait T {} UNSAFE_KW if la == TRAIT_KW => { @@ -89,7 +88,16 @@ fn item(p: &mut Parser) { traits::trait_item(p); TRAIT_ITEM } - // TODO: default impl + + // test unsafe_auto_trait + // unsafe auto trait T {} + UNSAFE_KW if p.at_kw(1, "auto") && p.nth(2) == TRAIT_KW => { + p.bump(); + p.bump_remap(AUTO_KW); + traits::trait_item(p); + TRAIT_ITEM + } + // test unsafe_impl // unsafe impl Foo {} UNSAFE_KW if la == IMPL_KW => { @@ -97,6 +105,16 @@ fn item(p: &mut Parser) { traits::impl_item(p); IMPL_ITEM } + + // test unsafe_default_impl + // unsafe default impl Foo {} + UNSAFE_KW if p.at_kw(1, "default") && p.nth(2) == IMPL_KW => { + p.bump(); + p.bump_remap(DEFAULT_KW); + traits::impl_item(p); + IMPL_ITEM + } + MOD_KW => { mod_item(p); MOD_ITEM diff --git a/src/parser/input.rs b/src/parser/input.rs index 162b9ef5f..2ad621166 100644 --- a/src/parser/input.rs +++ b/src/parser/input.rs @@ -46,9 +46,10 @@ impl<'t> ParserInput<'t> { if !(idx < self.tokens.len()) { return ""; } - let start_offset = self.start_offsets[idx]; - let end_offset = self.tokens[idx].len; - let range = TextRange::from_to(start_offset, end_offset); + let range = TextRange::from_len( + self.start_offsets[idx], + self.tokens[idx].len + ); &self.text[range] } } diff --git a/src/parser/parser.rs b/src/parser/parser.rs index bb775c4a5..7e1b22ee5 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -1,6 +1,6 @@ use super::Event; use super::input::{InputPosition, ParserInput}; -use SyntaxKind::{self, EOF, TOMBSTONE}; +use SyntaxKind::{self, EOF, TOMBSTONE, IDENT}; pub(crate) struct Marker { pos: u32, @@ -145,14 +145,31 @@ impl<'t> Parser<'t> { }); } + pub(crate) fn bump_remap(&mut self, kind: SyntaxKind) { + if self.current() == EOF { + // TODO: panic!? + return; + } + self.pos += 1; + self.event(Event::Token { + kind, + n_raw_tokens: 1, + }); + } + pub(crate) fn nth(&self, n: u32) -> SyntaxKind { self.inp.kind(self.pos + n) } + pub(crate) fn at_kw(&self, n: u32, t: &str) -> bool { + self.nth(n) == IDENT && self.inp.text(self.pos + n) == t + } + pub(crate) fn current(&self) -> SyntaxKind { self.nth(0) } + fn event(&mut self, event: Event) { self.events.push(event) } diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs index 22c615831..27bc1cafa 100644 --- a/src/syntax_kinds.rs +++ b/src/syntax_kinds.rs @@ -6,32 +6,6 @@ use tree::SyntaxInfo; /// The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT_DEF`. #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum SyntaxKind { - USE_KW, - FN_KW, - STRUCT_KW, - ENUM_KW, - TRAIT_KW, - IMPL_KW, - TRUE_KW, - FALSE_KW, - AS_KW, - EXTERN_KW, - CRATE_KW, - MOD_KW, - PUB_KW, - SELF_KW, - SUPER_KW, - IN_KW, - WHERE_KW, - FOR_KW, - LOOP_KW, - WHILE_KW, - IF_KW, - MATCH_KW, - CONST_KW, - STATIC_KW, - MUT_KW, - UNSAFE_KW, ERROR, IDENT, UNDERSCORE, @@ -83,6 +57,35 @@ pub enum SyntaxKind { COMMENT, DOC_COMMENT, SHEBANG, + USE_KW, + FN_KW, + STRUCT_KW, + ENUM_KW, + TRAIT_KW, + IMPL_KW, + TRUE_KW, + FALSE_KW, + AS_KW, + EXTERN_KW, + CRATE_KW, + MOD_KW, + PUB_KW, + SELF_KW, + SUPER_KW, + IN_KW, + WHERE_KW, + FOR_KW, + LOOP_KW, + WHILE_KW, + IF_KW, + MATCH_KW, + CONST_KW, + STATIC_KW, + MUT_KW, + UNSAFE_KW, + AUTO_KW, + DEFAULT_KW, + UNION_KW, FILE, STRUCT_ITEM, ENUM_ITEM, @@ -123,32 +126,6 @@ pub(crate) use self::SyntaxKind::*; impl SyntaxKind { pub(crate) fn info(self) -> &'static SyntaxInfo { match self { - USE_KW => &SyntaxInfo { name: "USE_KW" }, - FN_KW => &SyntaxInfo { name: "FN_KW" }, - STRUCT_KW => &SyntaxInfo { name: "STRUCT_KW" }, - ENUM_KW => &SyntaxInfo { name: "ENUM_KW" }, - TRAIT_KW => &SyntaxInfo { name: "TRAIT_KW" }, - IMPL_KW => &SyntaxInfo { name: "IMPL_KW" }, - TRUE_KW => &SyntaxInfo { name: "TRUE_KW" }, - FALSE_KW => &SyntaxInfo { name: "FALSE_KW" }, - AS_KW => &SyntaxInfo { name: "AS_KW" }, - EXTERN_KW => &SyntaxInfo { name: "EXTERN_KW" }, - CRATE_KW => &SyntaxInfo { name: "CRATE_KW" }, - MOD_KW => &SyntaxInfo { name: "MOD_KW" }, - PUB_KW => &SyntaxInfo { name: "PUB_KW" }, - SELF_KW => &SyntaxInfo { name: "SELF_KW" }, - SUPER_KW => &SyntaxInfo { name: "SUPER_KW" }, - IN_KW => &SyntaxInfo { name: "IN_KW" }, - WHERE_KW => &SyntaxInfo { name: "WHERE_KW" }, - FOR_KW => &SyntaxInfo { name: "FOR_KW" }, - LOOP_KW => &SyntaxInfo { name: "LOOP_KW" }, - WHILE_KW => &SyntaxInfo { name: "WHILE_KW" }, - IF_KW => &SyntaxInfo { name: "IF_KW" }, - MATCH_KW => &SyntaxInfo { name: "MATCH_KW" }, - CONST_KW => &SyntaxInfo { name: "CONST_KW" }, - STATIC_KW => &SyntaxInfo { name: "STATIC_KW" }, - MUT_KW => &SyntaxInfo { name: "MUT_KW" }, - UNSAFE_KW => &SyntaxInfo { name: "UNSAFE_KW" }, ERROR => &SyntaxInfo { name: "ERROR" }, IDENT => &SyntaxInfo { name: "IDENT" }, UNDERSCORE => &SyntaxInfo { name: "UNDERSCORE" }, @@ -200,6 +177,35 @@ impl SyntaxKind { COMMENT => &SyntaxInfo { name: "COMMENT" }, DOC_COMMENT => &SyntaxInfo { name: "DOC_COMMENT" }, SHEBANG => &SyntaxInfo { name: "SHEBANG" }, + USE_KW => &SyntaxInfo { name: "USE_KW" }, + FN_KW => &SyntaxInfo { name: "FN_KW" }, + STRUCT_KW => &SyntaxInfo { name: "STRUCT_KW" }, + ENUM_KW => &SyntaxInfo { name: "ENUM_KW" }, + TRAIT_KW => &SyntaxInfo { name: "TRAIT_KW" }, + IMPL_KW => &SyntaxInfo { name: "IMPL_KW" }, + TRUE_KW => &SyntaxInfo { name: "TRUE_KW" }, + FALSE_KW => &SyntaxInfo { name: "FALSE_KW" }, + AS_KW => &SyntaxInfo { name: "AS_KW" }, + EXTERN_KW => &SyntaxInfo { name: "EXTERN_KW" }, + CRATE_KW => &SyntaxInfo { name: "CRATE_KW" }, + MOD_KW => &SyntaxInfo { name: "MOD_KW" }, + PUB_KW => &SyntaxInfo { name: "PUB_KW" }, + SELF_KW => &SyntaxInfo { name: "SELF_KW" }, + SUPER_KW => &SyntaxInfo { name: "SUPER_KW" }, + IN_KW => &SyntaxInfo { name: "IN_KW" }, + WHERE_KW => &SyntaxInfo { name: "WHERE_KW" }, + FOR_KW => &SyntaxInfo { name: "FOR_KW" }, + LOOP_KW => &SyntaxInfo { name: "LOOP_KW" }, + WHILE_KW => &SyntaxInfo { name: "WHILE_KW" }, + IF_KW => &SyntaxInfo { name: "IF_KW" }, + MATCH_KW => &SyntaxInfo { name: "MATCH_KW" }, + CONST_KW => &SyntaxInfo { name: "CONST_KW" }, + STATIC_KW => &SyntaxInfo { name: "STATIC_KW" }, + MUT_KW => &SyntaxInfo { name: "MUT_KW" }, + UNSAFE_KW => &SyntaxInfo { name: "UNSAFE_KW" }, + AUTO_KW => &SyntaxInfo { name: "AUTO_KW" }, + DEFAULT_KW => &SyntaxInfo { name: "DEFAULT_KW" }, + UNION_KW => &SyntaxInfo { name: "UNION_KW" }, FILE => &SyntaxInfo { name: "FILE" }, STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" }, ENUM_ITEM => &SyntaxInfo { name: "ENUM_ITEM" }, diff --git a/tests/data/parser/inline/0009_unsafe_auto_trait.rs b/tests/data/parser/inline/0009_unsafe_auto_trait.rs new file mode 100644 index 000000000..03d29f324 --- /dev/null +++ b/tests/data/parser/inline/0009_unsafe_auto_trait.rs @@ -0,0 +1 @@ +unsafe auto trait T {} diff --git a/tests/data/parser/inline/0009_unsafe_auto_trait.txt b/tests/data/parser/inline/0009_unsafe_auto_trait.txt new file mode 100644 index 000000000..0a9a1e117 --- /dev/null +++ b/tests/data/parser/inline/0009_unsafe_auto_trait.txt @@ -0,0 +1,13 @@ +FILE@[0; 23) + TRAIT_ITEM@[0; 23) + UNSAFE_KW@[0; 6) + WHITESPACE@[6; 7) + AUTO_KW@[7; 11) + WHITESPACE@[11; 12) + TRAIT_KW@[12; 17) + WHITESPACE@[17; 18) + IDENT@[18; 19) "T" + WHITESPACE@[19; 20) + L_CURLY@[20; 21) + R_CURLY@[21; 22) + WHITESPACE@[22; 23) diff --git a/tests/data/parser/inline/0010_unsafe_default_impl.rs b/tests/data/parser/inline/0010_unsafe_default_impl.rs new file mode 100644 index 000000000..9cd6c57bd --- /dev/null +++ b/tests/data/parser/inline/0010_unsafe_default_impl.rs @@ -0,0 +1 @@ +unsafe default impl Foo {} diff --git a/tests/data/parser/inline/0010_unsafe_default_impl.txt b/tests/data/parser/inline/0010_unsafe_default_impl.txt new file mode 100644 index 000000000..7450381cb --- /dev/null +++ b/tests/data/parser/inline/0010_unsafe_default_impl.txt @@ -0,0 +1,13 @@ +FILE@[0; 27) + IMPL_ITEM@[0; 27) + UNSAFE_KW@[0; 6) + WHITESPACE@[6; 7) + DEFAULT_KW@[7; 14) + WHITESPACE@[14; 15) + IMPL_KW@[15; 19) + WHITESPACE@[19; 20) + IDENT@[20; 23) "Foo" + WHITESPACE@[23; 24) + L_CURLY@[24; 25) + R_CURLY@[25; 26) + WHITESPACE@[26; 27) diff --git a/tools/src/bin/gen.rs b/tools/src/bin/gen.rs index 17cdea7a1..c71e6da73 100644 --- a/tools/src/bin/gen.rs +++ b/tools/src/bin/gen.rs @@ -20,6 +20,7 @@ fn main() { #[derive(Deserialize)] struct Grammar { keywords: Vec, + contextual_keywords: Vec, tokens: Vec, nodes: Vec, } @@ -38,10 +39,9 @@ impl Grammar { acc.push_str("use tree::SyntaxInfo;\n"); acc.push_str("\n"); - let syntax_kinds: Vec = self.keywords - .iter() - .map(|kw| kw_token(kw)) - .chain(self.tokens.iter().cloned()) + let syntax_kinds: Vec =self.tokens.iter().cloned() + .chain(self.keywords.iter().map(|kw| kw_token(kw))) + .chain(self.contextual_keywords.iter().map(|kw| kw_token(kw))) .chain(self.nodes.iter().cloned()) .collect(); @@ -86,6 +86,7 @@ impl Grammar { // fn ident_to_keyword acc.push_str("pub(crate) fn ident_to_keyword(ident: &str) -> Option {\n"); acc.push_str(" match ident {\n"); + // NB: no contextual_keywords here! for kw in self.keywords.iter() { write!(acc, " {:?} => Some({}),\n", kw, kw_token(kw)).unwrap(); } -- cgit v1.2.3 From c119e8fd8b0106bb2e031e76ac1be89bd10a0674 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 4 Feb 2018 17:06:00 +0300 Subject: G: unsafe fn --- src/parser/grammar/items/mod.rs | 92 +++++++++++++++------- src/parser/parser.rs | 6 +- tests/data/parser/inline/0011_unsafe_fn.rs | 1 + tests/data/parser/inline/0011_unsafe_fn.txt | 13 +++ tests/data/parser/inline/0012_unsafe_extern_fn.rs | 1 + tests/data/parser/inline/0012_unsafe_extern_fn.txt | 18 +++++ .../data/parser/inline/0013_unsafe_block_in_mod.rs | 1 + .../parser/inline/0013_unsafe_block_in_mod.txt | 27 +++++++ 8 files changed, 128 insertions(+), 31 deletions(-) create mode 100644 tests/data/parser/inline/0011_unsafe_fn.rs create mode 100644 tests/data/parser/inline/0011_unsafe_fn.txt create mode 100644 tests/data/parser/inline/0012_unsafe_extern_fn.rs create mode 100644 tests/data/parser/inline/0012_unsafe_extern_fn.txt create mode 100644 tests/data/parser/inline/0013_unsafe_block_in_mod.rs create mode 100644 tests/data/parser/inline/0013_unsafe_block_in_mod.txt diff --git a/src/parser/grammar/items/mod.rs b/src/parser/grammar/items/mod.rs index 4afe2e418..588fca4c6 100644 --- a/src/parser/grammar/items/mod.rs +++ b/src/parser/grammar/items/mod.rs @@ -81,38 +81,74 @@ fn item(p: &mut Parser) { CONST_ITEM } }, - // test unsafe_trait - // unsafe trait T {} - UNSAFE_KW if la == TRAIT_KW => { + UNSAFE_KW => { p.bump(); - traits::trait_item(p); - TRAIT_ITEM - } + let la = p.nth(1); + match p.current() { + // test unsafe_trait + // unsafe trait T {} + TRAIT_KW => { + traits::trait_item(p); + TRAIT_ITEM + } - // test unsafe_auto_trait - // unsafe auto trait T {} - UNSAFE_KW if p.at_kw(1, "auto") && p.nth(2) == TRAIT_KW => { - p.bump(); - p.bump_remap(AUTO_KW); - traits::trait_item(p); - TRAIT_ITEM - } + // test unsafe_auto_trait + // unsafe auto trait T {} + IDENT if p.at_kw("auto") && la == TRAIT_KW => { + p.bump_remap(AUTO_KW); + traits::trait_item(p); + TRAIT_ITEM + } - // test unsafe_impl - // unsafe impl Foo {} - UNSAFE_KW if la == IMPL_KW => { - p.bump(); - traits::impl_item(p); - IMPL_ITEM - } + // test unsafe_impl + // unsafe impl Foo {} + IMPL_KW => { + traits::impl_item(p); + IMPL_ITEM + } - // test unsafe_default_impl - // unsafe default impl Foo {} - UNSAFE_KW if p.at_kw(1, "default") && p.nth(2) == IMPL_KW => { - p.bump(); - p.bump_remap(DEFAULT_KW); - traits::impl_item(p); - IMPL_ITEM + // test unsafe_default_impl + // unsafe default impl Foo {} + IDENT if p.at_kw("default") && la == IMPL_KW => { + p.bump_remap(DEFAULT_KW); + traits::impl_item(p); + IMPL_ITEM + } + + // test unsafe_extern_fn + // unsafe extern "C" fn foo() {} + EXTERN_KW => { + abi(p); + if !p.at(FN_KW) { + item.abandon(p); + p.error().message("expected function").emit(); + return + } + fn_item(p); + FN_ITEM + } + + // test unsafe_fn + // unsafe fn foo() {} + FN_KW => { + fn_item(p); + FN_ITEM + } + + t => { + item.abandon(p); + let message = "expected `trait`, `impl` or `fn`"; + + // test unsafe_block_in_mod + // fn foo(){} unsafe { } fn bar(){} + if t == L_CURLY { + error_block(p, message); + } else { + p.error().message(message).emit(); + } + return; + } + } } MOD_KW => { diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 7e1b22ee5..53a116fb7 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -1,6 +1,6 @@ use super::Event; use super::input::{InputPosition, ParserInput}; -use SyntaxKind::{self, EOF, TOMBSTONE, IDENT}; +use SyntaxKind::{self, EOF, TOMBSTONE}; pub(crate) struct Marker { pos: u32, @@ -161,8 +161,8 @@ impl<'t> Parser<'t> { self.inp.kind(self.pos + n) } - pub(crate) fn at_kw(&self, n: u32, t: &str) -> bool { - self.nth(n) == IDENT && self.inp.text(self.pos + n) == t + pub(crate) fn at_kw(&self, t: &str) -> bool { + self.inp.text(self.pos) == t } pub(crate) fn current(&self) -> SyntaxKind { diff --git a/tests/data/parser/inline/0011_unsafe_fn.rs b/tests/data/parser/inline/0011_unsafe_fn.rs new file mode 100644 index 000000000..33cfc4cd7 --- /dev/null +++ b/tests/data/parser/inline/0011_unsafe_fn.rs @@ -0,0 +1 @@ +unsafe fn foo() {} diff --git a/tests/data/parser/inline/0011_unsafe_fn.txt b/tests/data/parser/inline/0011_unsafe_fn.txt new file mode 100644 index 000000000..23eca1d65 --- /dev/null +++ b/tests/data/parser/inline/0011_unsafe_fn.txt @@ -0,0 +1,13 @@ +FILE@[0; 19) + FN_ITEM@[0; 19) + UNSAFE_KW@[0; 6) + WHITESPACE@[6; 7) + FN_KW@[7; 9) + WHITESPACE@[9; 10) + IDENT@[10; 13) "foo" + L_PAREN@[13; 14) + R_PAREN@[14; 15) + WHITESPACE@[15; 16) + L_CURLY@[16; 17) + R_CURLY@[17; 18) + WHITESPACE@[18; 19) diff --git a/tests/data/parser/inline/0012_unsafe_extern_fn.rs b/tests/data/parser/inline/0012_unsafe_extern_fn.rs new file mode 100644 index 000000000..1295c2cd2 --- /dev/null +++ b/tests/data/parser/inline/0012_unsafe_extern_fn.rs @@ -0,0 +1 @@ +unsafe extern "C" fn foo() {} diff --git a/tests/data/parser/inline/0012_unsafe_extern_fn.txt b/tests/data/parser/inline/0012_unsafe_extern_fn.txt new file mode 100644 index 000000000..547cb499d --- /dev/null +++ b/tests/data/parser/inline/0012_unsafe_extern_fn.txt @@ -0,0 +1,18 @@ +FILE@[0; 30) + FN_ITEM@[0; 30) + UNSAFE_KW@[0; 6) + ABI@[6; 18) + WHITESPACE@[6; 7) + EXTERN_KW@[7; 13) + WHITESPACE@[13; 14) + STRING@[14; 17) + WHITESPACE@[17; 18) + FN_KW@[18; 20) + WHITESPACE@[20; 21) + IDENT@[21; 24) "foo" + L_PAREN@[24; 25) + R_PAREN@[25; 26) + WHITESPACE@[26; 27) + L_CURLY@[27; 28) + R_CURLY@[28; 29) + WHITESPACE@[29; 30) diff --git a/tests/data/parser/inline/0013_unsafe_block_in_mod.rs b/tests/data/parser/inline/0013_unsafe_block_in_mod.rs new file mode 100644 index 000000000..26141e904 --- /dev/null +++ b/tests/data/parser/inline/0013_unsafe_block_in_mod.rs @@ -0,0 +1 @@ +fn foo(){} unsafe { } fn bar(){} diff --git a/tests/data/parser/inline/0013_unsafe_block_in_mod.txt b/tests/data/parser/inline/0013_unsafe_block_in_mod.txt new file mode 100644 index 000000000..2e319be73 --- /dev/null +++ b/tests/data/parser/inline/0013_unsafe_block_in_mod.txt @@ -0,0 +1,27 @@ +FILE@[0; 33) + FN_ITEM@[0; 11) + FN_KW@[0; 2) + WHITESPACE@[2; 3) + IDENT@[3; 6) "foo" + L_PAREN@[6; 7) + R_PAREN@[7; 8) + L_CURLY@[8; 9) + R_CURLY@[9; 10) + WHITESPACE@[10; 11) + UNSAFE_KW@[11; 17) + ERROR@[17; 22) + err: `expected `trait`, `impl` or `fn`` + WHITESPACE@[17; 18) + L_CURLY@[18; 19) + WHITESPACE@[19; 20) + R_CURLY@[20; 21) + WHITESPACE@[21; 22) + FN_ITEM@[22; 33) + FN_KW@[22; 24) + WHITESPACE@[24; 25) + IDENT@[25; 28) "bar" + L_PAREN@[28; 29) + R_PAREN@[29; 30) + L_CURLY@[30; 31) + R_CURLY@[31; 32) + WHITESPACE@[32; 33) -- cgit v1.2.3 From 351107d0b143e2c3497bd0f424f0d76bc51df0c0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 4 Feb 2018 17:06:43 +0300 Subject: Reformat --- src/parser/event.rs | 4 ++-- src/parser/grammar/items/mod.rs | 2 +- src/parser/input.rs | 5 +---- src/parser/parser.rs | 1 - tools/src/bin/gen.rs | 4 +++- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/parser/event.rs b/src/parser/event.rs index 64d751d63..e97350c89 100644 --- a/src/parser/event.rs +++ b/src/parser/event.rs @@ -1,4 +1,4 @@ -use {File, FileBuilder, Sink, SyntaxKind, Token, TextUnit}; +use {File, FileBuilder, Sink, SyntaxKind, TextUnit, Token}; use syntax_kinds::TOMBSTONE; use super::is_insignificant; @@ -139,7 +139,7 @@ pub(super) fn to_file(text: String, tokens: &[Token], events: Vec) -> Fil idx += 1; } builder.leaf(kind, len); - }, + } &Event::Error { ref message } => builder.error().message(message.clone()).emit(), } } diff --git a/src/parser/grammar/items/mod.rs b/src/parser/grammar/items/mod.rs index 588fca4c6..37f2ab132 100644 --- a/src/parser/grammar/items/mod.rs +++ b/src/parser/grammar/items/mod.rs @@ -122,7 +122,7 @@ fn item(p: &mut Parser) { if !p.at(FN_KW) { item.abandon(p); p.error().message("expected function").emit(); - return + return; } fn_item(p); FN_ITEM diff --git a/src/parser/input.rs b/src/parser/input.rs index 2ad621166..4d74ac1b1 100644 --- a/src/parser/input.rs +++ b/src/parser/input.rs @@ -46,10 +46,7 @@ impl<'t> ParserInput<'t> { if !(idx < self.tokens.len()) { return ""; } - let range = TextRange::from_len( - self.start_offsets[idx], - self.tokens[idx].len - ); + let range = TextRange::from_len(self.start_offsets[idx], self.tokens[idx].len); &self.text[range] } } diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 53a116fb7..752d532d0 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -169,7 +169,6 @@ impl<'t> Parser<'t> { self.nth(0) } - fn event(&mut self, event: Event) { self.events.push(event) } diff --git a/tools/src/bin/gen.rs b/tools/src/bin/gen.rs index c71e6da73..7cb164316 100644 --- a/tools/src/bin/gen.rs +++ b/tools/src/bin/gen.rs @@ -39,7 +39,9 @@ impl Grammar { acc.push_str("use tree::SyntaxInfo;\n"); acc.push_str("\n"); - let syntax_kinds: Vec =self.tokens.iter().cloned() + let syntax_kinds: Vec = self.tokens + .iter() + .cloned() .chain(self.keywords.iter().map(|kw| kw_token(kw))) .chain(self.contextual_keywords.iter().map(|kw| kw_token(kw))) .chain(self.nodes.iter().cloned()) -- cgit v1.2.3