From 5222b8aba3b1c2c68706aacf6869423a8e4fe6d5 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 20 Feb 2019 15:47:32 +0300 Subject: [PATCH] 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 cbba1d4aecd..755ccd8e00e 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 00000000000..2c92d554eef --- /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 8abd0f05141..9d7ad06fee6 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 060c0ccdf48..bf86443deb7 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 afe6886a1fa..8bbbe659b35 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 46daf5e5268..7f6abe1d5c3 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 5c1cf3e9c05..f74acff9e21 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 dc556190d8b..781c407debb 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 01d156899f4..c639d83e83b 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 b45830c619b..fb43e19cc6d 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 616a26fdc83..275d949189a 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 dd751465ce0..994e7e212b2 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 b3fe633e013..5719fe5a21e 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 ed48739f8ad..a0d7c32ecc8 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;