Skip to content

Commit 1918f9b

Browse files
committed
Address PR comments
1 parent cdb8a88 commit 1918f9b

File tree

4 files changed

+79
-59
lines changed

4 files changed

+79
-59
lines changed

crates/proc-macro-srv/src/server.rs

Lines changed: 24 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub mod rust_analyzer_span;
1717
mod symbol;
1818
pub mod token_id;
1919
pub use symbol::*;
20-
use syntax::ast::{self, HasModuleItem, IsString};
20+
use syntax::ast::{self, IsString};
2121
use tt::Spacing;
2222

2323
fn delim_to_internal<S>(d: proc_macro::Delimiter, span: bridge::DelimSpan<S>) -> tt::Delimiter<S> {
@@ -56,50 +56,29 @@ fn spacing_to_external(spacing: Spacing) -> proc_macro::Spacing {
5656
}
5757

5858
fn literal_to_external(literal_kind: ast::LiteralKind) -> Option<proc_macro::bridge::LitKind> {
59-
Some(match literal_kind {
60-
ast::LiteralKind::String(data) => {
61-
if data.is_raw() {
62-
bridge::LitKind::StrRaw(data.raw_delimiter_count()?)
63-
} else {
64-
bridge::LitKind::Str
65-
}
66-
}
67-
ast::LiteralKind::ByteString(data) => {
68-
if data.is_raw() {
69-
bridge::LitKind::ByteStrRaw(data.raw_delimiter_count()?)
70-
} else {
71-
bridge::LitKind::ByteStr
72-
}
73-
}
74-
ast::LiteralKind::CString(data) => {
75-
if data.is_raw() {
76-
bridge::LitKind::CStrRaw(data.raw_delimiter_count()?)
77-
} else {
78-
bridge::LitKind::CStr
79-
}
80-
}
81-
ast::LiteralKind::IntNumber(_) => bridge::LitKind::Integer,
82-
ast::LiteralKind::FloatNumber(_) => bridge::LitKind::Float,
83-
ast::LiteralKind::Char(_) => bridge::LitKind::Char,
84-
ast::LiteralKind::Byte(_) => bridge::LitKind::Byte,
85-
ast::LiteralKind::Bool(_) => unreachable!(),
86-
})
87-
}
88-
89-
fn str_to_lit_node(input: &str) -> Option<ast::Literal> {
90-
let input = input.trim();
91-
let source_code = format!("fn f() {{ let _ = {input}; }}");
92-
93-
let parse = ast::SourceFile::parse(&source_code);
94-
let file = parse.tree();
95-
96-
let ast::Item::Fn(func) = file.items().next()? else { return None };
97-
let ast::Stmt::LetStmt(stmt) = func.body()?.stmt_list()?.statements().next()? else {
98-
return None;
99-
};
100-
let ast::Expr::Literal(lit) = stmt.initializer()? else { return None };
101-
102-
Some(lit)
59+
match literal_kind {
60+
ast::LiteralKind::String(data) => Some(if data.is_raw() {
61+
bridge::LitKind::StrRaw(data.raw_delimiter_count()?)
62+
} else {
63+
bridge::LitKind::Str
64+
}),
65+
66+
ast::LiteralKind::ByteString(data) => Some(if data.is_raw() {
67+
bridge::LitKind::ByteStrRaw(data.raw_delimiter_count()?)
68+
} else {
69+
bridge::LitKind::ByteStr
70+
}),
71+
ast::LiteralKind::CString(data) => Some(if data.is_raw() {
72+
bridge::LitKind::CStrRaw(data.raw_delimiter_count()?)
73+
} else {
74+
bridge::LitKind::CStr
75+
}),
76+
ast::LiteralKind::IntNumber(_) => Some(bridge::LitKind::Integer),
77+
ast::LiteralKind::FloatNumber(_) => Some(bridge::LitKind::Float),
78+
ast::LiteralKind::Char(_) => Some(bridge::LitKind::Char),
79+
ast::LiteralKind::Byte(_) => Some(bridge::LitKind::Byte),
80+
ast::LiteralKind::Bool(_) => None,
81+
}
10382
}
10483

10584
struct LiteralFormatter<S>(bridge::Literal<S, Symbol>);

crates/proc-macro-srv/src/server/rust_analyzer_span.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ use std::{
1313
use ::tt::{TextRange, TextSize};
1414
use proc_macro::bridge::{self, server};
1515
use span::{Span, FIXUP_ERASED_FILE_AST_ID_MARKER};
16-
use syntax::ast;
16+
use syntax::ast::{self, IsString};
1717

1818
use crate::server::{
19-
delim_to_external, delim_to_internal, literal_to_external, str_to_lit_node,
20-
token_stream::TokenStreamBuilder, LiteralFormatter, Symbol, SymbolInternerRef, SYMBOL_INTERNER,
19+
delim_to_external, delim_to_internal, literal_to_external, token_stream::TokenStreamBuilder,
20+
LiteralFormatter, Symbol, SymbolInternerRef, SYMBOL_INTERNER,
2121
};
2222
mod tt {
2323
pub use ::tt::*;
@@ -71,7 +71,8 @@ impl server::FreeFunctions for RaSpanServer {
7171
&mut self,
7272
s: &str,
7373
) -> Result<bridge::Literal<Self::Span, Self::Symbol>, ()> {
74-
let literal = str_to_lit_node(s).ok_or(())?;
74+
let literal = ast::Literal::parse(s);
75+
let literal = literal.tree();
7576

7677
let kind = literal_to_external(literal.kind()).ok_or(())?;
7778

@@ -80,12 +81,22 @@ impl server::FreeFunctions for RaSpanServer {
8081
ast::LiteralKind::FloatNumber(num) => num.suffix().map(ToString::to_string),
8182
ast::LiteralKind::IntNumber(num) => num.suffix().map(ToString::to_string),
8283
_ => None,
83-
}
84-
.map(|suffix| Symbol::intern(self.interner, &suffix));
84+
};
85+
86+
let text = match literal.kind() {
87+
ast::LiteralKind::String(data) => data.text_without_quotes().to_string(),
88+
ast::LiteralKind::ByteString(data) => data.text_without_quotes().to_string(),
89+
ast::LiteralKind::CString(data) => data.text_without_quotes().to_string(),
90+
_ => s.to_string(),
91+
};
92+
let text = if let Some(ref suffix) = suffix { text.strip_suffix(suffix) } else { None }
93+
.unwrap_or(&text);
94+
95+
let suffix = suffix.map(|suffix| Symbol::intern(self.interner, &suffix));
8596

8697
Ok(bridge::Literal {
8798
kind,
88-
symbol: Symbol::intern(self.interner, s),
99+
symbol: Symbol::intern(self.interner, text),
89100
suffix,
90101
span: self.call_site,
91102
})

crates/proc-macro-srv/src/server/token_id.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ use std::{
66
};
77

88
use proc_macro::bridge::{self, server};
9-
use syntax::ast;
9+
use syntax::ast::{self, IsString};
1010

1111
use crate::server::{
12-
delim_to_external, delim_to_internal, literal_to_external, str_to_lit_node,
13-
token_stream::TokenStreamBuilder, LiteralFormatter, Symbol, SymbolInternerRef, SYMBOL_INTERNER,
12+
delim_to_external, delim_to_internal, literal_to_external, token_stream::TokenStreamBuilder,
13+
LiteralFormatter, Symbol, SymbolInternerRef, SYMBOL_INTERNER,
1414
};
1515
mod tt {
1616
pub use proc_macro_api::msg::TokenId;
@@ -63,7 +63,8 @@ impl server::FreeFunctions for TokenIdServer {
6363
&mut self,
6464
s: &str,
6565
) -> Result<bridge::Literal<Self::Span, Self::Symbol>, ()> {
66-
let literal = str_to_lit_node(s).ok_or(())?;
66+
let literal = ast::Literal::parse(s);
67+
let literal = literal.tree();
6768

6869
let kind = literal_to_external(literal.kind()).ok_or(())?;
6970

@@ -72,12 +73,22 @@ impl server::FreeFunctions for TokenIdServer {
7273
ast::LiteralKind::FloatNumber(num) => num.suffix().map(ToString::to_string),
7374
ast::LiteralKind::IntNumber(num) => num.suffix().map(ToString::to_string),
7475
_ => None,
75-
}
76-
.map(|suffix| Symbol::intern(self.interner, &suffix));
76+
};
77+
78+
let text = match literal.kind() {
79+
ast::LiteralKind::String(data) => data.text_without_quotes().to_string(),
80+
ast::LiteralKind::ByteString(data) => data.text_without_quotes().to_string(),
81+
ast::LiteralKind::CString(data) => data.text_without_quotes().to_string(),
82+
_ => s.to_string(),
83+
};
84+
let text = if let Some(ref suffix) = suffix { text.strip_suffix(suffix) } else { None }
85+
.unwrap_or(&text);
86+
87+
let suffix = suffix.map(|suffix| Symbol::intern(self.interner, &suffix));
7788

7889
Ok(bridge::Literal {
7990
kind,
80-
symbol: Symbol::intern(self.interner, s),
91+
symbol: Symbol::intern(self.interner, text),
8192
suffix,
8293
span: self.call_site,
8394
})

crates/syntax/src/lib.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,25 @@ impl SourceFile {
187187
}
188188
}
189189

190+
impl ast::Literal {
191+
pub fn parse(text: &str) -> Parse<ast::Literal> {
192+
let lexed = parser::LexedStr::new(text);
193+
let parser_input = lexed.to_input();
194+
let parser_output = parser::TopEntryPoint::Expr.parse(&parser_input);
195+
let (green, mut errors, _) = parsing::build_tree(lexed, parser_output);
196+
let root = SyntaxNode::new_root(green.clone());
197+
198+
errors.extend(validation::validate(&root));
199+
200+
assert_eq!(root.kind(), SyntaxKind::LITERAL);
201+
Parse {
202+
green,
203+
errors: if errors.is_empty() { None } else { Some(errors.into()) },
204+
_ty: PhantomData,
205+
}
206+
}
207+
}
208+
190209
impl ast::TokenTree {
191210
pub fn reparse_as_comma_separated_expr(self) -> Parse<ast::MacroEagerInput> {
192211
let tokens = self.syntax().descendants_with_tokens().filter_map(NodeOrToken::into_token);

0 commit comments

Comments
 (0)