mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-11-01 12:24:29 +00:00
fix: Fix proc-macro API creating malformed negative literals
This commit is contained in:
parent
cb18ead726
commit
361a927a71
4 changed files with 83 additions and 27 deletions
|
|
@ -168,6 +168,26 @@ impl server::TokenStream for RaSpanServer {
|
|||
}
|
||||
|
||||
bridge::TokenTree::Literal(literal) => {
|
||||
let token_trees =
|
||||
if let Some((_minus, symbol)) = literal.symbol.as_str().split_once('-') {
|
||||
let punct = tt::Punct {
|
||||
spacing: tt::Spacing::Alone,
|
||||
span: literal.span,
|
||||
char: '-' as char,
|
||||
};
|
||||
let leaf: tt::Leaf = tt::Leaf::from(punct);
|
||||
let minus_tree = tt::TokenTree::from(leaf);
|
||||
|
||||
let literal = tt::Literal {
|
||||
symbol: Symbol::intern(symbol),
|
||||
suffix: literal.suffix,
|
||||
span: literal.span,
|
||||
kind: literal_kind_to_internal(literal.kind),
|
||||
};
|
||||
let leaf: tt::Leaf = tt::Leaf::from(literal);
|
||||
let tree = tt::TokenTree::from(leaf);
|
||||
vec![minus_tree, tree]
|
||||
} else {
|
||||
let literal = tt::Literal {
|
||||
symbol: literal.symbol,
|
||||
suffix: literal.suffix,
|
||||
|
|
@ -177,7 +197,9 @@ impl server::TokenStream for RaSpanServer {
|
|||
|
||||
let leaf: tt::Leaf = tt::Leaf::from(literal);
|
||||
let tree = tt::TokenTree::from(leaf);
|
||||
TokenStream { token_trees: vec![tree] }
|
||||
vec![tree]
|
||||
};
|
||||
TokenStream { token_trees }
|
||||
}
|
||||
|
||||
bridge::TokenTree::Punct(p) => {
|
||||
|
|
|
|||
|
|
@ -153,6 +153,26 @@ impl server::TokenStream for TokenIdServer {
|
|||
}
|
||||
|
||||
bridge::TokenTree::Literal(literal) => {
|
||||
let token_trees =
|
||||
if let Some((_minus, symbol)) = literal.symbol.as_str().split_once('-') {
|
||||
let punct = tt::Punct {
|
||||
spacing: tt::Spacing::Alone,
|
||||
span: literal.span,
|
||||
char: '-' as char,
|
||||
};
|
||||
let leaf: tt::Leaf = tt::Leaf::from(punct);
|
||||
let minus_tree = tt::TokenTree::from(leaf);
|
||||
|
||||
let literal = Literal {
|
||||
symbol: Symbol::intern(symbol),
|
||||
suffix: literal.suffix,
|
||||
span: literal.span,
|
||||
kind: literal_kind_to_internal(literal.kind),
|
||||
};
|
||||
let leaf: tt::Leaf = tt::Leaf::from(literal);
|
||||
let tree = tt::TokenTree::from(leaf);
|
||||
vec![minus_tree, tree]
|
||||
} else {
|
||||
let literal = Literal {
|
||||
symbol: literal.symbol,
|
||||
suffix: literal.suffix,
|
||||
|
|
@ -160,9 +180,11 @@ impl server::TokenStream for TokenIdServer {
|
|||
kind: literal_kind_to_internal(literal.kind),
|
||||
};
|
||||
|
||||
let leaf = tt::Leaf::from(literal);
|
||||
let tree = TokenTree::from(leaf);
|
||||
TokenStream { token_trees: vec![tree] }
|
||||
let leaf: tt::Leaf = tt::Leaf::from(literal);
|
||||
let tree = tt::TokenTree::from(leaf);
|
||||
vec![tree]
|
||||
};
|
||||
TokenStream { token_trees }
|
||||
}
|
||||
|
||||
bridge::TokenTree::Punct(p) => {
|
||||
|
|
|
|||
|
|
@ -68,6 +68,11 @@ impl<S: Copy> TokenStream<S> {
|
|||
span: ident.span,
|
||||
}))
|
||||
}
|
||||
// Note, we do not have to assemble our `-` punct and literal split into a single
|
||||
// negative bridge literal here. As the proc-macro docs state
|
||||
// > Literals created from negative numbers might not survive round-trips through
|
||||
// > TokenStream or strings and may be broken into two tokens (- and positive
|
||||
// > literal).
|
||||
tt::TokenTree::Leaf(tt::Leaf::Literal(lit)) => {
|
||||
result.push(bridge::TokenTree::Literal(bridge::Literal {
|
||||
span: lit.span,
|
||||
|
|
|
|||
|
|
@ -248,13 +248,17 @@ fn test_fn_like_mk_literals() {
|
|||
LITERAL Str string 1
|
||||
LITERAL CStr cstring 1
|
||||
LITERAL Float 3.14f64 1
|
||||
LITERAL Float -3.14f64 1
|
||||
PUNCH - [alone] 1
|
||||
LITERAL Float 3.14f64 1
|
||||
LITERAL Float 3.14 1
|
||||
PUNCH - [alone] 1
|
||||
LITERAL Float 3.14 1
|
||||
LITERAL Float -3.14 1
|
||||
LITERAL Integer 123i64 1
|
||||
LITERAL Integer -123i64 1
|
||||
PUNCH - [alone] 1
|
||||
LITERAL Integer 123i64 1
|
||||
LITERAL Integer 123 1
|
||||
LITERAL Integer -123 1"#]],
|
||||
PUNCH - [alone] 1
|
||||
LITERAL Integer 123 1"#]],
|
||||
expect![[r#"
|
||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
||||
|
||||
|
|
@ -266,13 +270,17 @@ fn test_fn_like_mk_literals() {
|
|||
LITERAL Str string 42:2@0..100#ROOT2024
|
||||
LITERAL CStr cstring 42:2@0..100#ROOT2024
|
||||
LITERAL Float 3.14f64 42:2@0..100#ROOT2024
|
||||
LITERAL Float -3.14f64 42:2@0..100#ROOT2024
|
||||
PUNCH - [alone] 42:2@0..100#ROOT2024
|
||||
LITERAL Float 3.14f64 42:2@0..100#ROOT2024
|
||||
LITERAL Float 3.14 42:2@0..100#ROOT2024
|
||||
PUNCH - [alone] 42:2@0..100#ROOT2024
|
||||
LITERAL Float 3.14 42:2@0..100#ROOT2024
|
||||
LITERAL Float -3.14 42:2@0..100#ROOT2024
|
||||
LITERAL Integer 123i64 42:2@0..100#ROOT2024
|
||||
LITERAL Integer -123i64 42:2@0..100#ROOT2024
|
||||
PUNCH - [alone] 42:2@0..100#ROOT2024
|
||||
LITERAL Integer 123i64 42:2@0..100#ROOT2024
|
||||
LITERAL Integer 123 42:2@0..100#ROOT2024
|
||||
LITERAL Integer -123 42:2@0..100#ROOT2024"#]],
|
||||
PUNCH - [alone] 42:2@0..100#ROOT2024
|
||||
LITERAL Integer 123 42:2@0..100#ROOT2024"#]],
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -400,7 +408,6 @@ fn test_fn_like_macro_clone_literals() {
|
|||
);
|
||||
}
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_fn_like_macro_negative_literals() {
|
||||
assert_expand(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue