Add hack to keep actix-web
and actori-web
compiling
This extends the existing `ident_name_compatibility_hack` to handle the `tuple_from_req` macro defined in `actix-web` (and its fork `actori-web`).
This commit is contained in:
parent
477ce31d37
commit
9a6ea38647
8 changed files with 77 additions and 5 deletions
|
@ -810,10 +810,10 @@ impl Nonterminal {
|
||||||
if let ExpnKind::Macro(_, macro_name) = orig_span.ctxt().outer_expn_data().kind {
|
if let ExpnKind::Macro(_, macro_name) = orig_span.ctxt().outer_expn_data().kind {
|
||||||
let filename = source_map.span_to_filename(orig_span);
|
let filename = source_map.span_to_filename(orig_span);
|
||||||
if let FileName::Real(RealFileName::Named(path)) = filename {
|
if let FileName::Real(RealFileName::Named(path)) = filename {
|
||||||
let matches_prefix = |prefix| {
|
let matches_prefix = |prefix, filename| {
|
||||||
// Check for a path that ends with 'prefix*/src/lib.rs'
|
// Check for a path that ends with 'prefix*/src/<filename>'
|
||||||
let mut iter = path.components().rev();
|
let mut iter = path.components().rev();
|
||||||
iter.next().and_then(|p| p.as_os_str().to_str()) == Some("lib.rs")
|
iter.next().and_then(|p| p.as_os_str().to_str()) == Some(filename)
|
||||||
&& iter.next().and_then(|p| p.as_os_str().to_str()) == Some("src")
|
&& iter.next().and_then(|p| p.as_os_str().to_str()) == Some("src")
|
||||||
&& iter
|
&& iter
|
||||||
.next()
|
.next()
|
||||||
|
@ -821,14 +821,25 @@ impl Nonterminal {
|
||||||
.map_or(false, |p| p.starts_with(prefix))
|
.map_or(false, |p| p.starts_with(prefix))
|
||||||
};
|
};
|
||||||
|
|
||||||
if (macro_name == sym::impl_macros && matches_prefix("time-macros-impl"))
|
if (macro_name == sym::impl_macros
|
||||||
|| (macro_name == sym::arrays && matches_prefix("js-sys"))
|
&& matches_prefix("time-macros-impl", "lib.rs"))
|
||||||
|
|| (macro_name == sym::arrays && matches_prefix("js-sys", "lib.rs"))
|
||||||
{
|
{
|
||||||
let snippet = source_map.span_to_snippet(orig_span);
|
let snippet = source_map.span_to_snippet(orig_span);
|
||||||
if snippet.as_deref() == Ok("$name") {
|
if snippet.as_deref() == Ok("$name") {
|
||||||
return Some((*ident, *is_raw));
|
return Some((*ident, *is_raw));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if macro_name == sym::tuple_from_req
|
||||||
|
&& (matches_prefix("actix-web", "extract.rs")
|
||||||
|
|| matches_prefix("actori-web", "extract.rs"))
|
||||||
|
{
|
||||||
|
let snippet = source_map.span_to_snippet(orig_span);
|
||||||
|
if snippet.as_deref() == Ok("$T") {
|
||||||
|
return Some((*ident, *is_raw));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1114,6 +1114,7 @@ symbols! {
|
||||||
try_trait,
|
try_trait,
|
||||||
tt,
|
tt,
|
||||||
tuple,
|
tuple,
|
||||||
|
tuple_from_req,
|
||||||
tuple_indexing,
|
tuple_indexing,
|
||||||
two_phase,
|
two_phase,
|
||||||
ty,
|
ty,
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
// ignore-test this is not a test
|
||||||
|
|
||||||
|
macro_rules! tuple_from_req {
|
||||||
|
($T:ident) => {
|
||||||
|
#[my_macro] struct Three($T);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
// ignore-test this is not a test
|
||||||
|
|
||||||
|
macro_rules! tuple_from_req {
|
||||||
|
($T:ident) => {
|
||||||
|
#[my_macro] struct Three($T);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
// ignore-test this is not a test
|
||||||
|
|
||||||
|
macro_rules! tuple_from_req {
|
||||||
|
($T:ident) => {
|
||||||
|
#[my_macro] struct Four($T);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
// ignore-test this is not a test
|
||||||
|
|
||||||
|
macro_rules! tuple_from_req {
|
||||||
|
($T:ident) => {
|
||||||
|
#[my_macro] struct Four($T);
|
||||||
|
}
|
||||||
|
}
|
|
@ -45,5 +45,33 @@ mod with_version {
|
||||||
other!(Foo);
|
other!(Foo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod actix_web_test {
|
||||||
|
include!("actix-web/src/extract.rs");
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
tuple_from_req!(Foo);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod actix_web_version_test {
|
||||||
|
include!("actix-web-2.0.0/src/extract.rs");
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
tuple_from_req!(Foo);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod actori_web_test {
|
||||||
|
include!("actori-web/src/extract.rs");
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
tuple_from_req!(Foo);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod actori_web_version_test {
|
||||||
|
include!("actori-web-2.0.0/src/extract.rs");
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
tuple_from_req!(Foo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -4,3 +4,7 @@ Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/gro
|
||||||
Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:21: 5:27 (#20) }, Ident { ident: "One", span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:28: 5:31 (#20) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:43:18: 43:21 (#0) }], span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:31: 5:38 (#20) }, Punct { ch: ';', spacing: Alone, span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:38: 5:39 (#20) }]
|
Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:21: 5:27 (#20) }, Ident { ident: "One", span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:28: 5:31 (#20) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:43:18: 43:21 (#0) }], span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:31: 5:38 (#20) }, Punct { ch: ';', spacing: Alone, span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:38: 5:39 (#20) }]
|
||||||
Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/js-sys-0.3.17/src/lib.rs:5:21: 5:27 (#24) }, Ident { ident: "Two", span: $DIR/js-sys-0.3.17/src/lib.rs:5:28: 5:31 (#24) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:44:13: 44:16 (#0) }], span: $DIR/js-sys-0.3.17/src/lib.rs:5:31: 5:38 (#24) }, Punct { ch: ';', spacing: Alone, span: $DIR/js-sys-0.3.17/src/lib.rs:5:38: 5:39 (#24) }]
|
Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/js-sys-0.3.17/src/lib.rs:5:21: 5:27 (#24) }, Ident { ident: "Two", span: $DIR/js-sys-0.3.17/src/lib.rs:5:28: 5:31 (#24) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:44:13: 44:16 (#0) }], span: $DIR/js-sys-0.3.17/src/lib.rs:5:31: 5:38 (#24) }, Punct { ch: ';', spacing: Alone, span: $DIR/js-sys-0.3.17/src/lib.rs:5:38: 5:39 (#24) }]
|
||||||
Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/group-compat-hack.rs:38:25: 38:31 (#28) }, Ident { ident: "Three", span: $DIR/group-compat-hack.rs:38:32: 38:37 (#28) }, Group { delimiter: Parenthesis, stream: TokenStream [Group { delimiter: None, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:45:12: 45:15 (#0) }], span: $DIR/group-compat-hack.rs:38:38: 38:43 (#28) }], span: $DIR/group-compat-hack.rs:38:37: 38:44 (#28) }, Punct { ch: ';', spacing: Alone, span: $DIR/group-compat-hack.rs:38:44: 38:45 (#28) }]
|
Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/group-compat-hack.rs:38:25: 38:31 (#28) }, Ident { ident: "Three", span: $DIR/group-compat-hack.rs:38:32: 38:37 (#28) }, Group { delimiter: Parenthesis, stream: TokenStream [Group { delimiter: None, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:45:12: 45:15 (#0) }], span: $DIR/group-compat-hack.rs:38:38: 38:43 (#28) }], span: $DIR/group-compat-hack.rs:38:37: 38:44 (#28) }, Punct { ch: ';', spacing: Alone, span: $DIR/group-compat-hack.rs:38:44: 38:45 (#28) }]
|
||||||
|
Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actix-web/src/extract.rs:5:21: 5:27 (#33) }, Ident { ident: "Three", span: $DIR/actix-web/src/extract.rs:5:28: 5:33 (#33) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:52:21: 52:24 (#0) }], span: $DIR/actix-web/src/extract.rs:5:33: 5:37 (#33) }, Punct { ch: ';', spacing: Alone, span: $DIR/actix-web/src/extract.rs:5:37: 5:38 (#33) }]
|
||||||
|
Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actix-web-2.0.0/src/extract.rs:5:21: 5:27 (#38) }, Ident { ident: "Three", span: $DIR/actix-web-2.0.0/src/extract.rs:5:28: 5:33 (#38) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:59:21: 59:24 (#0) }], span: $DIR/actix-web-2.0.0/src/extract.rs:5:33: 5:37 (#38) }, Punct { ch: ';', spacing: Alone, span: $DIR/actix-web-2.0.0/src/extract.rs:5:37: 5:38 (#38) }]
|
||||||
|
Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actori-web/src/extract.rs:5:21: 5:27 (#43) }, Ident { ident: "Four", span: $DIR/actori-web/src/extract.rs:5:28: 5:32 (#43) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:66:21: 66:24 (#0) }], span: $DIR/actori-web/src/extract.rs:5:32: 5:36 (#43) }, Punct { ch: ';', spacing: Alone, span: $DIR/actori-web/src/extract.rs:5:36: 5:37 (#43) }]
|
||||||
|
Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actori-web-2.0.0/src/extract.rs:5:21: 5:27 (#48) }, Ident { ident: "Four", span: $DIR/actori-web-2.0.0/src/extract.rs:5:28: 5:32 (#48) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:73:21: 73:24 (#0) }], span: $DIR/actori-web-2.0.0/src/extract.rs:5:32: 5:36 (#48) }, Punct { ch: ';', spacing: Alone, span: $DIR/actori-web-2.0.0/src/extract.rs:5:36: 5:37 (#48) }]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue