Skip to content

Commit 1ab78d6

Browse files
committed
Fix literal support in token tree to ast item list
1 parent be9a44e commit 1ab78d6

File tree

4 files changed

+45
-4
lines changed

4 files changed

+45
-4
lines changed

crates/ra_mbe/src/lib.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,4 +337,45 @@ SOURCE_FILE@[0; 40)
337337
);
338338
}
339339

340+
#[test]
341+
fn expand_literals_to_item_list() {
342+
fn to_subtree(tt: &tt::TokenTree) -> &tt::Subtree {
343+
if let tt::TokenTree::Subtree(subtree) = tt {
344+
return &subtree;
345+
}
346+
assert!(false, "It is not a subtree");
347+
unreachable!();
348+
}
349+
350+
fn to_literal(tt: &tt::TokenTree) -> &tt::Literal {
351+
if let tt::TokenTree::Leaf(tt::Leaf::Literal(lit)) = tt {
352+
return lit;
353+
}
354+
assert!(false, "It is not a literal");
355+
unreachable!();
356+
}
357+
358+
let rules = create_rules(
359+
r#"
360+
macro_rules! literals {
361+
($i:ident) => {
362+
{
363+
let a = 'c';
364+
let c = 1000;
365+
let f = 12E+99_f64;
366+
}
367+
}
368+
}
369+
"#,
370+
);
371+
let expansion = expand(&rules, "literals!(foo)");
372+
let stm_tokens = &to_subtree(&expansion.token_trees[0]).token_trees;
373+
374+
// [let] [a] [=] ['c'] [;]
375+
assert_eq!(to_literal(&stm_tokens[3]).text, "'c'");
376+
// [let] [c] [=] [1000] [;]
377+
assert_eq!(to_literal(&stm_tokens[5 + 3]).text, "1000");
378+
// [let] [f] [=] [12E+99_f64] [;]
379+
assert_eq!(to_literal(&stm_tokens[10 + 3]).text, "12E+99_f64");
380+
}
340381
}

crates/ra_mbe/src/syntax_bridge.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use ra_parser::{TokenSource, TreeSink, ParseError};
22
use ra_syntax::{
33
AstNode, SyntaxNode, TextRange, SyntaxKind, SmolStr, SyntaxTreeBuilder, TreeArc, SyntaxElement,
4-
ast, SyntaxKind::*, TextUnit
4+
ast, SyntaxKind::*, TextUnit, next_token
55
};
66

77
/// Maps `tt::TokenId` to the relative range of the original token.
@@ -189,7 +189,7 @@ impl TtTokenSource {
189189
{
190190
let tok = match token {
191191
tt::Leaf::Literal(l) => TtToken {
192-
kind: SyntaxKind::INT_NUMBER, // FIXME
192+
kind: next_token(&l.text).kind,
193193
is_joint_to_next: false,
194194
text: l.text.clone(),
195195
},

crates/ra_syntax/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub use crate::{
4040
syntax_text::SyntaxText,
4141
syntax_node::{Direction, SyntaxNode, WalkEvent, TreeArc, SyntaxTreeBuilder, SyntaxElement, SyntaxToken},
4242
ptr::{SyntaxNodePtr, AstPtr},
43-
parsing::{tokenize, Token},
43+
parsing::{tokenize, next_token, Token},
4444
};
4545

4646
use ra_text_edit::AtomTextEdit;

crates/ra_syntax/src/parsing.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
syntax_node::GreenNode,
1212
};
1313

14-
pub use self::lexer::{tokenize, Token};
14+
pub use self::lexer::{tokenize, next_token, Token};
1515

1616
pub(crate) use self::reparsing::incremental_reparse;
1717

0 commit comments

Comments
 (0)