-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Add unstable Literal::subspan(). #56120
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
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