mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Stabilize Ident::new_raw
Tracking issue: #54723 This is a continuation of PR #59002
This commit is contained in:
parent
c186aed59a
commit
6deda6a6a0
@ -848,7 +848,7 @@ impl Ident {
|
||||
/// Creates a new `Ident` with the given `string` as well as the specified
|
||||
/// `span`.
|
||||
/// The `string` argument must be a valid identifier permitted by the
|
||||
/// language, otherwise the function will panic.
|
||||
/// language (including keywords, e.g. `self` or `fn`). Otherwise, the function will panic.
|
||||
///
|
||||
/// Note that `span`, currently in rustc, configures the hygiene information
|
||||
/// for this identifier.
|
||||
@ -870,7 +870,10 @@ impl Ident {
|
||||
}
|
||||
|
||||
/// Same as `Ident::new`, but creates a raw identifier (`r#ident`).
|
||||
#[unstable(feature = "proc_macro_raw_ident", issue = "54723")]
|
||||
/// The `string` argument be a valid identifier permitted by the language
|
||||
/// (including keywords, e.g. `fn`). Keywords which are usable in path segments
|
||||
/// (e.g. `self`, `super`) are not supported, and will cause a panic.
|
||||
#[stable(feature = "proc_macro_raw_ident", since = "1.47.0")]
|
||||
pub fn new_raw(string: &str, span: Span) -> Ident {
|
||||
Ident(bridge::client::Ident::new(string, span.0, true))
|
||||
}
|
||||
|
35
src/test/ui/proc-macro/auxiliary/raw-ident.rs
Normal file
35
src/test/ui/proc-macro/auxiliary/raw-ident.rs
Normal file
@ -0,0 +1,35 @@
|
||||
// force-host
|
||||
// no-prefer-dynamic
|
||||
|
||||
#![crate_type = "proc-macro"]
|
||||
|
||||
extern crate proc_macro;
|
||||
use proc_macro::{TokenStream, TokenTree, Ident, Punct, Spacing, Span};
|
||||
|
||||
#[proc_macro]
|
||||
pub fn make_struct(input: TokenStream) -> TokenStream {
|
||||
match input.into_iter().next().unwrap() {
|
||||
TokenTree::Ident(ident) => {
|
||||
vec![
|
||||
TokenTree::Ident(Ident::new("struct", Span::call_site())),
|
||||
TokenTree::Ident(Ident::new_raw(&ident.to_string(), Span::call_site())),
|
||||
TokenTree::Punct(Punct::new(';', Spacing::Alone))
|
||||
].into_iter().collect()
|
||||
}
|
||||
_ => panic!()
|
||||
}
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
pub fn make_bad_struct(input: TokenStream) -> TokenStream {
|
||||
match input.into_iter().next().unwrap() {
|
||||
TokenTree::Ident(ident) => {
|
||||
vec![
|
||||
TokenTree::Ident(Ident::new_raw("struct", Span::call_site())),
|
||||
TokenTree::Ident(Ident::new(&ident.to_string(), Span::call_site())),
|
||||
TokenTree::Punct(Punct::new(';', Spacing::Alone))
|
||||
].into_iter().collect()
|
||||
}
|
||||
_ => panic!()
|
||||
}
|
||||
}
|
16
src/test/ui/proc-macro/raw-ident.rs
Normal file
16
src/test/ui/proc-macro/raw-ident.rs
Normal file
@ -0,0 +1,16 @@
|
||||
// aux-build:raw-ident.rs
|
||||
|
||||
#[macro_use] extern crate raw_ident;
|
||||
|
||||
fn main() {
|
||||
make_struct!(fn);
|
||||
make_struct!(Foo);
|
||||
make_struct!(await);
|
||||
|
||||
r#fn;
|
||||
r#Foo;
|
||||
Foo;
|
||||
r#await;
|
||||
|
||||
make_bad_struct!(S); //~ ERROR expected one of
|
||||
}
|
10
src/test/ui/proc-macro/raw-ident.stderr
Normal file
10
src/test/ui/proc-macro/raw-ident.stderr
Normal file
@ -0,0 +1,10 @@
|
||||
error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `S`
|
||||
--> $DIR/raw-ident.rs:15:5
|
||||
|
|
||||
LL | make_bad_struct!(S);
|
||||
| ^^^^^^^^^^^^^^^^^^^^ expected one of 8 possible tokens
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user