-
Notifications
You must be signed in to change notification settings - Fork 13k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add unstable Literal::subspan(). #56120
Conversation
02b9a71
to
09e7051
Compare
@bors: r+ This is unstable, helps unblock other PRs, is within the ballpark of what we'd like to stabilize long-term, and looks solid enough for immediate use. Sounds good to me! |
📌 Commit 09e7051 has been approved by |
// `self.span()` actually maps to, so this method can currently only be | ||
// called blindly. For example, `to_string()` for the character 'c' returns | ||
// "'\u{63}'"; there is no way for the user to know whether the source text | ||
// was 'c' or whether it was '\u{63}'. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this is correct. Literal::to_string
should show the exact source contents, if the literal isn't synthetic.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is correct. Try:
extern crate proc_macro;
use crate::proc_macro::Literal;
use crate::proc_macro::TokenStream;
#[proc_macro]
pub fn go(_: TokenStream) -> TokenStream {
let literal = Literal::string("hel\u{6c}o");
println!("literal: {}", literal.to_string());
let literal = Literal::character('c');
println!("literal: {}", literal.to_string());
let literal = Literal::character(100 as char);
println!("literal: {}", literal.to_string());
let literal = Literal::byte_string(b"hello");
println!("literal: {}", literal.to_string());
let literal = Literal::byte_string(b"he\x42");
println!("literal: {}", literal.to_string());
let literal = Literal::byte_string(&['h' as u8, 'e' as u8, ]);
println!("literal: {}", literal.to_string());
let literal = Literal::f32_unsuffixed(1.0);
println!("literal: {}", literal.to_string());
let literal = Literal::f32_unsuffixed(1.134100000022);
println!("literal: {}", literal.to_string());
TokenStream::new()
}
Edit: This may be different if the Literal
comes from a TokenStream
parsed from source. Nevertheless, this method needs to be correct regardless of where the Literal
comes from.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If it's synthetic then the span doesn't matter, I was talking about Literal
s from the source. But also, we shouldn't be using escape_unicode
like that.
Add unstable Literal::subspan(). Take 2 of rust-lang#55971. Still ~wrong, but now with a comment! (and less of a surface) Unblocks rust-lang#49219. r? @alexcrichton
Rollup of 14 pull requests Successful merges: - #55767 (Disable some pretty-printers when gdb is rust-enabled) - #55838 (Fix #[cfg] for step impl on ranges) - #55869 (Add std::iter::unfold) - #55945 (Ensure that the argument to `static_assert` is a `bool`) - #56022 (When popping in CTFE, perform validation before jumping to next statement to have a better span for the error) - #56048 (Add rustc_codegen_ssa to sysroot) - #56091 (Fix json output in the self-profiler) - #56097 (Fix invalid bitcast taking bool out of a union represented as a scalar) - #56116 (ci: Download clang/lldb from tarballs) - #56120 (Add unstable Literal::subspan().) - #56154 (Pass additional linker flags when targeting Fuchsia) - #56162 (std::str Adapt documentation to reality) - #56163 ([master] Backport 1.30.1 release notes) - #56168 (Fix the tracking issue for hash_raw_entry) Failed merges: r? @ghost
Take 2 of #55971. Still ~wrong, but now with a comment! (and less of a surface) Unblocks #49219.
r? @alexcrichton