mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-27 12:29:21 +00:00
Auto merge of #16446 - Tyrubias:literal_from_str, r=Veykril
Implement `literal_from_str` for proc macro server Closes #16233 Todos and unanswered questions: - [x] Is this the correct approach? Can both the legacy and `rust_analyzer_span` servers depend on the `syntax` crate? - [ ] How should we handle suffixes for string literals? It doesn't seem like `rust-analyzer` preservers suffix information after parsing. - [x] Why are the `expect` tests failing? Specifically `test_fn_like_macro_clone_literals`
This commit is contained in:
commit
925705e0c9
7 changed files with 119 additions and 12 deletions
|
@ -182,6 +182,28 @@ impl SourceFile {
|
|||
}
|
||||
}
|
||||
|
||||
impl ast::Literal {
|
||||
pub fn parse(text: &str) -> Option<Parse<ast::Literal>> {
|
||||
let lexed = parser::LexedStr::new(text);
|
||||
let parser_input = lexed.to_input();
|
||||
let parser_output = parser::TopEntryPoint::Expr.parse(&parser_input);
|
||||
let (green, mut errors, _) = parsing::build_tree(lexed, parser_output);
|
||||
let root = SyntaxNode::new_root(green.clone());
|
||||
|
||||
errors.extend(validation::validate(&root));
|
||||
|
||||
if root.kind() == SyntaxKind::LITERAL {
|
||||
Some(Parse {
|
||||
green,
|
||||
errors: if errors.is_empty() { None } else { Some(errors.into()) },
|
||||
_ty: PhantomData,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ast::TokenTree {
|
||||
pub fn reparse_as_comma_separated_expr(self) -> Parse<ast::MacroEagerInput> {
|
||||
let tokens = self.syntax().descendants_with_tokens().filter_map(NodeOrToken::into_token);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue