Skip to content

Commit d39d520

Browse files
committed
Auto merge of rust-lang#12544 - Veykril:proc-error, r=Veykril
Show proc-macro loading errors in unresolved-proc-macro diagnostics This should help out people to potentially figure out the problem without having to check the logs
2 parents 15c63c4 + 1dd2c50 commit d39d520

File tree

15 files changed

+245
-144
lines changed

15 files changed

+245
-144
lines changed

crates/base-db/src/fixture.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ impl ChangeFixture {
159159
meta.cfg.clone(),
160160
meta.cfg,
161161
meta.env,
162-
Default::default(),
162+
Ok(Vec::new()),
163163
false,
164164
origin,
165165
);
@@ -194,7 +194,7 @@ impl ChangeFixture {
194194
default_cfg.clone(),
195195
default_cfg,
196196
Env::default(),
197-
Default::default(),
197+
Ok(Vec::new()),
198198
false,
199199
CrateOrigin::CratesIo { repo: None },
200200
);
@@ -231,7 +231,7 @@ impl ChangeFixture {
231231
CfgOptions::default(),
232232
CfgOptions::default(),
233233
Env::default(),
234-
Vec::new(),
234+
Ok(Vec::new()),
235235
false,
236236
CrateOrigin::Lang(LangCrateOrigin::Core),
237237
);
@@ -268,7 +268,7 @@ impl ChangeFixture {
268268
CfgOptions::default(),
269269
CfgOptions::default(),
270270
Env::default(),
271-
proc_macro,
271+
Ok(proc_macro),
272272
true,
273273
CrateOrigin::CratesIo { repo: None },
274274
);

crates/base-db/src/input.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ pub enum ProcMacroExpansionError {
231231
System(String),
232232
}
233233

