Skip to content

Commit

Permalink
Correctly escape strings in our quote macro
Browse files Browse the repository at this point in the history
This is a small change, but it was the cause of 90% of the errors in `rust-analyzer diagnostics .` 🫢

With this change and rust-lang#18085 together, all remaining errors are type errors.

This may mean we can enable more errors, but this is out of scope for this PR.
  • Loading branch information
ChayimFriedman2 committed Sep 10, 2024
1 parent f13c776 commit 7c44d45
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 6 deletions.
18 changes: 18 additions & 0 deletions crates/hir-def/src/macro_expansion_tests/builtin_fn_macro.rs
Original file line number Diff line number Diff line change
Expand Up @@ -528,3 +528,21 @@ fn main() { foobar; }
"##]],
);
}

#[test]
fn test_quote_string() {
check(
r##"
#[rustc_builtin_macro]
macro_rules! stringify {}
fn main() { stringify!("hello"); }
"##,
expect![[r##"
#[rustc_builtin_macro]
macro_rules! stringify {}
fn main() { "\"hello\""; }
"##]],
);
}
8 changes: 4 additions & 4 deletions crates/hir-expand/src/builtin/fn_macro.rs
Original file line number Diff line number Diff line change
Expand Up @@ -483,19 +483,19 @@ fn concat_expand(
match it.kind {
tt::LitKind::Char => {
if let Ok(c) = unescape_char(it.symbol.as_str()) {
text.extend(c.escape_default());
text.push(c);
}
record_span(it.span);
}
tt::LitKind::Integer | tt::LitKind::Float => {
format_to!(text, "{}", it.symbol.as_str())
}
tt::LitKind::Str => {
text.push_str(it.symbol.as_str());
text.push_str(unescape_str(&it.symbol).as_str());
record_span(it.span);
}
tt::LitKind::StrRaw(_) => {
format_to!(text, "{}", it.symbol.as_str().escape_debug());
format_to!(text, "{}", it.symbol.as_str());
record_span(it.span);
}
tt::LitKind::Byte
Expand Down Expand Up @@ -813,7 +813,7 @@ fn include_str_expand(

fn get_env_inner(db: &dyn ExpandDatabase, arg_id: MacroCallId, key: &Symbol) -> Option<String> {
let krate = db.lookup_intern_macro_call(arg_id).krate;
db.crate_graph()[krate].env.get(key.as_str()).map(|it| it.escape_debug().to_string())
db.crate_graph()[krate].env.get(key.as_str())
}

fn env_expand(
Expand Down
5 changes: 3 additions & 2 deletions crates/hir-expand/src/builtin/quote.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

use intern::{sym, Symbol};
use span::Span;
use syntax::ToSmolStr;
use tt::IdentIsRaw;

use crate::name::Name;
Expand Down Expand Up @@ -211,8 +212,8 @@ impl_to_to_tokentrees! {
_span: crate::tt::Literal => self { self };
_span: crate::tt::Ident => self { self };
_span: crate::tt::Punct => self { self };
span: &str => self { crate::tt::Literal{symbol: Symbol::intern(self), span, kind: tt::LitKind::Str, suffix: None }};
span: String => self { crate::tt::Literal{symbol: Symbol::intern(&self), span, kind: tt::LitKind::Str, suffix: None }};
span: &str => self { crate::tt::Literal{symbol: Symbol::intern(&self.escape_default().to_smolstr()), span, kind: tt::LitKind::Str, suffix: None }};
span: String => self { crate::tt::Literal{symbol: Symbol::intern(&self.escape_default().to_smolstr()), span, kind: tt::LitKind::Str, suffix: None }};
span: Name => self {
let (is_raw, s) = IdentIsRaw::split_from_symbol(self.as_str());
crate::tt::Ident{sym: Symbol::intern(s), span, is_raw }
Expand Down

0 comments on commit 7c44d45

Please sign in to comment.