Skip to content

Commit 0b4bff9

Browse files
bors[bot]matklad
andauthored
Merge #10168
10168: internal: make name consistent with usage r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 7d9eb4f + 104cd0c commit 0b4bff9

File tree

14 files changed

+105
-89
lines changed

14 files changed

+105
-89
lines changed

crates/hir_def/src/attr.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,8 @@ impl Attr {
695695
hygiene: &Hygiene,
696696
id: AttrId,
697697
) -> Option<Attr> {
698-
let (parse, _) = mbe::token_tree_to_syntax_node(tt, mbe::FragmentKind::MetaItem).ok()?;
698+
let (parse, _) =
699+
mbe::token_tree_to_syntax_node(tt, mbe::ParserEntryPoint::MetaItem).ok()?;
699700
let ast = ast::Meta::cast(parse.syntax_node())?;
700701

701702
Self::from_src(db, ast, hygiene, id)

crates/hir_expand/src/builtin_derive.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ struct BasicAdtInfo {
7272
}
7373

7474
fn parse_adt(tt: &tt::Subtree) -> Result<BasicAdtInfo, mbe::ExpandError> {
75-
let (parsed, token_map) = mbe::token_tree_to_syntax_node(tt, mbe::FragmentKind::Items)?; // FragmentKind::Items doesn't parse attrs?
75+
let (parsed, token_map) = mbe::token_tree_to_syntax_node(tt, mbe::ParserEntryPoint::Items)?; // FragmentKind::Items doesn't parse attrs?
7676
let macro_items = ast::MacroItems::cast(parsed.syntax_node()).ok_or_else(|| {
7777
debug!("derive node didn't parse");
7878
mbe::ExpandError::UnexpectedToken

crates/hir_expand/src/db.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -444,12 +444,12 @@ fn token_tree_to_syntax_node(
444444
tt: &tt::Subtree,
445445
expand_to: ExpandTo,
446446
) -> Result<(Parse<SyntaxNode>, mbe::TokenMap), ExpandError> {
447-
let fragment = match expand_to {
448-
ExpandTo::Statements => mbe::FragmentKind::Statements,
449-
ExpandTo::Items => mbe::FragmentKind::Items,
450-
ExpandTo::Pattern => mbe::FragmentKind::Pattern,
451-
ExpandTo::Type => mbe::FragmentKind::Type,
452-
ExpandTo::Expr => mbe::FragmentKind::Expr,
447+
let entry_point = match expand_to {
448+
ExpandTo::Statements => mbe::ParserEntryPoint::Statements,
449+
ExpandTo::Items => mbe::ParserEntryPoint::Items,
450+
ExpandTo::Pattern => mbe::ParserEntryPoint::Pattern,
451+
ExpandTo::Type => mbe::ParserEntryPoint::Type,
452+
ExpandTo::Expr => mbe::ParserEntryPoint::Expr,
453453
};
454-
mbe::token_tree_to_syntax_node(tt, fragment)
454+
mbe::token_tree_to_syntax_node(tt, entry_point)
455455
}

crates/hir_expand/src/eager.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ pub fn expand_eager_macro(
131131
let arg_file_id = arg_id;
132132

133133
let parsed_args = diagnostic_sink
134-
.result(mbe::token_tree_to_syntax_node(&parsed_args, mbe::FragmentKind::Expr))?
134+
.result(mbe::token_tree_to_syntax_node(&parsed_args, mbe::ParserEntryPoint::Expr))?
135135
.0;
136136
let result = eager_macro_recur(
137137
db,

crates/mbe/src/expander/matcher.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ use crate::{
6969
};
7070

7171
use super::ExpandResult;
72-
use parser::FragmentKind::*;
72+
use parser::ParserEntryPoint::*;
7373
use smallvec::{smallvec, SmallVec};
7474
use syntax::SmolStr;
7575

crates/mbe/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::{
2424
};
2525

2626
// FIXME: we probably should re-think `token_tree_to_syntax_node` interfaces
27-
pub use ::parser::FragmentKind;
27+
pub use ::parser::ParserEntryPoint;
2828
pub use tt::{Delimiter, DelimiterKind, Punct};
2929

3030
#[derive(Debug, PartialEq, Eq)]

crates/mbe/src/syntax_bridge.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use syntax::{
1313
use tt::buffer::{Cursor, TokenBuffer};
1414

1515
use crate::{
16-
subtree_source::SubtreeTokenSource, tt_iter::TtIter, ExpandError, FragmentKind, TokenMap,
16+
subtree_source::SubtreeTokenSource, tt_iter::TtIter, ExpandError, ParserEntryPoint, TokenMap,
1717
};
1818

1919
/// Convert the syntax node to a `TokenTree` (what macro
@@ -49,7 +49,7 @@ pub fn syntax_node_to_token_tree_censored(
4949

5050
pub fn token_tree_to_syntax_node(
5151
tt: &tt::Subtree,
52-
fragment_kind: FragmentKind,
52+
entry_point: ParserEntryPoint,
5353
) -> Result<(Parse<SyntaxNode>, TokenMap), ExpandError> {
5454
let buffer = match tt {
5555
tt::Subtree { delimiter: None, token_trees } => {
@@ -59,7 +59,7 @@ pub fn token_tree_to_syntax_node(
5959
};
6060
let mut token_source = SubtreeTokenSource::new(&buffer);
6161
let mut tree_sink = TtTreeSink::new(buffer.begin());
62-
parser::parse_fragment(&mut token_source, &mut tree_sink, fragment_kind);
62+
parser::parse(&mut token_source, &mut tree_sink, entry_point);
6363
if tree_sink.roots.len() != 1 {
6464
return Err(ExpandError::ConversionError);
6565
}
@@ -100,7 +100,7 @@ pub fn parse_exprs_with_sep(tt: &tt::Subtree, sep: char) -> Vec<tt::Subtree> {
100100
let mut res = Vec::new();
101101

102102
while iter.peek_n(0).is_some() {
103-
let expanded = iter.expect_fragment(FragmentKind::Expr);
103+
let expanded = iter.expect_fragment(ParserEntryPoint::Expr);
104104
if expanded.err.is_some() {
105105
break;
106106
}
@@ -790,7 +790,7 @@ mod tests {
790790
"#,
791791
)
792792
.expand_tt("stmts!();");
793-
assert!(token_tree_to_syntax_node(&expansion, FragmentKind::Expr).is_err());
793+
assert!(token_tree_to_syntax_node(&expansion, ParserEntryPoint::Expr).is_err());
794794
}
795795

796796
#[test]
@@ -823,7 +823,7 @@ mod tests {
823823
let source_file = ast::SourceFile::parse("struct Foo { a: x::Y }").ok().unwrap();
824824
let struct_def = source_file.syntax().descendants().find_map(ast::Struct::cast).unwrap();
825825
let tt = syntax_node_to_token_tree(struct_def.syntax()).0;
826-
token_tree_to_syntax_node(&tt, FragmentKind::Item).unwrap();
826+
token_tree_to_syntax_node(&tt, ParserEntryPoint::Item).unwrap();
827827
}
828828

829829
#[test]

crates/mbe/src/tests.rs

+13-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::fmt::Write;
66
use syntax::{ast, AstNode, NodeOrToken, SyntaxNode, WalkEvent};
77
use test_utils::assert_eq_text;
88

9-
use crate::FragmentKind;
9+
use crate::ParserEntryPoint;
1010

1111
use super::*;
1212

@@ -44,13 +44,16 @@ macro_rules! impl_fixture {
4444
#[allow(unused)]
4545
fn expand_items(&self, invocation: &str) -> SyntaxNode {
4646
let expanded = self.expand_tt(invocation);
47-
token_tree_to_syntax_node(&expanded, FragmentKind::Items).unwrap().0.syntax_node()
47+
token_tree_to_syntax_node(&expanded, ParserEntryPoint::Items)
48+
.unwrap()
49+
.0
50+
.syntax_node()
4851
}
4952

5053
#[allow(unused)]
5154
fn expand_statements(&self, invocation: &str) -> SyntaxNode {
5255
let expanded = self.expand_tt(invocation);
53-
token_tree_to_syntax_node(&expanded, FragmentKind::Statements)
56+
token_tree_to_syntax_node(&expanded, ParserEntryPoint::Statements)
5457
.unwrap()
5558
.0
5659
.syntax_node()
@@ -59,7 +62,10 @@ macro_rules! impl_fixture {
5962
#[allow(unused)]
6063
fn expand_expr(&self, invocation: &str) -> SyntaxNode {
6164
let expanded = self.expand_tt(invocation);
62-
token_tree_to_syntax_node(&expanded, FragmentKind::Expr).unwrap().0.syntax_node()
65+
token_tree_to_syntax_node(&expanded, ParserEntryPoint::Expr)
66+
.unwrap()
67+
.0
68+
.syntax_node()
6369
}
6470

6571
#[allow(unused)]
@@ -76,17 +82,17 @@ macro_rules! impl_fixture {
7682
}
7783

7884
fn assert_expand_items(&self, invocation: &str, expected: &str) -> &$name {
79-
self.assert_expansion(FragmentKind::Items, invocation, expected);
85+
self.assert_expansion(ParserEntryPoint::Items, invocation, expected);
8086
self
8187
}
8288

8389
#[allow(unused)]
8490
fn assert_expand_statements(&self, invocation: &str, expected: &str) -> &$name {
85-
self.assert_expansion(FragmentKind::Statements, invocation, expected);
91+
self.assert_expansion(ParserEntryPoint::Statements, invocation, expected);
8692
self
8793
}
8894

89-
fn assert_expansion(&self, kind: FragmentKind, invocation: &str, expected: &str) {
95+
fn assert_expansion(&self, kind: ParserEntryPoint, invocation: &str, expected: &str) {
9096
let expanded = self.expand_tt(invocation);
9197
assert_eq!(expanded.to_string(), expected);
9298

crates/mbe/src/tests/expand.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use ::parser::FragmentKind;
1+
use ::parser::ParserEntryPoint;
22
use syntax::{
33
SyntaxKind::{ERROR, IDENT},
44
T,
@@ -55,7 +55,7 @@ macro_rules! foobar {
5555
)
5656
.expand_tt("foobar!(baz);");
5757

58-
let (node, token_map) = token_tree_to_syntax_node(&expanded, FragmentKind::Items).unwrap();
58+
let (node, token_map) = token_tree_to_syntax_node(&expanded, ParserEntryPoint::Items).unwrap();
5959
let content = node.syntax_node().to_string();
6060

6161
let get_text = |id, kind| -> String {

crates/mbe/src/tt_iter.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! A "Parser" structure for token trees. We use this when parsing a declarative
22
//! macro definition into a list of patterns and templates.
33
4-
use crate::{subtree_source::SubtreeTokenSource, ExpandError, ExpandResult};
4+
use crate::{subtree_source::SubtreeTokenSource, ExpandError, ExpandResult, ParserEntryPoint};
55

66
use parser::TreeSink;
77
use syntax::SyntaxKind;
@@ -92,7 +92,7 @@ impl<'a> TtIter<'a> {
9292

9393
pub(crate) fn expect_fragment(
9494
&mut self,
95-
fragment_kind: parser::FragmentKind,
95+
entry_point: ParserEntryPoint,
9696
) -> ExpandResult<Option<tt::TokenTree>> {
9797
struct OffsetTokenSink<'a> {
9898
cursor: Cursor<'a>,
@@ -119,10 +119,10 @@ impl<'a> TtIter<'a> {
119119
let mut src = SubtreeTokenSource::new(&buffer);
120120
let mut sink = OffsetTokenSink { cursor: buffer.begin(), error: false };
121121

122-
parser::parse_fragment(&mut src, &mut sink, fragment_kind);
122+
parser::parse(&mut src, &mut sink, entry_point);
123123

124124
let mut err = if !sink.cursor.is_root() || sink.error {
125-
Some(err!("expected {:?}", fragment_kind))
125+
Some(err!("expected {:?}", entry_point))
126126
} else {
127127
None
128128
};

crates/parser/src/grammar.rs

+17-14
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,23 @@ use crate::{
4444
TokenSet,
4545
};
4646

47-
pub(crate) fn root(p: &mut Parser) {
48-
let m = p.start();
49-
p.eat(SHEBANG);
50-
items::mod_contents(p, false);
51-
m.complete(p, SOURCE_FILE);
52-
}
53-
54-
/// Various pieces of syntax that can be parsed by macros by example
55-
pub(crate) mod fragments {
47+
pub(crate) mod entry_points {
5648
use super::*;
5749

58-
pub(crate) use super::{
59-
expressions::block_expr, paths::type_path as path, patterns::pattern_single, types::type_,
60-
};
50+
pub(crate) fn source_file(p: &mut Parser) {
51+
let m = p.start();
52+
p.eat(SHEBANG);
53+
items::mod_contents(p, false);
54+
m.complete(p, SOURCE_FILE);
55+
}
56+
57+
pub(crate) use expressions::block_expr;
58+
59+
pub(crate) use paths::type_path as path;
60+
61+
pub(crate) use patterns::pattern_single as pattern;
62+
63+
pub(crate) use types::type_;
6164

6265
pub(crate) fn expr(p: &mut Parser) {
6366
let _ = expressions::expr_with_attrs(p);
@@ -71,8 +74,8 @@ pub(crate) mod fragments {
7174
expressions::stmt(p, expressions::StmtWithSemi::Optional, false)
7275
}
7376

74-
pub(crate) fn opt_visibility(p: &mut Parser) {
75-
let _ = super::opt_visibility(p);
77+
pub(crate) fn visibility(p: &mut Parser) {
78+
let _ = opt_visibility(p);
7679
}
7780

7881
// Parse a meta item , which excluded [], e.g : #[ MetaItem ]

crates/parser/src/lib.rs

+33-33
Original file line numberDiff line numberDiff line change
@@ -71,23 +71,13 @@ pub trait TreeSink {
7171
fn error(&mut self, error: ParseError);
7272
}
7373

74-
fn parse_from_tokens<F>(token_source: &mut dyn TokenSource, tree_sink: &mut dyn TreeSink, f: F)
75-
where
76-
F: FnOnce(&mut parser::Parser),
77-
{
78-
let mut p = parser::Parser::new(token_source);
79-
f(&mut p);
80-
let events = p.finish();
81-
event::process(tree_sink, events);
82-
}
83-
84-
/// Parse given tokens into the given sink as a rust file.
85-
pub fn parse(token_source: &mut dyn TokenSource, tree_sink: &mut dyn TreeSink) {
86-
parse_from_tokens(token_source, tree_sink, grammar::root);
87-
}
88-
74+
/// rust-analyzer parser allows you to choose one of the possible entry points.
75+
///
76+
/// The primary consumer of this API are declarative macros, `$x:expr` matchers
77+
/// are implemented by calling into the parser with non-standard entry point.
8978
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
90-
pub enum FragmentKind {
79+
pub enum ParserEntryPoint {
80+
SourceFile,
9181
Path,
9282
Expr,
9383
Statement,
@@ -103,27 +93,37 @@ pub enum FragmentKind {
10393
Attr,
10494
}
10595

106-
pub fn parse_fragment(
96+
/// Parse given tokens into the given sink as a rust file.
97+
pub fn parse_source_file(token_source: &mut dyn TokenSource, tree_sink: &mut dyn TreeSink) {
98+
parse(token_source, tree_sink, ParserEntryPoint::SourceFile);
99+
}
100+
101+
pub fn parse(
107102
token_source: &mut dyn TokenSource,
108103
tree_sink: &mut dyn TreeSink,
109-
fragment_kind: FragmentKind,
104+
entry_point: ParserEntryPoint,
110105
) {
111-
let parser: fn(&'_ mut parser::Parser) = match fragment_kind {
112-
FragmentKind::Path => grammar::fragments::path,
113-
FragmentKind::Expr => grammar::fragments::expr,
114-
FragmentKind::Type => grammar::fragments::type_,
115-
FragmentKind::Pattern => grammar::fragments::pattern_single,
116-
FragmentKind::Item => grammar::fragments::item,
117-
FragmentKind::Block => grammar::fragments::block_expr,
118-
FragmentKind::Visibility => grammar::fragments::opt_visibility,
119-
FragmentKind::MetaItem => grammar::fragments::meta_item,
120-
FragmentKind::Statement => grammar::fragments::stmt,
121-
FragmentKind::StatementOptionalSemi => grammar::fragments::stmt_optional_semi,
122-
FragmentKind::Items => grammar::fragments::macro_items,
123-
FragmentKind::Statements => grammar::fragments::macro_stmts,
124-
FragmentKind::Attr => grammar::fragments::attr,
106+
let entry_point: fn(&'_ mut parser::Parser) = match entry_point {
107+
ParserEntryPoint::SourceFile => grammar::entry_points::source_file,
108+
ParserEntryPoint::Path => grammar::entry_points::path,
109+
ParserEntryPoint::Expr => grammar::entry_points::expr,
110+
ParserEntryPoint::Type => grammar::entry_points::type_,
111+
ParserEntryPoint::Pattern => grammar::entry_points::pattern,
112+
ParserEntryPoint::Item => grammar::entry_points::item,
113+
ParserEntryPoint::Block => grammar::entry_points::block_expr,
114+
ParserEntryPoint::Visibility => grammar::entry_points::visibility,
115+
ParserEntryPoint::MetaItem => grammar::entry_points::meta_item,
116+
ParserEntryPoint::Statement => grammar::entry_points::stmt,
117+
ParserEntryPoint::StatementOptionalSemi => grammar::entry_points::stmt_optional_semi,
118+
ParserEntryPoint::Items => grammar::entry_points::macro_items,
119+
ParserEntryPoint::Statements => grammar::entry_points::macro_stmts,
120+
ParserEntryPoint::Attr => grammar::entry_points::attr,
125121
};
126-
parse_from_tokens(token_source, tree_sink, parser)
122+
123+
let mut p = parser::Parser::new(token_source);
124+
entry_point(&mut p);
125+
let events = p.finish();
126+
event::process(tree_sink, events);
127127
}
128128

129129
/// A parsing function for a specific braced-block.

0 commit comments

Comments
 (0)