234+
pub type ProcMacroLoadResult = Result<Vec<ProcMacro>, String>;
235+
234236
#[derive(Debug, Clone)]
235237
pub struct ProcMacro {
236238
pub name: SmolStr,
@@ -254,7 +256,7 @@ pub struct CrateData {
254256
pub potential_cfg_options: CfgOptions,
255257
pub env: Env,
256258
pub dependencies: Vec<Dependency>,
257-
pub proc_macro: Vec<ProcMacro>,
259+
pub proc_macro: ProcMacroLoadResult,
258260
pub origin: CrateOrigin,
259261
pub is_proc_macro: bool,
260262
}
@@ -300,19 +302,19 @@ impl Dependency {
300302
impl CrateGraph {
301303
pub fn add_crate_root(
302304
&mut self,
303-
file_id: FileId,
305+
root_file_id: FileId,
304306
edition: Edition,
305307
display_name: Option<CrateDisplayName>,
306308
version: Option<String>,
307309
cfg_options: CfgOptions,
308310
potential_cfg_options: CfgOptions,
309311
env: Env,
310-
proc_macro: Vec<ProcMacro>,
312+
proc_macro: ProcMacroLoadResult,
311313
is_proc_macro: bool,
312314
origin: CrateOrigin,
313315
) -> CrateId {
314316
let data = CrateData {
315-
root_file_id: file_id,
317+
root_file_id,
316318
edition,
317319
version,
318320
display_name,
@@ -628,7 +630,7 @@ mod tests {
628630
CfgOptions::default(),
629631
CfgOptions::default(),
630632
Env::default(),
631-
Default::default(),
633+
Ok(Vec::new()),
632634
false,
633635
CrateOrigin::CratesIo { repo: None },
634636
);
@@ -640,7 +642,7 @@ mod tests {
640642
CfgOptions::default(),
641643
CfgOptions::default(),
642644
Env::default(),
643-
Default::default(),
645+
Ok(Vec::new()),
644646
false,
645647
CrateOrigin::CratesIo { repo: None },
646648
);
@@ -652,7 +654,7 @@ mod tests {
652654
CfgOptions::default(),
653655
CfgOptions::default(),
654656
Env::default(),
655-
Default::default(),
657+
Ok(Vec::new()),
656658
false,
657659
CrateOrigin::CratesIo { repo: None },
658660
);
@@ -678,7 +680,7 @@ mod tests {
678680
CfgOptions::default(),
679681
CfgOptions::default(),
680682
Env::default(),
681-
Default::default(),
683+
Ok(Vec::new()),
682684
false,
683685
CrateOrigin::CratesIo { repo: None },
684686
);
@@ -690,7 +692,7 @@ mod tests {
690692
CfgOptions::default(),
691693
CfgOptions::default(),
692694
Env::default(),
693-
Default::default(),
695+
Ok(Vec::new()),
694696
false,
695697
CrateOrigin::CratesIo { repo: None },
696698
);
@@ -713,7 +715,7 @@ mod tests {
713715
CfgOptions::default(),
714716
CfgOptions::default(),
715717
Env::default(),
716-
Default::default(),
718+
Ok(Vec::new()),
717719
false,
718720
CrateOrigin::CratesIo { repo: None },
719721
);
@@ -725,7 +727,7 @@ mod tests {
725727
CfgOptions::default(),
726728
CfgOptions::default(),
727729
Env::default(),
728-
Default::default(),
730+
Ok(Vec::new()),
729731
false,
730732
CrateOrigin::CratesIo { repo: None },
731733
);
@@ -737,7 +739,7 @@ mod tests {
737739
CfgOptions::default(),
738740
CfgOptions::default(),
739741
Env::default(),
740-
Default::default(),
742+
Ok(Vec::new()),
741743
false,
742744
CrateOrigin::CratesIo { repo: None },
743745
);
@@ -760,7 +762,7 @@ mod tests {
760762
CfgOptions::default(),
761763
CfgOptions::default(),
762764
Env::default(),
763-
Default::default(),
765+
Ok(Vec::new()),
764766
false,
765767
CrateOrigin::CratesIo { repo: None },
766768
);
@@ -772,7 +774,7 @@ mod tests {
772774
CfgOptions::default(),
773775
CfgOptions::default(),
774776
Env::default(),
775-
Default::default(),
777+
Ok(Vec::new()),
776778
false,
777779
CrateOrigin::CratesIo { repo: None },
778780
);

crates/base-db/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ pub use crate::{
1313
input::{
1414
CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency,
1515
Edition, Env, LangCrateOrigin, ProcMacro, ProcMacroExpander, ProcMacroExpansionError,
16-
ProcMacroId, ProcMacroKind, SourceRoot, SourceRootId,
16+
ProcMacroId, ProcMacroKind, ProcMacroLoadResult, SourceRoot, SourceRootId,
1717
},
1818
};
1919
pub use salsa::{self, Cancelled};

crates/hir-def/src/nameres.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ pub struct DefMap {
103103
/// Side table for resolving derive helpers.
104104
exported_derives: FxHashMap<MacroDefId, Box<[Name]>>,
105105
fn_proc_macro_mapping: FxHashMap<FunctionId, ProcMacroId>,
106+
/// The error that occurred when failing to load the proc-macro dll.
107+
proc_macro_loading_error: Option<Box<str>>,
106108

107109
/// Custom attributes registered with `#![register_attr]`.
108110
registered_attrs: Vec<SmolStr>,
@@ -273,6 +275,7 @@ impl DefMap {
273275
extern_prelude: FxHashMap::default(),
274276
exported_derives: FxHashMap::default(),
275277
fn_proc_macro_mapping: FxHashMap::default(),
278+
proc_macro_loading_error: None,
276279
prelude: None,
277280
root,
278281
modules,
@@ -305,6 +308,9 @@ impl DefMap {
305308
pub fn fn_as_proc_macro(&self, id: FunctionId) -> Option<ProcMacroId> {
306309
self.fn_proc_macro_mapping.get(&id).copied()
307310
}
311+
pub fn proc_macro_loading_error(&self) -> Option<&str> {
312+
self.proc_macro_loading_error.as_deref()
313+
}
308314

309315
pub(crate) fn krate(&self) -> CrateId {
310316
self.krate
@@ -460,6 +466,7 @@ impl DefMap {
460466
registered_attrs,
461467
registered_tools,
462468
fn_proc_macro_mapping,
469+
proc_macro_loading_error: _,
463470
block: _,
464471
edition: _,
465472
recursion_limit: _,

crates/hir-def/src/nameres/collector.rs

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,26 @@ pub(super) fn collect_defs(db: &dyn DefDatabase, mut def_map: DefMap, tree_id: T
7474
}
7575

7676
let cfg_options = &krate.cfg_options;
77-
let proc_macros = krate
78-
.proc_macro
79-
.iter()
80-
.enumerate()
81-
.map(|(idx, it)| {
82-
// FIXME: a hacky way to create a Name from string.
83-
let name = tt::Ident { text: it.name.clone(), id: tt::TokenId::unspecified() };
84-
(
85-
name.as_name(),
86-
ProcMacroExpander::new(def_map.krate, base_db::ProcMacroId(idx as u32)),
87-
)
88-
})
89-
.collect();
77+
let proc_macros = match &krate.proc_macro {
78+
Ok(proc_macros) => {
79+
proc_macros
80+
.iter()
81+
.enumerate()
82+
.map(|(idx, it)| {
83+
// FIXME: a hacky way to create a Name from string.
84+
let name = tt::Ident { text: it.name.clone(), id: tt::TokenId::unspecified() };
85+
(
86+
name.as_name(),
87+
ProcMacroExpander::new(def_map.krate, base_db::ProcMacroId(idx as u32)),
88+
)
89+
})
90+
.collect()
91+
}
92+
Err(e) => {
93+
def_map.proc_macro_loading_error = Some(e.clone().into_boxed_str());
94+
Vec::new()
95+
}
96+
};
9097
let is_proc_macro = krate.is_proc_macro;
9198

9299
let mut collector = DefCollector {
@@ -1128,7 +1135,19 @@ impl DefCollector<'_> {
11281135

11291136
let def = match resolver(path.clone()) {
11301137
Some(def) if def.is_attribute() => def,
1131-
_ => return true,
1138+
_ => {
1139+
self.def_map.diagnostics.push(DefDiagnostic::unresolved_proc_macro(
1140+
directive.module_id,
1141+
MacroCallKind::Attr {
1142+
ast_id,
1143+
attr_args: Default::default(),
1144+
invoc_attr_index: attr.id.ast_index,
1145+
is_derive: false,
1146+
},
1147+
None,
1148+
));
1149+
return true;
1150+
}
11321151
};
11331152
if matches!(
11341153
def,
@@ -1232,6 +1251,7 @@ impl DefCollector<'_> {
12321251
self.def_map.diagnostics.push(DefDiagnostic::unresolved_proc_macro(
12331252
directive.module_id,
12341253
loc.kind,
1254+
Some(loc.def.krate),
12351255
));
12361256

12371257
return recollect_without(self);
@@ -1283,7 +1303,11 @@ impl DefCollector<'_> {
12831303
let diag = match err {
12841304
hir_expand::ExpandError::UnresolvedProcMacro => {
12851305
// Missing proc macros are non-fatal, so they are handled specially.
1286-
DefDiagnostic::unresolved_proc_macro(module_id, loc.kind.clone())
1306+
DefDiagnostic::unresolved_proc_macro(
1307+
module_id,
1308+
loc.kind.clone(),
1309+
Some(loc.def.krate),
1310+
)
12871311
}
12881312
_ => DefDiagnostic::macro_error(module_id, loc.kind.clone(), err.to_string()),
12891313
};

crates/hir-def/src/nameres/diagnostics.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Diagnostics emitted during DefMap construction.
22
3+
use base_db::CrateId;
34
use cfg::{CfgExpr, CfgOptions};
45
use hir_expand::MacroCallKind;
56
use la_arena::Idx;
@@ -23,7 +24,7 @@ pub enum DefDiagnosticKind {
2324

2425
UnconfiguredCode { ast: AstId<ast::Item>, cfg: CfgExpr, opts: CfgOptions },
2526

26-
UnresolvedProcMacro { ast: MacroCallKind },
27+
UnresolvedProcMacro { ast: MacroCallKind, krate: Option<CrateId> },
2728

2829
UnresolvedMacroCall { ast: MacroCallKind, path: ModPath },
2930

@@ -81,8 +82,12 @@ impl DefDiagnostic {
8182
Self { in_module: container, kind: DefDiagnosticKind::UnconfiguredCode { ast, cfg, opts } }
8283
}
8384

84-
pub(super) fn unresolved_proc_macro(container: LocalModuleId, ast: MacroCallKind) -> Self {
85-
Self { in_module: container, kind: DefDiagnosticKind::UnresolvedProcMacro { ast } }
85+
pub(super) fn unresolved_proc_macro(
86+
container: LocalModuleId,
87+
ast: MacroCallKind,
88+
krate: Option<CrateId>,
89+
) -> Self {
90+
Self { in_module: container, kind: DefDiagnosticKind::UnresolvedProcMacro { ast, krate } }
8691
}
8792

8893
pub(super) fn macro_error(

crates/hir-expand/src/proc_macro.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,15 @@ impl ProcMacroExpander {
3434
match self.proc_macro_id {
3535
Some(id) => {
3636
let krate_graph = db.crate_graph();
37-
let proc_macro = match krate_graph[self.krate].proc_macro.get(id.0 as usize) {
37+
let proc_macros = match &krate_graph[self.krate].proc_macro {
38+
Ok(proc_macros) => proc_macros,
39+
Err(e) => {
40+
return ExpandResult::only_err(ExpandError::Other(
41+
e.clone().into_boxed_str(),
42+
))
43+
}
44+
};
45+
let proc_macro = match proc_macros.get(id.0 as usize) {
3846
Some(proc_macro) => proc_macro,
3947
None => {
4048
return ExpandResult::only_err(ExpandError::Other(

crates/hir/src/diagnostics.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
//!
44
//! This probably isn't the best way to do this -- ideally, diagnistics should
55
//! be expressed in terms of hir types themselves.
6+
use base_db::CrateId;
67
use cfg::{CfgExpr, CfgOptions};
78
use either::Either;
89
use hir_def::path::ModPath;
@@ -87,6 +88,8 @@ pub struct UnresolvedProcMacro {
8788
pub precise_location: Option<TextRange>,
8889
pub macro_name: Option<String>,
8990
pub kind: MacroKind,
91+
/// The crate id of the proc-macro this macro belongs to, or `None` if the proc-macro can't be found.
92+
pub krate: Option<CrateId>,
9093
}
9194

9295
#[derive(Debug, Clone, Eq, PartialEq)]

crates/hir/src/lib.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ fn emit_def_diagnostic(db: &dyn HirDatabase, acc: &mut Vec<AnyDiagnostic>, diag:
627627
);
628628
}
629629

630-
DefDiagnosticKind::UnresolvedProcMacro { ast } => {
630+
DefDiagnosticKind::UnresolvedProcMacro { ast, krate } => {
631631
let (node, precise_location, macro_name, kind) = match ast {
632632
MacroCallKind::FnLike { ast_id, .. } => {
633633
let node = ast_id.to_node(db.upcast());
@@ -689,7 +689,10 @@ fn emit_def_diagnostic(db: &dyn HirDatabase, acc: &mut Vec<AnyDiagnostic>, diag:
689689
)
690690
}
691691
};
692-
acc.push(UnresolvedProcMacro { node, precise_location, macro_name, kind }.into());
692+
acc.push(
693+
UnresolvedProcMacro { node, precise_location, macro_name, kind, krate: *krate }
694+
.into(),
695+
);
693696
}
694697

695698
DefDiagnosticKind::UnresolvedMacroCall { ast, path } => {
@@ -1163,6 +1166,7 @@ impl DefWithBody {
11631166
precise_location: None,
11641167
macro_name: None,
11651168
kind: MacroKind::ProcMacro,
1169+
krate: None,
11661170
}
11671171
.into(),
11681172
),

0 commit comments

Comments
 (0)