From df6efe62c573c98bd0ea9eb137b4c8a5838f5a4a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 20 Feb 2019 14:53:19 +0300 Subject: [PATCH 1/8] make stuff private --- crates/ra_syntax/src/parser_impl.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ra_syntax/src/parser_impl.rs b/crates/ra_syntax/src/parser_impl.rs index d99615d72ee8..1f43aa9f9fe9 100644 --- a/crates/ra_syntax/src/parser_impl.rs +++ b/crates/ra_syntax/src/parser_impl.rs @@ -68,7 +68,7 @@ pub(crate) struct ParserImpl<'t> { } impl<'t> ParserImpl<'t> { - pub(crate) fn new(inp: &'t ParserInput<'t>) -> ParserImpl<'t> { + fn new(inp: &'t ParserInput<'t>) -> ParserImpl<'t> { ParserImpl { parser_input: inp, pos: InputPosition::new(), @@ -77,7 +77,7 @@ impl<'t> ParserImpl<'t> { } } - pub(crate) fn into_events(self) -> Vec { + fn into_events(self) -> Vec { assert_eq!(self.nth(0), EOF); self.events } From 9d0cda4bc84350961f3884e75a1c20e62c449ede Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 20 Feb 2019 15:03:31 +0300 Subject: [PATCH 2/8] slightly better name --- crates/ra_syntax/src/grammar/expressions.rs | 4 ++-- crates/ra_syntax/src/parser_api.rs | 24 ++++++++++++++------- crates/ra_syntax/src/parser_impl.rs | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/crates/ra_syntax/src/grammar/expressions.rs b/crates/ra_syntax/src/grammar/expressions.rs index 28fcb1f7d34a..d5a4f4d7b94b 100644 --- a/crates/ra_syntax/src/grammar/expressions.rs +++ b/crates/ra_syntax/src/grammar/expressions.rs @@ -138,7 +138,7 @@ enum Op { } fn current_op(p: &Parser) -> (u8, Op) { - if let Some(t) = p.next3() { + if let Some(t) = p.current3() { match t { (L_ANGLE, L_ANGLE, EQ) => return (1, Op::Composite(SHLEQ, 3)), (R_ANGLE, R_ANGLE, EQ) => return (1, Op::Composite(SHREQ, 3)), @@ -146,7 +146,7 @@ fn current_op(p: &Parser) -> (u8, Op) { } } - if let Some(t) = p.next2() { + if let Some(t) = p.current2() { match t { (PLUS, EQ) => return (1, Op::Composite(PLUSEQ, 2)), (MINUS, EQ) => return (1, Op::Composite(MINUSEQ, 2)), diff --git a/crates/ra_syntax/src/parser_api.rs b/crates/ra_syntax/src/parser_api.rs index 504df753e414..dc556190d8b6 100644 --- a/crates/ra_syntax/src/parser_api.rs +++ b/crates/ra_syntax/src/parser_api.rs @@ -25,6 +25,22 @@ impl<'t> Parser<'t> { self.nth(0) } + /// Returns the kinds of the current two tokens, if they are not separated + /// by trivia. + /// + /// Useful for parsing things like `>>`. + pub(crate) fn current2(&self) -> Option<(SyntaxKind, SyntaxKind)> { + self.0.current2() + } + + /// Returns the kinds of the current three tokens, if they are not separated + /// by trivia. + /// + /// Useful for parsing things like `=>>`. + pub(crate) fn current3(&self) -> Option<(SyntaxKind, SyntaxKind, SyntaxKind)> { + self.0.current3() + } + /// Lookahead operation: returns the kind of the next nth /// token. pub(crate) fn nth(&self, n: u32) -> SyntaxKind { @@ -41,14 +57,6 @@ impl<'t> Parser<'t> { kinds.contains(self.current()) } - pub(crate) fn next2(&self) -> Option<(SyntaxKind, SyntaxKind)> { - self.0.next2() - } - - pub(crate) fn next3(&self) -> Option<(SyntaxKind, SyntaxKind, SyntaxKind)> { - self.0.next3() - } - /// Checks if the current token is contextual keyword with text `t`. pub(crate) fn at_contextual_kw(&self, t: &str) -> bool { self.0.at_kw(t) diff --git a/crates/ra_syntax/src/parser_impl.rs b/crates/ra_syntax/src/parser_impl.rs index 1f43aa9f9fe9..01d156899f42 100644 --- a/crates/ra_syntax/src/parser_impl.rs +++ b/crates/ra_syntax/src/parser_impl.rs @@ -82,7 +82,7 @@ impl<'t> ParserImpl<'t> { self.events } - pub(super) fn next2(&self) -> Option<(SyntaxKind, SyntaxKind)> { + pub(super) fn current2(&self) -> Option<(SyntaxKind, SyntaxKind)> { let c1 = self.parser_input.kind(self.pos); let c2 = self.parser_input.kind(self.pos + 1); if self.parser_input.token_start_at(self.pos + 1) @@ -94,7 +94,7 @@ impl<'t> ParserImpl<'t> { } } - pub(super) fn next3(&self) -> Option<(SyntaxKind, SyntaxKind, SyntaxKind)> { + pub(super) fn current3(&self) -> Option<(SyntaxKind, SyntaxKind, SyntaxKind)> { let c1 = self.parser_input.kind(self.pos); let c2 = self.parser_input.kind(self.pos + 1); let c3 = self.parser_input.kind(self.pos + 2); From 5222b8aba3b1c2c68706aacf6869423a8e4fe6d5 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 20 Feb 2019 15:47:32 +0300 Subject: [PATCH 3/8] move all parsing related bits to a separate module --- crates/ra_syntax/src/lib.rs | 16 ++++--------- crates/ra_syntax/src/parsing.rs | 24 +++++++++++++++++++ .../src/{syntax_node => parsing}/builder.rs | 2 +- crates/ra_syntax/src/{ => parsing}/grammar.rs | 6 +++-- .../src/{ => parsing}/grammar/attributes.rs | 0 .../src/{ => parsing}/grammar/expressions.rs | 0 .../{ => parsing}/grammar/expressions/atom.rs | 0 .../src/{ => parsing}/grammar/items.rs | 0 .../src/{ => parsing}/grammar/items/consts.rs | 0 .../{ => parsing}/grammar/items/nominal.rs | 0 .../src/{ => parsing}/grammar/items/traits.rs | 0 .../{ => parsing}/grammar/items/use_item.rs | 0 .../src/{ => parsing}/grammar/params.rs | 0 .../src/{ => parsing}/grammar/paths.rs | 0 .../src/{ => parsing}/grammar/patterns.rs | 0 .../src/{ => parsing}/grammar/type_args.rs | 0 .../src/{ => parsing}/grammar/type_params.rs | 0 .../src/{ => parsing}/grammar/types.rs | 0 crates/ra_syntax/src/{ => parsing}/lexer.rs | 0 .../src/{ => parsing}/lexer/classes.rs | 0 .../src/{ => parsing}/lexer/comments.rs | 2 +- .../src/{ => parsing}/lexer/numbers.rs | 6 +++-- .../ra_syntax/src/{ => parsing}/lexer/ptr.rs | 0 .../src/{ => parsing}/lexer/strings.rs | 7 +++--- .../ra_syntax/src/{ => parsing}/parser_api.rs | 6 +++-- .../src/{ => parsing}/parser_impl.rs | 10 ++++---- .../src/{ => parsing}/parser_impl/event.rs | 9 ++++--- .../src/{ => parsing}/parser_impl/input.rs | 5 +++- .../ra_syntax/src/{ => parsing}/reparsing.rs | 22 ++++++++++------- .../ra_syntax/src/{ => parsing}/token_set.rs | 8 +++---- crates/ra_syntax/src/syntax_node.rs | 2 -- 31 files changed, 78 insertions(+), 47 deletions(-) create mode 100644 crates/ra_syntax/src/parsing.rs rename crates/ra_syntax/src/{syntax_node => parsing}/builder.rs (96%) rename crates/ra_syntax/src/{ => parsing}/grammar.rs (97%) rename crates/ra_syntax/src/{ => parsing}/grammar/attributes.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/expressions.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/expressions/atom.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/items.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/items/consts.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/items/nominal.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/items/traits.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/items/use_item.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/params.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/paths.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/patterns.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/type_args.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/type_params.rs (100%) rename crates/ra_syntax/src/{ => parsing}/grammar/types.rs (100%) rename crates/ra_syntax/src/{ => parsing}/lexer.rs (100%) rename crates/ra_syntax/src/{ => parsing}/lexer/classes.rs (100%) rename crates/ra_syntax/src/{ => parsing}/lexer/comments.rs (96%) rename crates/ra_syntax/src/{ => parsing}/lexer/numbers.rs (96%) rename crates/ra_syntax/src/{ => parsing}/lexer/ptr.rs (100%) rename crates/ra_syntax/src/{ => parsing}/lexer/strings.rs (97%) rename crates/ra_syntax/src/{ => parsing}/parser_api.rs (98%) rename crates/ra_syntax/src/{ => parsing}/parser_impl.rs (98%) rename crates/ra_syntax/src/{ => parsing}/parser_impl/event.rs (99%) rename crates/ra_syntax/src/{ => parsing}/parser_impl/input.rs (96%) rename crates/ra_syntax/src/{ => parsing}/reparsing.rs (95%) rename crates/ra_syntax/src/{ => parsing}/token_set.rs (74%) diff --git a/crates/ra_syntax/src/lib.rs b/crates/ra_syntax/src/lib.rs index cbba1d4aecd4..755ccd8e00ef 100644 --- a/crates/ra_syntax/src/lib.rs +++ b/crates/ra_syntax/src/lib.rs @@ -18,13 +18,7 @@ pub mod algo; pub mod ast; -mod lexer; -#[macro_use] -mod token_set; -mod grammar; -mod parser_api; -mod parser_impl; -mod reparsing; +mod parsing; mod string_lexing; mod syntax_kinds; /// Utilities for simple uses of the parser. @@ -36,10 +30,10 @@ mod ptr; pub use rowan::{SmolStr, TextRange, TextUnit}; pub use crate::{ ast::AstNode, - lexer::{tokenize, Token}, syntax_kinds::SyntaxKind, syntax_node::{Direction, SyntaxError, SyntaxNode, WalkEvent, Location, TreeArc}, ptr::{SyntaxNodePtr, AstPtr}, + parsing::{tokenize, Token}, }; use ra_text_edit::AtomTextEdit; @@ -59,9 +53,7 @@ impl SourceFile { } pub fn parse(text: &str) -> TreeArc { - let tokens = tokenize(&text); - let (green, errors) = - parser_impl::parse_with(syntax_node::GreenBuilder::new(), text, &tokens, grammar::root); + let (green, errors) = parsing::parse_text(text); SourceFile::new(green, errors) } @@ -70,7 +62,7 @@ impl SourceFile { } pub fn incremental_reparse(&self, edit: &AtomTextEdit) -> Option> { - reparsing::incremental_reparse(self.syntax(), edit, self.errors()) + parsing::incremental_reparse(self.syntax(), edit, self.errors()) .map(|(green_node, errors)| SourceFile::new(green_node, errors)) } diff --git a/crates/ra_syntax/src/parsing.rs b/crates/ra_syntax/src/parsing.rs new file mode 100644 index 000000000000..2c92d554eefc --- /dev/null +++ b/crates/ra_syntax/src/parsing.rs @@ -0,0 +1,24 @@ +#[macro_use] +mod token_set; +mod builder; +mod lexer; +mod parser_impl; +mod parser_api; +mod reparsing; +mod grammar; + +use crate::{ + parsing::builder::GreenBuilder, + syntax_node::{GreenNode, SyntaxError}, +}; + +pub use self::lexer::{tokenize, Token}; + +pub(crate) use self::reparsing::incremental_reparse; + +pub(crate) fn parse_text(text: &str) -> (GreenNode, Vec) { + let tokens = tokenize(&text); + let (green, errors) = + parser_impl::parse_with(GreenBuilder::new(), text, &tokens, grammar::root); + (green, errors) +} diff --git a/crates/ra_syntax/src/syntax_node/builder.rs b/crates/ra_syntax/src/parsing/builder.rs similarity index 96% rename from crates/ra_syntax/src/syntax_node/builder.rs rename to crates/ra_syntax/src/parsing/builder.rs index 8abd0f05141a..9d7ad06fee69 100644 --- a/crates/ra_syntax/src/syntax_node/builder.rs +++ b/crates/ra_syntax/src/parsing/builder.rs @@ -1,5 +1,5 @@ use crate::{ - parser_impl::Sink, + parsing::parser_impl::Sink, syntax_node::{GreenNode, RaTypes, SyntaxError}, SmolStr, SyntaxKind, }; diff --git a/crates/ra_syntax/src/grammar.rs b/crates/ra_syntax/src/parsing/grammar.rs similarity index 97% rename from crates/ra_syntax/src/grammar.rs rename to crates/ra_syntax/src/parsing/grammar.rs index 060c0ccdf48d..bf86443deb70 100644 --- a/crates/ra_syntax/src/grammar.rs +++ b/crates/ra_syntax/src/parsing/grammar.rs @@ -44,9 +44,11 @@ pub(crate) use self::{ }, }; use crate::{ - parser_api::{CompletedMarker, Marker, Parser}, - token_set::TokenSet, SyntaxKind::{self, *}, + parsing::{ + token_set::TokenSet, + parser_api::{CompletedMarker, Marker, Parser} + }, }; pub(crate) fn root(p: &mut Parser) { diff --git a/crates/ra_syntax/src/grammar/attributes.rs b/crates/ra_syntax/src/parsing/grammar/attributes.rs similarity index 100% rename from crates/ra_syntax/src/grammar/attributes.rs rename to crates/ra_syntax/src/parsing/grammar/attributes.rs diff --git a/crates/ra_syntax/src/grammar/expressions.rs b/crates/ra_syntax/src/parsing/grammar/expressions.rs similarity index 100% rename from crates/ra_syntax/src/grammar/expressions.rs rename to crates/ra_syntax/src/parsing/grammar/expressions.rs diff --git a/crates/ra_syntax/src/grammar/expressions/atom.rs b/crates/ra_syntax/src/parsing/grammar/expressions/atom.rs similarity index 100% rename from crates/ra_syntax/src/grammar/expressions/atom.rs rename to crates/ra_syntax/src/parsing/grammar/expressions/atom.rs diff --git a/crates/ra_syntax/src/grammar/items.rs b/crates/ra_syntax/src/parsing/grammar/items.rs similarity index 100% rename from crates/ra_syntax/src/grammar/items.rs rename to crates/ra_syntax/src/parsing/grammar/items.rs diff --git a/crates/ra_syntax/src/grammar/items/consts.rs b/crates/ra_syntax/src/parsing/grammar/items/consts.rs similarity index 100% rename from crates/ra_syntax/src/grammar/items/consts.rs rename to crates/ra_syntax/src/parsing/grammar/items/consts.rs diff --git a/crates/ra_syntax/src/grammar/items/nominal.rs b/crates/ra_syntax/src/parsing/grammar/items/nominal.rs similarity index 100% rename from crates/ra_syntax/src/grammar/items/nominal.rs rename to crates/ra_syntax/src/parsing/grammar/items/nominal.rs diff --git a/crates/ra_syntax/src/grammar/items/traits.rs b/crates/ra_syntax/src/parsing/grammar/items/traits.rs similarity index 100% rename from crates/ra_syntax/src/grammar/items/traits.rs rename to crates/ra_syntax/src/parsing/grammar/items/traits.rs diff --git a/crates/ra_syntax/src/grammar/items/use_item.rs b/crates/ra_syntax/src/parsing/grammar/items/use_item.rs similarity index 100% rename from crates/ra_syntax/src/grammar/items/use_item.rs rename to crates/ra_syntax/src/parsing/grammar/items/use_item.rs diff --git a/crates/ra_syntax/src/grammar/params.rs b/crates/ra_syntax/src/parsing/grammar/params.rs similarity index 100% rename from crates/ra_syntax/src/grammar/params.rs rename to crates/ra_syntax/src/parsing/grammar/params.rs diff --git a/crates/ra_syntax/src/grammar/paths.rs b/crates/ra_syntax/src/parsing/grammar/paths.rs similarity index 100% rename from crates/ra_syntax/src/grammar/paths.rs rename to crates/ra_syntax/src/parsing/grammar/paths.rs diff --git a/crates/ra_syntax/src/grammar/patterns.rs b/crates/ra_syntax/src/parsing/grammar/patterns.rs similarity index 100% rename from crates/ra_syntax/src/grammar/patterns.rs rename to crates/ra_syntax/src/parsing/grammar/patterns.rs diff --git a/crates/ra_syntax/src/grammar/type_args.rs b/crates/ra_syntax/src/parsing/grammar/type_args.rs similarity index 100% rename from crates/ra_syntax/src/grammar/type_args.rs rename to crates/ra_syntax/src/parsing/grammar/type_args.rs diff --git a/crates/ra_syntax/src/grammar/type_params.rs b/crates/ra_syntax/src/parsing/grammar/type_params.rs similarity index 100% rename from crates/ra_syntax/src/grammar/type_params.rs rename to crates/ra_syntax/src/parsing/grammar/type_params.rs diff --git a/crates/ra_syntax/src/grammar/types.rs b/crates/ra_syntax/src/parsing/grammar/types.rs similarity index 100% rename from crates/ra_syntax/src/grammar/types.rs rename to crates/ra_syntax/src/parsing/grammar/types.rs diff --git a/crates/ra_syntax/src/lexer.rs b/crates/ra_syntax/src/parsing/lexer.rs similarity index 100% rename from crates/ra_syntax/src/lexer.rs rename to crates/ra_syntax/src/parsing/lexer.rs diff --git a/crates/ra_syntax/src/lexer/classes.rs b/crates/ra_syntax/src/parsing/lexer/classes.rs similarity index 100% rename from crates/ra_syntax/src/lexer/classes.rs rename to crates/ra_syntax/src/parsing/lexer/classes.rs diff --git a/crates/ra_syntax/src/lexer/comments.rs b/crates/ra_syntax/src/parsing/lexer/comments.rs similarity index 96% rename from crates/ra_syntax/src/lexer/comments.rs rename to crates/ra_syntax/src/parsing/lexer/comments.rs index afe6886a1fac..8bbbe659b35e 100644 --- a/crates/ra_syntax/src/lexer/comments.rs +++ b/crates/ra_syntax/src/parsing/lexer/comments.rs @@ -1,4 +1,4 @@ -use crate::lexer::ptr::Ptr; +use crate::parsing::lexer::ptr::Ptr; use crate::SyntaxKind::{self, *}; diff --git a/crates/ra_syntax/src/lexer/numbers.rs b/crates/ra_syntax/src/parsing/lexer/numbers.rs similarity index 96% rename from crates/ra_syntax/src/lexer/numbers.rs rename to crates/ra_syntax/src/parsing/lexer/numbers.rs index 46daf5e52682..7f6abe1d5c31 100644 --- a/crates/ra_syntax/src/lexer/numbers.rs +++ b/crates/ra_syntax/src/parsing/lexer/numbers.rs @@ -1,5 +1,7 @@ -use crate::lexer::classes::*; -use crate::lexer::ptr::Ptr; +use crate::parsing::lexer::{ + ptr::Ptr, + classes::*, +}; use crate::SyntaxKind::{self, *}; diff --git a/crates/ra_syntax/src/lexer/ptr.rs b/crates/ra_syntax/src/parsing/lexer/ptr.rs similarity index 100% rename from crates/ra_syntax/src/lexer/ptr.rs rename to crates/ra_syntax/src/parsing/lexer/ptr.rs diff --git a/crates/ra_syntax/src/lexer/strings.rs b/crates/ra_syntax/src/parsing/lexer/strings.rs similarity index 97% rename from crates/ra_syntax/src/lexer/strings.rs rename to crates/ra_syntax/src/parsing/lexer/strings.rs index 5c1cf3e9c05c..f74acff9e21b 100644 --- a/crates/ra_syntax/src/lexer/strings.rs +++ b/crates/ra_syntax/src/parsing/lexer/strings.rs @@ -1,6 +1,7 @@ -use crate::SyntaxKind::{self, *}; - -use crate::lexer::ptr::Ptr; +use crate::{ + parsing::lexer::ptr::Ptr, + SyntaxKind::{self, *}, +}; pub(crate) fn is_string_literal_start(c: char, c1: Option, c2: Option) -> bool { match (c, c1, c2) { diff --git a/crates/ra_syntax/src/parser_api.rs b/crates/ra_syntax/src/parsing/parser_api.rs similarity index 98% rename from crates/ra_syntax/src/parser_api.rs rename to crates/ra_syntax/src/parsing/parser_api.rs index dc556190d8b6..781c407debb0 100644 --- a/crates/ra_syntax/src/parser_api.rs +++ b/crates/ra_syntax/src/parsing/parser_api.rs @@ -1,9 +1,11 @@ use drop_bomb::DropBomb; use crate::{ - parser_impl::ParserImpl, - token_set::TokenSet, SyntaxKind::{self, ERROR}, + parsing::{ + token_set::TokenSet, + parser_impl::ParserImpl + }, }; /// `Parser` struct provides the low-level API for diff --git a/crates/ra_syntax/src/parser_impl.rs b/crates/ra_syntax/src/parsing/parser_impl.rs similarity index 98% rename from crates/ra_syntax/src/parser_impl.rs rename to crates/ra_syntax/src/parsing/parser_impl.rs index 01d156899f42..c639d83e83b2 100644 --- a/crates/ra_syntax/src/parser_impl.rs +++ b/crates/ra_syntax/src/parsing/parser_impl.rs @@ -4,18 +4,16 @@ mod input; use std::cell::Cell; use crate::{ + SmolStr, + syntax_node::syntax_error::{ParseError, SyntaxError}, + parsing::{ lexer::Token, parser_api::Parser, parser_impl::{ event::{Event, EventProcessor}, input::{InputPosition, ParserInput}, }, - SmolStr, - syntax_node::syntax_error::{ - ParseError, - SyntaxError, - }, -}; +}}; use crate::SyntaxKind::{self, EOF, TOMBSTONE}; diff --git a/crates/ra_syntax/src/parser_impl/event.rs b/crates/ra_syntax/src/parsing/parser_impl/event.rs similarity index 99% rename from crates/ra_syntax/src/parser_impl/event.rs rename to crates/ra_syntax/src/parsing/parser_impl/event.rs index b45830c619ba..fb43e19cc6dd 100644 --- a/crates/ra_syntax/src/parser_impl/event.rs +++ b/crates/ra_syntax/src/parsing/parser_impl/event.rs @@ -7,9 +7,9 @@ //! tree builder: the parser produces a stream of events like //! `start node`, `finish node`, and `FileBuilder` converts //! this stream to a real tree. +use std::mem; + use crate::{ - lexer::Token, - parser_impl::Sink, SmolStr, SyntaxKind::{self, *}, TextRange, TextUnit, @@ -18,8 +18,11 @@ use crate::{ SyntaxError, SyntaxErrorKind, }, + parsing::{ + lexer::Token, + parser_impl::Sink, + }, }; -use std::mem; /// `Parser` produces a flat list of `Event`s. /// They are converted to a tree-structure in diff --git a/crates/ra_syntax/src/parser_impl/input.rs b/crates/ra_syntax/src/parsing/parser_impl/input.rs similarity index 96% rename from crates/ra_syntax/src/parser_impl/input.rs rename to crates/ra_syntax/src/parsing/parser_impl/input.rs index 616a26fdc83d..275d949189aa 100644 --- a/crates/ra_syntax/src/parser_impl/input.rs +++ b/crates/ra_syntax/src/parsing/parser_impl/input.rs @@ -1,4 +1,7 @@ -use crate::{lexer::Token, SyntaxKind, SyntaxKind::EOF, TextRange, TextUnit}; +use crate::{ + SyntaxKind, SyntaxKind::EOF, TextRange, TextUnit, + parsing::lexer::Token, +}; use std::ops::{Add, AddAssign}; diff --git a/crates/ra_syntax/src/reparsing.rs b/crates/ra_syntax/src/parsing/reparsing.rs similarity index 95% rename from crates/ra_syntax/src/reparsing.rs rename to crates/ra_syntax/src/parsing/reparsing.rs index dd751465ce0c..994e7e212b2a 100644 --- a/crates/ra_syntax/src/reparsing.rs +++ b/crates/ra_syntax/src/parsing/reparsing.rs @@ -1,10 +1,16 @@ -use crate::algo; -use crate::grammar; -use crate::lexer::{tokenize, Token}; -use crate::parser_api::Parser; -use crate::parser_impl; -use crate::syntax_node::{self, GreenNode, SyntaxError, SyntaxNode}; -use crate::{SyntaxKind::*, TextRange, TextUnit}; +use crate::{ + SyntaxKind::*, TextRange, TextUnit, + algo, + syntax_node::{GreenNode, SyntaxError, SyntaxNode}, + parsing::{ + grammar, + parser_impl, + builder::GreenBuilder, + parser_api::Parser, + lexer::{tokenize, Token}, + } +}; + use ra_text_edit::AtomTextEdit; pub(crate) fn incremental_reparse( @@ -56,7 +62,7 @@ fn reparse_block<'node>( return None; } let (green, new_errors) = - parser_impl::parse_with(syntax_node::GreenBuilder::new(), &text, &tokens, reparser); + parser_impl::parse_with(GreenBuilder::new(), &text, &tokens, reparser); Some((node, green, new_errors)) } diff --git a/crates/ra_syntax/src/token_set.rs b/crates/ra_syntax/src/parsing/token_set.rs similarity index 74% rename from crates/ra_syntax/src/token_set.rs rename to crates/ra_syntax/src/parsing/token_set.rs index b3fe633e013e..5719fe5a21e0 100644 --- a/crates/ra_syntax/src/token_set.rs +++ b/crates/ra_syntax/src/parsing/token_set.rs @@ -4,19 +4,19 @@ use crate::SyntaxKind; pub(crate) struct TokenSet(u128); impl TokenSet { - pub const fn empty() -> TokenSet { + pub(crate) const fn empty() -> TokenSet { TokenSet(0) } - pub const fn singleton(kind: SyntaxKind) -> TokenSet { + pub(crate) const fn singleton(kind: SyntaxKind) -> TokenSet { TokenSet(mask(kind)) } - pub const fn union(self, other: TokenSet) -> TokenSet { + pub(crate) const fn union(self, other: TokenSet) -> TokenSet { TokenSet(self.0 | other.0) } - pub fn contains(&self, kind: SyntaxKind) -> bool { + pub(crate) fn contains(&self, kind: SyntaxKind) -> bool { self.0 & mask(kind) != 0 } } diff --git a/crates/ra_syntax/src/syntax_node.rs b/crates/ra_syntax/src/syntax_node.rs index ed48739f8ad1..a0d7c32ecc84 100644 --- a/crates/ra_syntax/src/syntax_node.rs +++ b/crates/ra_syntax/src/syntax_node.rs @@ -1,4 +1,3 @@ -mod builder; pub mod syntax_error; mod syntax_text; @@ -8,7 +7,6 @@ use self::syntax_text::SyntaxText; use crate::{SmolStr, SyntaxKind, TextRange}; use rowan::{Types, TransparentNewType}; -pub(crate) use self::builder::GreenBuilder; pub use self::syntax_error::{SyntaxError, SyntaxErrorKind, Location}; pub use rowan::WalkEvent; From 5a6eda528c56814347a1fa0e3eef1e919089bf0a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 20 Feb 2019 15:57:26 +0300 Subject: [PATCH 4/8] tighten visibility --- crates/ra_syntax/src/parsing/parser_impl.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/ra_syntax/src/parsing/parser_impl.rs b/crates/ra_syntax/src/parsing/parser_impl.rs index c639d83e83b2..b710e9d5d67e 100644 --- a/crates/ra_syntax/src/parsing/parser_impl.rs +++ b/crates/ra_syntax/src/parsing/parser_impl.rs @@ -17,7 +17,7 @@ use crate::{ use crate::SyntaxKind::{self, EOF, TOMBSTONE}; -pub(crate) trait Sink { +pub(super) trait Sink { type Tree; /// Adds new leaf to the current branch. @@ -39,7 +39,7 @@ pub(crate) trait Sink { } /// Parse a sequence of tokens into the representative node tree -pub(crate) fn parse_with( +pub(super) fn parse_with( sink: S, text: &str, tokens: &[Token], @@ -58,7 +58,7 @@ pub(crate) fn parse_with( /// Implementation details of `Parser`, extracted /// to a separate struct in order not to pollute /// the public API of the `Parser`. -pub(crate) struct ParserImpl<'t> { +pub(super) struct ParserImpl<'t> { parser_input: &'t ParserInput<'t>, pos: InputPosition, events: Vec, From 9f6883fbf10567e4177dbe77857c970b6dc61f48 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 20 Feb 2019 16:02:06 +0300 Subject: [PATCH 5/8] move reparsers to grammar --- crates/ra_syntax/src/parsing/grammar.rs | 34 +++++++++++++++++------ crates/ra_syntax/src/parsing/reparsing.rs | 26 +---------------- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/crates/ra_syntax/src/parsing/grammar.rs b/crates/ra_syntax/src/parsing/grammar.rs index bf86443deb70..bcdcd9f57863 100644 --- a/crates/ra_syntax/src/parsing/grammar.rs +++ b/crates/ra_syntax/src/parsing/grammar.rs @@ -36,14 +36,8 @@ mod type_args; mod type_params; mod types; -pub(crate) use self::{ - expressions::block, - items::{ - enum_variant_list, extern_item_list, impl_item_list, match_arm_list, mod_item_list, - named_field_def_list, named_field_list, token_tree, trait_item_list, use_tree_list, - }, -}; use crate::{ + SyntaxNode, SyntaxKind::{self, *}, parsing::{ token_set::TokenSet, @@ -51,13 +45,37 @@ use crate::{ }, }; -pub(crate) fn root(p: &mut Parser) { +pub(super) fn root(p: &mut Parser) { let m = p.start(); p.eat(SHEBANG); items::mod_contents(p, false); m.complete(p, SOURCE_FILE); } +pub(super) fn reparser(node: &SyntaxNode) -> Option { + let res = match node.kind() { + BLOCK => expressions::block, + NAMED_FIELD_DEF_LIST => items::named_field_def_list, + NAMED_FIELD_LIST => items::named_field_list, + ENUM_VARIANT_LIST => items::enum_variant_list, + MATCH_ARM_LIST => items::match_arm_list, + USE_TREE_LIST => items::use_tree_list, + EXTERN_ITEM_LIST => items::extern_item_list, + TOKEN_TREE if node.first_child().unwrap().kind() == L_CURLY => items::token_tree, + ITEM_LIST => { + let parent = node.parent().unwrap(); + match parent.kind() { + IMPL_BLOCK => items::impl_item_list, + TRAIT_DEF => items::trait_item_list, + MODULE => items::mod_item_list, + _ => return None, + } + } + _ => return None, + }; + Some(res) +} + #[derive(Clone, Copy, PartialEq, Eq)] enum BlockLike { Block, diff --git a/crates/ra_syntax/src/parsing/reparsing.rs b/crates/ra_syntax/src/parsing/reparsing.rs index 994e7e212b2a..0a24dae0ea0d 100644 --- a/crates/ra_syntax/src/parsing/reparsing.rs +++ b/crates/ra_syntax/src/parsing/reparsing.rs @@ -81,31 +81,7 @@ fn is_contextual_kw(text: &str) -> bool { type ParseFn = fn(&mut Parser); fn find_reparsable_node(node: &SyntaxNode, range: TextRange) -> Option<(&SyntaxNode, ParseFn)> { let node = algo::find_covering_node(node, range); - return node.ancestors().filter_map(|node| reparser(node).map(|r| (node, r))).next(); - - fn reparser(node: &SyntaxNode) -> Option { - let res = match node.kind() { - BLOCK => grammar::block, - NAMED_FIELD_DEF_LIST => grammar::named_field_def_list, - NAMED_FIELD_LIST => grammar::named_field_list, - ENUM_VARIANT_LIST => grammar::enum_variant_list, - MATCH_ARM_LIST => grammar::match_arm_list, - USE_TREE_LIST => grammar::use_tree_list, - EXTERN_ITEM_LIST => grammar::extern_item_list, - TOKEN_TREE if node.first_child().unwrap().kind() == L_CURLY => grammar::token_tree, - ITEM_LIST => { - let parent = node.parent().unwrap(); - match parent.kind() { - IMPL_BLOCK => grammar::impl_item_list, - TRAIT_DEF => grammar::trait_item_list, - MODULE => grammar::mod_item_list, - _ => return None, - } - } - _ => return None, - }; - Some(res) - } + node.ancestors().find_map(grammar::reparser).map(|r| (node, r)) } fn is_balanced(tokens: &[Token]) -> bool { From a4a1e08ab81193112a2e14413d084916241c3fca Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 20 Feb 2019 16:16:14 +0300 Subject: [PATCH 6/8] flatten modules --- crates/ra_syntax/src/lib.rs | 6 +++++- crates/ra_syntax/src/parsing.rs | 3 ++- crates/ra_syntax/src/parsing/builder.rs | 5 +++-- crates/ra_syntax/src/parsing/parser_impl.rs | 15 ++++++++------- crates/ra_syntax/src/parsing/parser_impl/event.rs | 2 +- crates/ra_syntax/src/parsing/reparsing.rs | 3 ++- .../src/{syntax_node => }/syntax_error.rs | 0 crates/ra_syntax/src/syntax_node.rs | 11 +++++------ .../src/{syntax_node => }/syntax_text.rs | 0 crates/ra_syntax/src/validation.rs | 2 +- crates/ra_syntax/src/validation/block.rs | 6 ++---- crates/ra_syntax/src/validation/byte.rs | 6 ++---- crates/ra_syntax/src/validation/byte_string.rs | 6 ++---- crates/ra_syntax/src/validation/char.rs | 6 ++---- crates/ra_syntax/src/validation/string.rs | 6 ++---- 15 files changed, 37 insertions(+), 40 deletions(-) rename crates/ra_syntax/src/{syntax_node => }/syntax_error.rs (100%) rename crates/ra_syntax/src/{syntax_node => }/syntax_text.rs (100%) diff --git a/crates/ra_syntax/src/lib.rs b/crates/ra_syntax/src/lib.rs index 755ccd8e00ef..edd5b4a28a38 100644 --- a/crates/ra_syntax/src/lib.rs +++ b/crates/ra_syntax/src/lib.rs @@ -26,12 +26,16 @@ pub mod utils; mod validation; mod syntax_node; mod ptr; +mod syntax_error; +mod syntax_text; pub use rowan::{SmolStr, TextRange, TextUnit}; pub use crate::{ ast::AstNode, syntax_kinds::SyntaxKind, - syntax_node::{Direction, SyntaxError, SyntaxNode, WalkEvent, Location, TreeArc}, + syntax_error::{SyntaxError, SyntaxErrorKind, Location}, + syntax_text::SyntaxText, + syntax_node::{Direction, SyntaxNode, WalkEvent, TreeArc}, ptr::{SyntaxNodePtr, AstPtr}, parsing::{tokenize, Token}, }; diff --git a/crates/ra_syntax/src/parsing.rs b/crates/ra_syntax/src/parsing.rs index 2c92d554eefc..023e1031cd9f 100644 --- a/crates/ra_syntax/src/parsing.rs +++ b/crates/ra_syntax/src/parsing.rs @@ -8,8 +8,9 @@ mod reparsing; mod grammar; use crate::{ + SyntaxError, parsing::builder::GreenBuilder, - syntax_node::{GreenNode, SyntaxError}, + syntax_node::GreenNode, }; pub use self::lexer::{tokenize, Token}; diff --git a/crates/ra_syntax/src/parsing/builder.rs b/crates/ra_syntax/src/parsing/builder.rs index 9d7ad06fee69..9090c60c2ea6 100644 --- a/crates/ra_syntax/src/parsing/builder.rs +++ b/crates/ra_syntax/src/parsing/builder.rs @@ -1,8 +1,9 @@ use crate::{ parsing::parser_impl::Sink, - syntax_node::{GreenNode, RaTypes, SyntaxError}, - SmolStr, SyntaxKind, + syntax_node::{GreenNode, RaTypes}, + SmolStr, SyntaxKind, SyntaxError, }; + use rowan::GreenNodeBuilder; pub(crate) struct GreenBuilder { diff --git a/crates/ra_syntax/src/parsing/parser_impl.rs b/crates/ra_syntax/src/parsing/parser_impl.rs index b710e9d5d67e..8cce1ab01ce1 100644 --- a/crates/ra_syntax/src/parsing/parser_impl.rs +++ b/crates/ra_syntax/src/parsing/parser_impl.rs @@ -5,15 +5,16 @@ use std::cell::Cell; use crate::{ SmolStr, - syntax_node::syntax_error::{ParseError, SyntaxError}, + syntax_error::{ParseError, SyntaxError}, parsing::{ - lexer::Token, - parser_api::Parser, - parser_impl::{ - event::{Event, EventProcessor}, - input::{InputPosition, ParserInput}, + lexer::Token, + parser_api::Parser, + parser_impl::{ + event::{Event, EventProcessor}, + input::{InputPosition, ParserInput}, + }, }, -}}; +}; use crate::SyntaxKind::{self, EOF, TOMBSTONE}; diff --git a/crates/ra_syntax/src/parsing/parser_impl/event.rs b/crates/ra_syntax/src/parsing/parser_impl/event.rs index fb43e19cc6dd..2ddbdd34d229 100644 --- a/crates/ra_syntax/src/parsing/parser_impl/event.rs +++ b/crates/ra_syntax/src/parsing/parser_impl/event.rs @@ -13,7 +13,7 @@ use crate::{ SmolStr, SyntaxKind::{self, *}, TextRange, TextUnit, - syntax_node::syntax_error::{ + syntax_error::{ ParseError, SyntaxError, SyntaxErrorKind, diff --git a/crates/ra_syntax/src/parsing/reparsing.rs b/crates/ra_syntax/src/parsing/reparsing.rs index 0a24dae0ea0d..a88f53dae015 100644 --- a/crates/ra_syntax/src/parsing/reparsing.rs +++ b/crates/ra_syntax/src/parsing/reparsing.rs @@ -1,7 +1,8 @@ use crate::{ SyntaxKind::*, TextRange, TextUnit, algo, - syntax_node::{GreenNode, SyntaxError, SyntaxNode}, + syntax_node::{GreenNode, SyntaxNode}, + syntax_error::SyntaxError, parsing::{ grammar, parser_impl, diff --git a/crates/ra_syntax/src/syntax_node/syntax_error.rs b/crates/ra_syntax/src/syntax_error.rs similarity index 100% rename from crates/ra_syntax/src/syntax_node/syntax_error.rs rename to crates/ra_syntax/src/syntax_error.rs diff --git a/crates/ra_syntax/src/syntax_node.rs b/crates/ra_syntax/src/syntax_node.rs index a0d7c32ecc84..aa627398d2aa 100644 --- a/crates/ra_syntax/src/syntax_node.rs +++ b/crates/ra_syntax/src/syntax_node.rs @@ -1,13 +1,12 @@ -pub mod syntax_error; -mod syntax_text; - use std::{fmt, borrow::Borrow}; -use self::syntax_text::SyntaxText; -use crate::{SmolStr, SyntaxKind, TextRange}; use rowan::{Types, TransparentNewType}; -pub use self::syntax_error::{SyntaxError, SyntaxErrorKind, Location}; +use crate::{ + SmolStr, SyntaxKind, TextRange, SyntaxText, + syntax_error::SyntaxError, +}; + pub use rowan::WalkEvent; #[derive(Debug, Clone, Copy)] diff --git a/crates/ra_syntax/src/syntax_node/syntax_text.rs b/crates/ra_syntax/src/syntax_text.rs similarity index 100% rename from crates/ra_syntax/src/syntax_node/syntax_text.rs rename to crates/ra_syntax/src/syntax_text.rs diff --git a/crates/ra_syntax/src/validation.rs b/crates/ra_syntax/src/validation.rs index 10672d6bf30f..69958f0d74fc 100644 --- a/crates/ra_syntax/src/validation.rs +++ b/crates/ra_syntax/src/validation.rs @@ -5,7 +5,7 @@ mod string; mod block; use crate::{ - SourceFile, syntax_node::SyntaxError, AstNode, + SourceFile, SyntaxError, AstNode, ast, algo::visit::{visitor_ctx, VisitorCtx}, }; diff --git a/crates/ra_syntax/src/validation/block.rs b/crates/ra_syntax/src/validation/block.rs index de949d967e98..f2cf3cbbd886 100644 --- a/crates/ra_syntax/src/validation/block.rs +++ b/crates/ra_syntax/src/validation/block.rs @@ -1,9 +1,7 @@ use crate::{SyntaxKind::*, ast::{self, AttrsOwner, AstNode}, - syntax_node::{ - SyntaxError, - SyntaxErrorKind::*, - }, + SyntaxError, + SyntaxErrorKind::*, }; pub(crate) fn validate_block_node(node: &ast::Block, errors: &mut Vec) { diff --git a/crates/ra_syntax/src/validation/byte.rs b/crates/ra_syntax/src/validation/byte.rs index acdc12552e42..838e7a65fd5b 100644 --- a/crates/ra_syntax/src/validation/byte.rs +++ b/crates/ra_syntax/src/validation/byte.rs @@ -5,10 +5,8 @@ use crate::{ string_lexing::{self, StringComponentKind}, TextRange, validation::char, - syntax_node::{ - SyntaxError, - SyntaxErrorKind::*, - }, + SyntaxError, + SyntaxErrorKind::*, }; pub(super) fn validate_byte_node(node: &ast::Byte, errors: &mut Vec) { diff --git a/crates/ra_syntax/src/validation/byte_string.rs b/crates/ra_syntax/src/validation/byte_string.rs index 69a98b640f37..64c7054a15f8 100644 --- a/crates/ra_syntax/src/validation/byte_string.rs +++ b/crates/ra_syntax/src/validation/byte_string.rs @@ -1,10 +1,8 @@ use crate::{ ast::{self, AstNode, AstToken}, string_lexing::{self, StringComponentKind}, - syntax_node::{ - SyntaxError, - SyntaxErrorKind::*, - }, + SyntaxError, + SyntaxErrorKind::*, }; use super::byte; diff --git a/crates/ra_syntax/src/validation/char.rs b/crates/ra_syntax/src/validation/char.rs index 26c15e36d232..3169ed5903a8 100644 --- a/crates/ra_syntax/src/validation/char.rs +++ b/crates/ra_syntax/src/validation/char.rs @@ -8,10 +8,8 @@ use crate::{ ast::{self, AstNode, AstToken}, string_lexing::{self, StringComponentKind}, TextRange, - syntax_node::{ - SyntaxError, - SyntaxErrorKind::*, - }, + SyntaxError, + SyntaxErrorKind::*, }; pub(super) fn validate_char_node(node: &ast::Char, errors: &mut Vec) { diff --git a/crates/ra_syntax/src/validation/string.rs b/crates/ra_syntax/src/validation/string.rs index 2f7f9c7c49a4..d857d088c802 100644 --- a/crates/ra_syntax/src/validation/string.rs +++ b/crates/ra_syntax/src/validation/string.rs @@ -1,10 +1,8 @@ use crate::{ ast::{self, AstNode, AstToken}, string_lexing, - syntax_node::{ - SyntaxError, - SyntaxErrorKind::*, - }, + SyntaxError, + SyntaxErrorKind::*, }; use super::char; From 45fc91cc470fa91d5b8905fea2cab4d42bbe72b3 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 20 Feb 2019 16:24:39 +0300 Subject: [PATCH 7/8] rearrange modules in a suggestd reading order --- crates/ra_syntax/src/lib.rs | 17 +++++++++-------- crates/ra_syntax/src/parsing.rs | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/crates/ra_syntax/src/lib.rs b/crates/ra_syntax/src/lib.rs index edd5b4a28a38..b12282b3949e 100644 --- a/crates/ra_syntax/src/lib.rs +++ b/crates/ra_syntax/src/lib.rs @@ -16,18 +16,19 @@ #![allow(missing_docs)] //#![warn(unreachable_pub)] // rust-lang/rust#47816 -pub mod algo; -pub mod ast; +mod syntax_kinds; +mod syntax_node; +mod syntax_text; +mod syntax_error; mod parsing; mod string_lexing; -mod syntax_kinds; +mod validation; +mod ptr; + +pub mod algo; +pub mod ast; /// Utilities for simple uses of the parser. pub mod utils; -mod validation; -mod syntax_node; -mod ptr; -mod syntax_error; -mod syntax_text; pub use rowan::{SmolStr, TextRange, TextUnit}; pub use crate::{ diff --git a/crates/ra_syntax/src/parsing.rs b/crates/ra_syntax/src/parsing.rs index 023e1031cd9f..761accd7be44 100644 --- a/crates/ra_syntax/src/parsing.rs +++ b/crates/ra_syntax/src/parsing.rs @@ -4,8 +4,8 @@ mod builder; mod lexer; mod parser_impl; mod parser_api; -mod reparsing; mod grammar; +mod reparsing; use crate::{ SyntaxError, From 86a67dce25f11ba9803a5727f77c02fd1f49e2c0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 20 Feb 2019 16:48:06 +0300 Subject: [PATCH 8/8] fix tests --- crates/ra_syntax/src/parsing/reparsing.rs | 8 +++++--- crates/ra_syntax/src/syntax_kinds.rs | 3 ++- crates/tools/src/lib.rs | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/crates/ra_syntax/src/parsing/reparsing.rs b/crates/ra_syntax/src/parsing/reparsing.rs index a88f53dae015..edf3fa2910b4 100644 --- a/crates/ra_syntax/src/parsing/reparsing.rs +++ b/crates/ra_syntax/src/parsing/reparsing.rs @@ -79,10 +79,12 @@ fn is_contextual_kw(text: &str) -> bool { } } -type ParseFn = fn(&mut Parser); -fn find_reparsable_node(node: &SyntaxNode, range: TextRange) -> Option<(&SyntaxNode, ParseFn)> { +fn find_reparsable_node( + node: &SyntaxNode, + range: TextRange, +) -> Option<(&SyntaxNode, fn(&mut Parser))> { let node = algo::find_covering_node(node, range); - node.ancestors().find_map(grammar::reparser).map(|r| (node, r)) + node.ancestors().find_map(|node| grammar::reparser(node).map(|r| (node, r))) } fn is_balanced(tokens: &[Token]) -> bool { diff --git a/crates/ra_syntax/src/syntax_kinds.rs b/crates/ra_syntax/src/syntax_kinds.rs index d53886676faf..c1118c5ab410 100644 --- a/crates/ra_syntax/src/syntax_kinds.rs +++ b/crates/ra_syntax/src/syntax_kinds.rs @@ -1,8 +1,9 @@ mod generated; -use crate::SyntaxKind::*; use std::fmt; +use crate::SyntaxKind::*; + pub use self::generated::SyntaxKind; impl fmt::Debug for SyntaxKind { diff --git a/crates/tools/src/lib.rs b/crates/tools/src/lib.rs index ef9c613a7da9..0a10d2737edb 100644 --- a/crates/tools/src/lib.rs +++ b/crates/tools/src/lib.rs @@ -14,7 +14,7 @@ pub use teraron::{Mode, Overwrite, Verify}; pub type Result = std::result::Result; pub const GRAMMAR: &str = "crates/ra_syntax/src/grammar.ron"; -const GRAMMAR_DIR: &str = "crates/ra_syntax/src/grammar"; +const GRAMMAR_DIR: &str = "crates/ra_syntax/src/parsing/grammar"; const OK_INLINE_TESTS_DIR: &str = "crates/ra_syntax/tests/data/parser/inline/ok"; const ERR_INLINE_TESTS_DIR: &str = "crates/ra_syntax/tests/data/parser/inline/err";