diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-02-21 10:46:17 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-02-21 10:46:17 +0000 |
commit | d77b5857c2420666e84dcd433f254e000e2843aa (patch) | |
tree | 416e333019e349bf4ee369f2548d9e6f6a9c67e9 /crates | |
parent | 18b0c509f77a8e06141fee6668532cced1ebf5d8 (diff) | |
parent | 46179230a05331b1debd4dfa3bb197fa38d92347 (diff) |
Merge #867
867: This moves the parser to separate crate r=matklad a=matklad
That makes parser independent form both the token and the tree representation.
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_parser/Cargo.toml | 9 | ||||
-rw-r--r-- | crates/ra_parser/src/event.rs (renamed from crates/ra_syntax/src/parsing/event.rs) | 4 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar.rs (renamed from crates/ra_syntax/src/parsing/grammar.rs) | 10 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/attributes.rs (renamed from crates/ra_syntax/src/parsing/grammar/attributes.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/expressions.rs (renamed from crates/ra_syntax/src/parsing/grammar/expressions.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/expressions/atom.rs (renamed from crates/ra_syntax/src/parsing/grammar/expressions/atom.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/items.rs (renamed from crates/ra_syntax/src/parsing/grammar/items.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/items/consts.rs (renamed from crates/ra_syntax/src/parsing/grammar/items/consts.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/items/nominal.rs (renamed from crates/ra_syntax/src/parsing/grammar/items/nominal.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/items/traits.rs (renamed from crates/ra_syntax/src/parsing/grammar/items/traits.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/items/use_item.rs (renamed from crates/ra_syntax/src/parsing/grammar/items/use_item.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/params.rs (renamed from crates/ra_syntax/src/parsing/grammar/params.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/paths.rs (renamed from crates/ra_syntax/src/parsing/grammar/paths.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/patterns.rs (renamed from crates/ra_syntax/src/parsing/grammar/patterns.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/type_args.rs (renamed from crates/ra_syntax/src/parsing/grammar/type_args.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/type_params.rs (renamed from crates/ra_syntax/src/parsing/grammar/type_params.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/grammar/types.rs (renamed from crates/ra_syntax/src/parsing/grammar/types.rs) | 0 | ||||
-rw-r--r-- | crates/ra_parser/src/lib.rs | 64 | ||||
-rw-r--r-- | crates/ra_parser/src/parser.rs (renamed from crates/ra_syntax/src/parsing/parser.rs) | 7 | ||||
-rw-r--r-- | crates/ra_parser/src/syntax_kind.rs (renamed from crates/ra_syntax/src/syntax_kinds.rs) | 4 | ||||
-rw-r--r-- | crates/ra_parser/src/syntax_kind/generated.rs (renamed from crates/ra_syntax/src/syntax_kinds/generated.rs) | 4 | ||||
-rw-r--r-- | crates/ra_parser/src/syntax_kind/generated.rs.tera (renamed from crates/ra_syntax/src/syntax_kinds/generated.rs.tera) | 4 | ||||
-rw-r--r-- | crates/ra_parser/src/token_set.rs (renamed from crates/ra_syntax/src/parsing/token_set.rs) | 0 | ||||
-rw-r--r-- | crates/ra_syntax/Cargo.toml | 1 | ||||
-rw-r--r-- | crates/ra_syntax/src/lib.rs | 3 | ||||
-rw-r--r-- | crates/ra_syntax/src/parsing.rs | 32 | ||||
-rw-r--r-- | crates/ra_syntax/src/parsing/builder.rs | 15 | ||||
-rw-r--r-- | crates/ra_syntax/src/parsing/input.rs | 7 | ||||
-rw-r--r-- | crates/ra_syntax/src/parsing/reparsing.rs | 21 | ||||
-rw-r--r-- | crates/ra_syntax/src/syntax_error.rs | 4 | ||||
-rw-r--r-- | crates/tools/src/lib.rs | 4 |
31 files changed, 119 insertions, 74 deletions
diff --git a/crates/ra_parser/Cargo.toml b/crates/ra_parser/Cargo.toml new file mode 100644 index 000000000..b110e2bc6 --- /dev/null +++ b/crates/ra_parser/Cargo.toml | |||
@@ -0,0 +1,9 @@ | |||
1 | [package] | ||
2 | edition = "2018" | ||
3 | name = "ra_parser" | ||
4 | version = "0.1.0" | ||
5 | authors = ["rust-analyzer developers"] | ||
6 | publish = false | ||
7 | |||
8 | [dependencies] | ||
9 | drop_bomb = "0.1.4" | ||
diff --git a/crates/ra_syntax/src/parsing/event.rs b/crates/ra_parser/src/event.rs index d6cbdffe0..d6e8454d4 100644 --- a/crates/ra_syntax/src/parsing/event.rs +++ b/crates/ra_parser/src/event.rs | |||
@@ -10,8 +10,8 @@ | |||
10 | use std::mem; | 10 | use std::mem; |
11 | 11 | ||
12 | use crate::{ | 12 | use crate::{ |
13 | ParseError, TreeSink, | ||
13 | SyntaxKind::{self, *}, | 14 | SyntaxKind::{self, *}, |
14 | parsing::{ParseError, TreeSink}, | ||
15 | }; | 15 | }; |
16 | 16 | ||
17 | /// `Parser` produces a flat list of `Event`s. | 17 | /// `Parser` produces a flat list of `Event`s. |
@@ -84,7 +84,7 @@ impl Event { | |||
84 | } | 84 | } |
85 | 85 | ||
86 | /// Generate the syntax tree with the control of events. | 86 | /// Generate the syntax tree with the control of events. |
87 | pub(super) fn process(sink: &mut impl TreeSink, mut events: Vec<Event>) { | 87 | pub(super) fn process(sink: &mut dyn TreeSink, mut events: Vec<Event>) { |
88 | let mut forward_parents = Vec::new(); | 88 | let mut forward_parents = Vec::new(); |
89 | 89 | ||
90 | for i in 0..events.len() { | 90 | for i in 0..events.len() { |
diff --git a/crates/ra_syntax/src/parsing/grammar.rs b/crates/ra_parser/src/grammar.rs index 800d5a4a2..15aab6c6f 100644 --- a/crates/ra_syntax/src/parsing/grammar.rs +++ b/crates/ra_parser/src/grammar.rs | |||
@@ -38,20 +38,18 @@ mod types; | |||
38 | 38 | ||
39 | use crate::{ | 39 | use crate::{ |
40 | SyntaxKind::{self, *}, | 40 | SyntaxKind::{self, *}, |
41 | parsing::{ | 41 | TokenSet, |
42 | token_set::TokenSet, | 42 | parser::{CompletedMarker, Marker, Parser}, |
43 | parser::{CompletedMarker, Marker, Parser} | ||
44 | }, | ||
45 | }; | 43 | }; |
46 | 44 | ||
47 | pub(super) fn root(p: &mut Parser) { | 45 | pub(crate) fn root(p: &mut Parser) { |
48 | let m = p.start(); | 46 | let m = p.start(); |
49 | p.eat(SHEBANG); | 47 | p.eat(SHEBANG); |
50 | items::mod_contents(p, false); | 48 | items::mod_contents(p, false); |
51 | m.complete(p, SOURCE_FILE); | 49 | m.complete(p, SOURCE_FILE); |
52 | } | 50 | } |
53 | 51 | ||
54 | pub(super) fn reparser( | 52 | pub(crate) fn reparser( |
55 | node: SyntaxKind, | 53 | node: SyntaxKind, |
56 | first_child: Option<SyntaxKind>, | 54 | first_child: Option<SyntaxKind>, |
57 | parent: Option<SyntaxKind>, | 55 | parent: Option<SyntaxKind>, |
diff --git a/crates/ra_syntax/src/parsing/grammar/attributes.rs b/crates/ra_parser/src/grammar/attributes.rs index cd30e8a45..cd30e8a45 100644 --- a/crates/ra_syntax/src/parsing/grammar/attributes.rs +++ b/crates/ra_parser/src/grammar/attributes.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs index d5a4f4d7b..d5a4f4d7b 100644 --- a/crates/ra_syntax/src/parsing/grammar/expressions.rs +++ b/crates/ra_parser/src/grammar/expressions.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/expressions/atom.rs b/crates/ra_parser/src/grammar/expressions/atom.rs index e74305b6a..e74305b6a 100644 --- a/crates/ra_syntax/src/parsing/grammar/expressions/atom.rs +++ b/crates/ra_parser/src/grammar/expressions/atom.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs index 4b962c1f3..4b962c1f3 100644 --- a/crates/ra_syntax/src/parsing/grammar/items.rs +++ b/crates/ra_parser/src/grammar/items.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/items/consts.rs b/crates/ra_parser/src/grammar/items/consts.rs index 5a5852f83..5a5852f83 100644 --- a/crates/ra_syntax/src/parsing/grammar/items/consts.rs +++ b/crates/ra_parser/src/grammar/items/consts.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/items/nominal.rs b/crates/ra_parser/src/grammar/items/nominal.rs index ff9b38f9c..ff9b38f9c 100644 --- a/crates/ra_syntax/src/parsing/grammar/items/nominal.rs +++ b/crates/ra_parser/src/grammar/items/nominal.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/items/traits.rs b/crates/ra_parser/src/grammar/items/traits.rs index d5a8ccd98..d5a8ccd98 100644 --- a/crates/ra_syntax/src/parsing/grammar/items/traits.rs +++ b/crates/ra_parser/src/grammar/items/traits.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/items/use_item.rs b/crates/ra_parser/src/grammar/items/use_item.rs index 5111d37eb..5111d37eb 100644 --- a/crates/ra_syntax/src/parsing/grammar/items/use_item.rs +++ b/crates/ra_parser/src/grammar/items/use_item.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/params.rs b/crates/ra_parser/src/grammar/params.rs index 185386569..185386569 100644 --- a/crates/ra_syntax/src/parsing/grammar/params.rs +++ b/crates/ra_parser/src/grammar/params.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/paths.rs b/crates/ra_parser/src/grammar/paths.rs index 33a11886c..33a11886c 100644 --- a/crates/ra_syntax/src/parsing/grammar/paths.rs +++ b/crates/ra_parser/src/grammar/paths.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/patterns.rs b/crates/ra_parser/src/grammar/patterns.rs index 9d7da639d..9d7da639d 100644 --- a/crates/ra_syntax/src/parsing/grammar/patterns.rs +++ b/crates/ra_parser/src/grammar/patterns.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/type_args.rs b/crates/ra_parser/src/grammar/type_args.rs index f889419c5..f889419c5 100644 --- a/crates/ra_syntax/src/parsing/grammar/type_args.rs +++ b/crates/ra_parser/src/grammar/type_args.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/type_params.rs b/crates/ra_parser/src/grammar/type_params.rs index 40f998682..40f998682 100644 --- a/crates/ra_syntax/src/parsing/grammar/type_params.rs +++ b/crates/ra_parser/src/grammar/type_params.rs | |||
diff --git a/crates/ra_syntax/src/parsing/grammar/types.rs b/crates/ra_parser/src/grammar/types.rs index adc189a29..adc189a29 100644 --- a/crates/ra_syntax/src/parsing/grammar/types.rs +++ b/crates/ra_parser/src/grammar/types.rs | |||
diff --git a/crates/ra_parser/src/lib.rs b/crates/ra_parser/src/lib.rs new file mode 100644 index 000000000..7931b5189 --- /dev/null +++ b/crates/ra_parser/src/lib.rs | |||
@@ -0,0 +1,64 @@ | |||
1 | #[macro_use] | ||
2 | mod token_set; | ||
3 | mod syntax_kind; | ||
4 | mod event; | ||
5 | mod parser; | ||
6 | mod grammar; | ||
7 | |||
8 | pub(crate) use token_set::TokenSet; | ||
9 | |||
10 | pub use syntax_kind::SyntaxKind; | ||
11 | |||
12 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | ||
13 | pub struct ParseError(pub String); | ||
14 | |||
15 | /// `TreeSink` abstracts details of a particular syntax tree implementation. | ||
16 | pub trait TreeSink { | ||
17 | /// Adds new leaf to the current branch. | ||
18 | fn leaf(&mut self, kind: SyntaxKind, n_tokens: u8); | ||
19 | |||
20 | /// Start new branch and make it current. | ||
21 | fn start_branch(&mut self, kind: SyntaxKind, root: bool); | ||
22 | |||
23 | /// Finish current branch and restore previous | ||
24 | /// branch as current. | ||
25 | fn finish_branch(&mut self, root: bool); | ||
26 | |||
27 | fn error(&mut self, error: ParseError); | ||
28 | } | ||
29 | |||
30 | /// `TokenSource` abstracts the source of the tokens parser operates one. | ||
31 | /// | ||
32 | /// Hopefully this will allow us to treat text and token trees in the same way! | ||
33 | pub trait TokenSource { | ||
34 | fn token_kind(&self, pos: usize) -> SyntaxKind; | ||
35 | fn is_token_joint_to_next(&self, pos: usize) -> bool; | ||
36 | fn is_keyword(&self, pos: usize, kw: &str) -> bool; | ||
37 | } | ||
38 | |||
39 | pub fn parse(token_source: &dyn TokenSource, tree_sink: &mut dyn TreeSink) { | ||
40 | let mut p = parser::Parser::new(token_source); | ||
41 | grammar::root(&mut p); | ||
42 | let events = p.finish(); | ||
43 | event::process(tree_sink, events); | ||
44 | } | ||
45 | |||
46 | pub struct Reparser(fn(&mut parser::Parser)); | ||
47 | |||
48 | impl Reparser { | ||
49 | pub fn for_node( | ||
50 | node: SyntaxKind, | ||
51 | first_child: Option<SyntaxKind>, | ||
52 | parent: Option<SyntaxKind>, | ||
53 | ) -> Option<Reparser> { | ||
54 | grammar::reparser(node, first_child, parent).map(Reparser) | ||
55 | } | ||
56 | |||
57 | pub fn parse(self, token_source: &dyn TokenSource, tree_sink: &mut dyn TreeSink) { | ||
58 | let Reparser(r) = self; | ||
59 | let mut p = parser::Parser::new(token_source); | ||
60 | r(&mut p); | ||
61 | let events = p.finish(); | ||
62 | event::process(tree_sink, events); | ||
63 | } | ||
64 | } | ||
diff --git a/crates/ra_syntax/src/parsing/parser.rs b/crates/ra_parser/src/parser.rs index 923b0f2b2..a18458148 100644 --- a/crates/ra_syntax/src/parsing/parser.rs +++ b/crates/ra_parser/src/parser.rs | |||
@@ -4,11 +4,8 @@ use drop_bomb::DropBomb; | |||
4 | 4 | ||
5 | use crate::{ | 5 | use crate::{ |
6 | SyntaxKind::{self, ERROR, EOF, TOMBSTONE}, | 6 | SyntaxKind::{self, ERROR, EOF, TOMBSTONE}, |
7 | parsing::{ | 7 | TokenSource, ParseError, TokenSet, |
8 | TokenSource, ParseError, | 8 | event::Event, |
9 | token_set::TokenSet, | ||
10 | event::Event, | ||
11 | }, | ||
12 | }; | 9 | }; |
13 | 10 | ||
14 | /// `Parser` struct provides the low-level API for | 11 | /// `Parser` struct provides the low-level API for |
diff --git a/crates/ra_syntax/src/syntax_kinds.rs b/crates/ra_parser/src/syntax_kind.rs index c1118c5ab..a2353317f 100644 --- a/crates/ra_syntax/src/syntax_kinds.rs +++ b/crates/ra_parser/src/syntax_kind.rs | |||
@@ -2,8 +2,6 @@ mod generated; | |||
2 | 2 | ||
3 | use std::fmt; | 3 | use std::fmt; |
4 | 4 | ||
5 | use crate::SyntaxKind::*; | ||
6 | |||
7 | pub use self::generated::SyntaxKind; | 5 | pub use self::generated::SyntaxKind; |
8 | 6 | ||
9 | impl fmt::Debug for SyntaxKind { | 7 | impl fmt::Debug for SyntaxKind { |
@@ -20,7 +18,7 @@ pub(crate) struct SyntaxInfo { | |||
20 | impl SyntaxKind { | 18 | impl SyntaxKind { |
21 | pub fn is_trivia(self) -> bool { | 19 | pub fn is_trivia(self) -> bool { |
22 | match self { | 20 | match self { |
23 | WHITESPACE | COMMENT => true, | 21 | SyntaxKind::WHITESPACE | SyntaxKind::COMMENT => true, |
24 | _ => false, | 22 | _ => false, |
25 | } | 23 | } |
26 | } | 24 | } |
diff --git a/crates/ra_syntax/src/syntax_kinds/generated.rs b/crates/ra_parser/src/syntax_kind/generated.rs index 266b95bbb..1d8f988ae 100644 --- a/crates/ra_syntax/src/syntax_kinds/generated.rs +++ b/crates/ra_parser/src/syntax_kind/generated.rs | |||
@@ -568,7 +568,7 @@ impl SyntaxKind { | |||
568 | EOF => &SyntaxInfo { name: "EOF" }, | 568 | EOF => &SyntaxInfo { name: "EOF" }, |
569 | } | 569 | } |
570 | } | 570 | } |
571 | pub(crate) fn from_keyword(ident: &str) -> Option<SyntaxKind> { | 571 | pub fn from_keyword(ident: &str) -> Option<SyntaxKind> { |
572 | let kw = match ident { | 572 | let kw = match ident { |
573 | "use" => USE_KW, | 573 | "use" => USE_KW, |
574 | "fn" => FN_KW, | 574 | "fn" => FN_KW, |
@@ -610,7 +610,7 @@ impl SyntaxKind { | |||
610 | Some(kw) | 610 | Some(kw) |
611 | } | 611 | } |
612 | 612 | ||
613 | pub(crate) fn from_char(c: char) -> Option<SyntaxKind> { | 613 | pub fn from_char(c: char) -> Option<SyntaxKind> { |
614 | let tok = match c { | 614 | let tok = match c { |
615 | ';' => SEMI, | 615 | ';' => SEMI, |
616 | ',' => COMMA, | 616 | ',' => COMMA, |
diff --git a/crates/ra_syntax/src/syntax_kinds/generated.rs.tera b/crates/ra_parser/src/syntax_kind/generated.rs.tera index 837437136..f241a21a0 100644 --- a/crates/ra_syntax/src/syntax_kinds/generated.rs.tera +++ b/crates/ra_parser/src/syntax_kind/generated.rs.tera | |||
@@ -74,7 +74,7 @@ impl SyntaxKind { | |||
74 | EOF => &SyntaxInfo { name: "EOF" }, | 74 | EOF => &SyntaxInfo { name: "EOF" }, |
75 | } | 75 | } |
76 | } | 76 | } |
77 | pub(crate) fn from_keyword(ident: &str) -> Option<SyntaxKind> { | 77 | pub fn from_keyword(ident: &str) -> Option<SyntaxKind> { |
78 | let kw = match ident { | 78 | let kw = match ident { |
79 | {%- for kw in keywords %} | 79 | {%- for kw in keywords %} |
80 | "{{kw}}" => {{kw | upper}}_KW, | 80 | "{{kw}}" => {{kw | upper}}_KW, |
@@ -84,7 +84,7 @@ impl SyntaxKind { | |||
84 | Some(kw) | 84 | Some(kw) |
85 | } | 85 | } |
86 | 86 | ||
87 | pub(crate) fn from_char(c: char) -> Option<SyntaxKind> { | 87 | pub fn from_char(c: char) -> Option<SyntaxKind> { |
88 | let tok = match c { | 88 | let tok = match c { |
89 | {%- for t in single_byte_tokens %} | 89 | {%- for t in single_byte_tokens %} |
90 | '{{t.0}}' => {{t.1}}, | 90 | '{{t.0}}' => {{t.1}}, |
diff --git a/crates/ra_syntax/src/parsing/token_set.rs b/crates/ra_parser/src/token_set.rs index 24152a38a..24152a38a 100644 --- a/crates/ra_syntax/src/parsing/token_set.rs +++ b/crates/ra_parser/src/token_set.rs | |||
diff --git a/crates/ra_syntax/Cargo.toml b/crates/ra_syntax/Cargo.toml index 7ce26b7c4..7e70dad3f 100644 --- a/crates/ra_syntax/Cargo.toml +++ b/crates/ra_syntax/Cargo.toml | |||
@@ -21,6 +21,7 @@ text_unit = { version = "0.1.6", features = ["serde"] } | |||
21 | smol_str = { version = "0.1.9", features = ["serde"] } | 21 | smol_str = { version = "0.1.9", features = ["serde"] } |
22 | 22 | ||
23 | ra_text_edit = { path = "../ra_text_edit" } | 23 | ra_text_edit = { path = "../ra_text_edit" } |
24 | ra_parser = { path = "../ra_parser" } | ||
24 | 25 | ||
25 | [dev-dependencies] | 26 | [dev-dependencies] |
26 | test_utils = { path = "../test_utils" } | 27 | test_utils = { path = "../test_utils" } |
diff --git a/crates/ra_syntax/src/lib.rs b/crates/ra_syntax/src/lib.rs index b12282b39..c788bddec 100644 --- a/crates/ra_syntax/src/lib.rs +++ b/crates/ra_syntax/src/lib.rs | |||
@@ -16,7 +16,6 @@ | |||
16 | #![allow(missing_docs)] | 16 | #![allow(missing_docs)] |
17 | //#![warn(unreachable_pub)] // rust-lang/rust#47816 | 17 | //#![warn(unreachable_pub)] // rust-lang/rust#47816 |
18 | 18 | ||
19 | mod syntax_kinds; | ||
20 | mod syntax_node; | 19 | mod syntax_node; |
21 | mod syntax_text; | 20 | mod syntax_text; |
22 | mod syntax_error; | 21 | mod syntax_error; |
@@ -31,9 +30,9 @@ pub mod ast; | |||
31 | pub mod utils; | 30 | pub mod utils; |
32 | 31 | ||
33 | pub use rowan::{SmolStr, TextRange, TextUnit}; | 32 | pub use rowan::{SmolStr, TextRange, TextUnit}; |
33 | pub use ra_parser::SyntaxKind; | ||
34 | pub use crate::{ | 34 | pub use crate::{ |
35 | ast::AstNode, | 35 | ast::AstNode, |
36 | syntax_kinds::SyntaxKind, | ||
37 | syntax_error::{SyntaxError, SyntaxErrorKind, Location}, | 36 | syntax_error::{SyntaxError, SyntaxErrorKind, Location}, |
38 | syntax_text::SyntaxText, | 37 | syntax_text::SyntaxText, |
39 | syntax_node::{Direction, SyntaxNode, WalkEvent, TreeArc}, | 38 | syntax_node::{Direction, SyntaxNode, WalkEvent, TreeArc}, |
diff --git a/crates/ra_syntax/src/parsing.rs b/crates/ra_syntax/src/parsing.rs index 7e1b32035..0a11600e1 100644 --- a/crates/ra_syntax/src/parsing.rs +++ b/crates/ra_syntax/src/parsing.rs | |||
@@ -1,50 +1,28 @@ | |||
1 | #[macro_use] | ||
2 | mod token_set; | ||
3 | mod builder; | 1 | mod builder; |
4 | mod lexer; | 2 | mod lexer; |
5 | mod event; | ||
6 | mod input; | 3 | mod input; |
7 | mod parser; | ||
8 | mod grammar; | ||
9 | mod reparsing; | 4 | mod reparsing; |
10 | 5 | ||
6 | use ra_parser::{parse, ParseError}; | ||
7 | |||
11 | use crate::{ | 8 | use crate::{ |
12 | SyntaxKind, SyntaxError, | 9 | SyntaxKind, SyntaxError, |
13 | parsing::{ | 10 | parsing::{ |
14 | builder::TreeBuilder, | 11 | builder::TreeBuilder, |
15 | input::ParserInput, | 12 | input::ParserInput, |
16 | event::process, | ||
17 | parser::Parser, | ||
18 | }, | 13 | }, |
19 | syntax_node::GreenNode, | 14 | syntax_node::GreenNode, |
20 | }; | 15 | }; |
21 | 16 | ||
22 | pub use self::lexer::{tokenize, Token}; | 17 | pub use self::lexer::{tokenize, Token}; |
23 | 18 | ||
24 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | ||
25 | pub struct ParseError(pub String); | ||
26 | |||
27 | pub(crate) use self::reparsing::incremental_reparse; | 19 | pub(crate) use self::reparsing::incremental_reparse; |
28 | 20 | ||
29 | pub(crate) fn parse_text(text: &str) -> (GreenNode, Vec<SyntaxError>) { | 21 | pub(crate) fn parse_text(text: &str) -> (GreenNode, Vec<SyntaxError>) { |
30 | let tokens = tokenize(&text); | 22 | let tokens = tokenize(&text); |
31 | let tree_sink = TreeBuilder::new(text, &tokens); | 23 | let token_source = ParserInput::new(text, &tokens); |
32 | parse_with(tree_sink, text, &tokens, grammar::root) | 24 | let mut tree_sink = TreeBuilder::new(text, &tokens); |
33 | } | 25 | parse(&token_source, &mut tree_sink); |
34 | |||
35 | fn parse_with<S: TreeSink>( | ||
36 | mut tree_sink: S, | ||
37 | text: &str, | ||
38 | tokens: &[Token], | ||
39 | f: fn(&mut Parser), | ||
40 | ) -> S::Tree { | ||
41 | let events = { | ||
42 | let input = ParserInput::new(text, &tokens); | ||
43 | let mut p = Parser::new(&input); | ||
44 | f(&mut p); | ||
45 | p.finish() | ||
46 | }; | ||
47 | process(&mut tree_sink, events); | ||
48 | tree_sink.finish() | 26 | tree_sink.finish() |
49 | } | 27 | } |
50 | 28 | ||
diff --git a/crates/ra_syntax/src/parsing/builder.rs b/crates/ra_syntax/src/parsing/builder.rs index 1041c6a7b..0775b0900 100644 --- a/crates/ra_syntax/src/parsing/builder.rs +++ b/crates/ra_syntax/src/parsing/builder.rs | |||
@@ -1,7 +1,9 @@ | |||
1 | use ra_parser::{TreeSink, ParseError}; | ||
2 | |||
1 | use crate::{ | 3 | use crate::{ |
2 | SmolStr, SyntaxError, SyntaxErrorKind, TextUnit, TextRange, | 4 | SmolStr, SyntaxError, SyntaxErrorKind, TextUnit, TextRange, |
3 | SyntaxKind::{self, *}, | 5 | SyntaxKind::{self, *}, |
4 | parsing::{TreeSink, ParseError, Token}, | 6 | parsing::Token, |
5 | syntax_node::{GreenNode, RaTypes}, | 7 | syntax_node::{GreenNode, RaTypes}, |
6 | }; | 8 | }; |
7 | 9 | ||
@@ -17,8 +19,6 @@ pub(crate) struct TreeBuilder<'a> { | |||
17 | } | 19 | } |
18 | 20 | ||
19 | impl<'a> TreeSink for TreeBuilder<'a> { | 21 | impl<'a> TreeSink for TreeBuilder<'a> { |
20 | type Tree = (GreenNode, Vec<SyntaxError>); | ||
21 | |||
22 | fn leaf(&mut self, kind: SyntaxKind, n_tokens: u8) { | 22 | fn leaf(&mut self, kind: SyntaxKind, n_tokens: u8) { |
23 | self.eat_trivias(); | 23 | self.eat_trivias(); |
24 | let n_tokens = n_tokens as usize; | 24 | let n_tokens = n_tokens as usize; |
@@ -65,10 +65,6 @@ impl<'a> TreeSink for TreeBuilder<'a> { | |||
65 | let error = SyntaxError::new(SyntaxErrorKind::ParseError(error), self.text_pos); | 65 | let error = SyntaxError::new(SyntaxErrorKind::ParseError(error), self.text_pos); |
66 | self.errors.push(error) | 66 | self.errors.push(error) |
67 | } | 67 | } |
68 | |||
69 | fn finish(self) -> (GreenNode, Vec<SyntaxError>) { | ||
70 | (self.inner.finish(), self.errors) | ||
71 | } | ||
72 | } | 68 | } |
73 | 69 | ||
74 | impl<'a> TreeBuilder<'a> { | 70 | impl<'a> TreeBuilder<'a> { |
@@ -82,6 +78,11 @@ impl<'a> TreeBuilder<'a> { | |||
82 | inner: GreenNodeBuilder::new(), | 78 | inner: GreenNodeBuilder::new(), |
83 | } | 79 | } |
84 | } | 80 | } |
81 | |||
82 | pub(super) fn finish(self) -> (GreenNode, Vec<SyntaxError>) { | ||
83 | (self.inner.finish(), self.errors) | ||
84 | } | ||
85 | |||
85 | fn eat_trivias(&mut self) { | 86 | fn eat_trivias(&mut self) { |
86 | while let Some(&token) = self.tokens.get(self.token_pos) { | 87 | while let Some(&token) = self.tokens.get(self.token_pos) { |
87 | if !token.kind.is_trivia() { | 88 | if !token.kind.is_trivia() { |
diff --git a/crates/ra_syntax/src/parsing/input.rs b/crates/ra_syntax/src/parsing/input.rs index 96c03bb11..58be795bc 100644 --- a/crates/ra_syntax/src/parsing/input.rs +++ b/crates/ra_syntax/src/parsing/input.rs | |||
@@ -1,9 +1,8 @@ | |||
1 | use ra_parser::TokenSource; | ||
2 | |||
1 | use crate::{ | 3 | use crate::{ |
2 | SyntaxKind, SyntaxKind::EOF, TextRange, TextUnit, | 4 | SyntaxKind, SyntaxKind::EOF, TextRange, TextUnit, |
3 | parsing::{ | 5 | parsing::lexer::Token, |
4 | TokenSource, | ||
5 | lexer::Token, | ||
6 | }, | ||
7 | }; | 6 | }; |
8 | 7 | ||
9 | impl<'t> TokenSource for ParserInput<'t> { | 8 | impl<'t> TokenSource for ParserInput<'t> { |
diff --git a/crates/ra_syntax/src/parsing/reparsing.rs b/crates/ra_syntax/src/parsing/reparsing.rs index 2c860b3df..ffcb512ad 100644 --- a/crates/ra_syntax/src/parsing/reparsing.rs +++ b/crates/ra_syntax/src/parsing/reparsing.rs | |||
@@ -1,18 +1,18 @@ | |||
1 | use ra_text_edit::AtomTextEdit; | ||
2 | use ra_parser::Reparser; | ||
3 | |||
1 | use crate::{ | 4 | use crate::{ |
2 | SyntaxKind::*, TextRange, TextUnit, | 5 | SyntaxKind::*, TextRange, TextUnit, |
3 | algo, | 6 | algo, |
4 | syntax_node::{GreenNode, SyntaxNode}, | 7 | syntax_node::{GreenNode, SyntaxNode}, |
5 | syntax_error::SyntaxError, | 8 | syntax_error::SyntaxError, |
6 | parsing::{ | 9 | parsing::{ |
7 | grammar, parse_with, | 10 | input::ParserInput, |
8 | builder::TreeBuilder, | 11 | builder::TreeBuilder, |
9 | parser::Parser, | ||
10 | lexer::{tokenize, Token}, | 12 | lexer::{tokenize, Token}, |
11 | } | 13 | } |
12 | }; | 14 | }; |
13 | 15 | ||
14 | use ra_text_edit::AtomTextEdit; | ||
15 | |||
16 | pub(crate) fn incremental_reparse( | 16 | pub(crate) fn incremental_reparse( |
17 | node: &SyntaxNode, | 17 | node: &SyntaxNode, |
18 | edit: &AtomTextEdit, | 18 | edit: &AtomTextEdit, |
@@ -61,8 +61,10 @@ fn reparse_block<'node>( | |||
61 | if !is_balanced(&tokens) { | 61 | if !is_balanced(&tokens) { |
62 | return None; | 62 | return None; |
63 | } | 63 | } |
64 | let tree_sink = TreeBuilder::new(&text, &tokens); | 64 | let token_source = ParserInput::new(&text, &tokens); |
65 | let (green, new_errors) = parse_with(tree_sink, &text, &tokens, reparser); | 65 | let mut tree_sink = TreeBuilder::new(&text, &tokens); |
66 | reparser.parse(&token_source, &mut tree_sink); | ||
67 | let (green, new_errors) = tree_sink.finish(); | ||
66 | Some((node, green, new_errors)) | 68 | Some((node, green, new_errors)) |
67 | } | 69 | } |
68 | 70 | ||
@@ -78,15 +80,12 @@ fn is_contextual_kw(text: &str) -> bool { | |||
78 | } | 80 | } |
79 | } | 81 | } |
80 | 82 | ||
81 | fn find_reparsable_node( | 83 | fn find_reparsable_node(node: &SyntaxNode, range: TextRange) -> Option<(&SyntaxNode, Reparser)> { |
82 | node: &SyntaxNode, | ||
83 | range: TextRange, | ||
84 | ) -> Option<(&SyntaxNode, fn(&mut Parser))> { | ||
85 | let node = algo::find_covering_node(node, range); | 84 | let node = algo::find_covering_node(node, range); |
86 | node.ancestors().find_map(|node| { | 85 | node.ancestors().find_map(|node| { |
87 | let first_child = node.first_child().map(|it| it.kind()); | 86 | let first_child = node.first_child().map(|it| it.kind()); |
88 | let parent = node.parent().map(|it| it.kind()); | 87 | let parent = node.parent().map(|it| it.kind()); |
89 | grammar::reparser(node.kind(), first_child, parent).map(|r| (node, r)) | 88 | Reparser::for_node(node.kind(), first_child, parent).map(|r| (node, r)) |
90 | }) | 89 | }) |
91 | } | 90 | } |
92 | 91 | ||
diff --git a/crates/ra_syntax/src/syntax_error.rs b/crates/ra_syntax/src/syntax_error.rs index 1a00fcc27..bdd431742 100644 --- a/crates/ra_syntax/src/syntax_error.rs +++ b/crates/ra_syntax/src/syntax_error.rs | |||
@@ -1,6 +1,8 @@ | |||
1 | use std::fmt; | 1 | use std::fmt; |
2 | 2 | ||
3 | use crate::{TextRange, TextUnit, parsing::ParseError}; | 3 | use ra_parser::ParseError; |
4 | |||
5 | use crate::{TextRange, TextUnit}; | ||
4 | 6 | ||
5 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 7 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
6 | pub struct SyntaxError { | 8 | pub struct SyntaxError { |
diff --git a/crates/tools/src/lib.rs b/crates/tools/src/lib.rs index 0a10d2737..3c23ed76e 100644 --- a/crates/tools/src/lib.rs +++ b/crates/tools/src/lib.rs | |||
@@ -14,11 +14,11 @@ pub use teraron::{Mode, Overwrite, Verify}; | |||
14 | pub type Result<T> = std::result::Result<T, failure::Error>; | 14 | pub type Result<T> = std::result::Result<T, failure::Error>; |
15 | 15 | ||
16 | pub const GRAMMAR: &str = "crates/ra_syntax/src/grammar.ron"; | 16 | pub const GRAMMAR: &str = "crates/ra_syntax/src/grammar.ron"; |
17 | const GRAMMAR_DIR: &str = "crates/ra_syntax/src/parsing/grammar"; | 17 | const GRAMMAR_DIR: &str = "crates/ra_parser/src/grammar"; |
18 | const OK_INLINE_TESTS_DIR: &str = "crates/ra_syntax/tests/data/parser/inline/ok"; | 18 | const OK_INLINE_TESTS_DIR: &str = "crates/ra_syntax/tests/data/parser/inline/ok"; |
19 | const ERR_INLINE_TESTS_DIR: &str = "crates/ra_syntax/tests/data/parser/inline/err"; | 19 | const ERR_INLINE_TESTS_DIR: &str = "crates/ra_syntax/tests/data/parser/inline/err"; |
20 | 20 | ||
21 | pub const SYNTAX_KINDS: &str = "crates/ra_syntax/src/syntax_kinds/generated.rs.tera"; | 21 | pub const SYNTAX_KINDS: &str = "crates/ra_parser/src/syntax_kind/generated.rs.tera"; |
22 | pub const AST: &str = "crates/ra_syntax/src/ast/generated.rs.tera"; | 22 | pub const AST: &str = "crates/ra_syntax/src/ast/generated.rs.tera"; |
23 | const TOOLCHAIN: &str = "stable"; | 23 | const TOOLCHAIN: &str = "stable"; |
24 | 24 | ||