mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-14 14:13:58 +00:00
Add regression tests
This commit is contained in:
parent
0ec2911857
commit
a4d0b5c522
2 changed files with 90 additions and 2 deletions
|
@ -6,7 +6,7 @@ use rustc_hash::FxHashMap;
|
||||||
use test_utils::{
|
use test_utils::{
|
||||||
extract_range_or_offset, Fixture, RangeOrOffset, CURSOR_MARKER, ESCAPED_CURSOR_MARKER,
|
extract_range_or_offset, Fixture, RangeOrOffset, CURSOR_MARKER, ESCAPED_CURSOR_MARKER,
|
||||||
};
|
};
|
||||||
use tt::token_id::Subtree;
|
use tt::token_id::{Leaf, Subtree, TokenTree};
|
||||||
use vfs::{file_set::FileSet, VfsPath};
|
use vfs::{file_set::FileSet, VfsPath};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -310,7 +310,7 @@ impl ChangeFixture {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default_test_proc_macros() -> [(String, ProcMacro); 4] {
|
fn default_test_proc_macros() -> [(String, ProcMacro); 5] {
|
||||||
[
|
[
|
||||||
(
|
(
|
||||||
r#"
|
r#"
|
||||||
|
@ -368,6 +368,20 @@ pub fn mirror(input: TokenStream) -> TokenStream {
|
||||||
expander: Arc::new(MirrorProcMacroExpander),
|
expander: Arc::new(MirrorProcMacroExpander),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
r#"
|
||||||
|
#[proc_macro]
|
||||||
|
pub fn shorten(input: TokenStream) -> TokenStream {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
"#
|
||||||
|
.into(),
|
||||||
|
ProcMacro {
|
||||||
|
name: "shorten".into(),
|
||||||
|
kind: crate::ProcMacroKind::FuncLike,
|
||||||
|
expander: Arc::new(ShortenProcMacroExpander),
|
||||||
|
},
|
||||||
|
),
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,3 +522,47 @@ impl ProcMacroExpander for MirrorProcMacroExpander {
|
||||||
Ok(traverse(input))
|
Ok(traverse(input))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Replaces every literal with an empty string literal and every identifier with its first letter,
|
||||||
|
// but retains all tokens' span. Useful for testing we don't assume token hasn't been modified by
|
||||||
|
// macros even if it retains its span.
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct ShortenProcMacroExpander;
|
||||||
|
impl ProcMacroExpander for ShortenProcMacroExpander {
|
||||||
|
fn expand(
|
||||||
|
&self,
|
||||||
|
input: &Subtree,
|
||||||
|
_: Option<&Subtree>,
|
||||||
|
_: &Env,
|
||||||
|
) -> Result<Subtree, ProcMacroExpansionError> {
|
||||||
|
return Ok(traverse(input));
|
||||||
|
|
||||||
|
fn traverse(input: &Subtree) -> Subtree {
|
||||||
|
let token_trees = input
|
||||||
|
.token_trees
|
||||||
|
.iter()
|
||||||
|
.map(|it| match it {
|
||||||
|
TokenTree::Leaf(leaf) => tt::TokenTree::Leaf(modify_leaf(leaf)),
|
||||||
|
TokenTree::Subtree(subtree) => tt::TokenTree::Subtree(traverse(subtree)),
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
Subtree { delimiter: input.delimiter, token_trees }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn modify_leaf(leaf: &Leaf) -> Leaf {
|
||||||
|
let mut leaf = leaf.clone();
|
||||||
|
match &mut leaf {
|
||||||
|
Leaf::Literal(it) => {
|
||||||
|
// XXX Currently replaces any literals with an empty string, but supporting
|
||||||
|
// "shortening" other literals would be nice.
|
||||||
|
it.text = "\"\"".into();
|
||||||
|
}
|
||||||
|
Leaf::Punct(_) => {}
|
||||||
|
Leaf::Ident(it) => {
|
||||||
|
it.text = it.text.chars().take(1).collect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
leaf
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -131,3 +131,33 @@ fn main() {}
|
||||||
"#]],
|
"#]],
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn issue_13836_str() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
//- proc_macros: shorten
|
||||||
|
fn main() {
|
||||||
|
let s = proc_macros::shorten!("text.$0");
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
expect![[r#""#]],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn issue_13836_ident() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
//- proc_macros: shorten
|
||||||
|
struct S;
|
||||||
|
impl S {
|
||||||
|
fn foo(&self) {}
|
||||||
|
}
|
||||||
|
fn main() {
|
||||||
|
let s = proc_macros::shorten!(S.fo$0);
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
expect![[r#""#]],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue