diff options
author | Aleksey Kladov <[email protected]> | 2021-06-13 15:51:44 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2021-06-13 15:51:44 +0100 |
commit | 1e4aaee7bbc1d56698e70158aa35f578422623d9 (patch) | |
tree | 0d7a63a204895fb6c9f3425bb6fce9d6a46b1de5 | |
parent | f85e383b94376d55bb5ee6be375ef3dc0006590f (diff) |
internal: refactor unresolved proc macro diagnostic
-rw-r--r-- | crates/hir/src/diagnostics.rs | 34 | ||||
-rw-r--r-- | crates/hir/src/lib.rs | 33 | ||||
-rw-r--r-- | crates/ide/src/diagnostics.rs | 17 | ||||
-rw-r--r-- | crates/ide/src/diagnostics/inactive_code.rs | 6 | ||||
-rw-r--r-- | crates/ide/src/diagnostics/unresolved_proc_macro.rs | 30 |
5 files changed, 59 insertions, 61 deletions
diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs index 03e7f5e84..2039d2b43 100644 --- a/crates/hir/src/diagnostics.rs +++ b/crates/hir/src/diagnostics.rs | |||
@@ -36,6 +36,7 @@ diagnostics![ | |||
36 | UnresolvedExternCrate, | 36 | UnresolvedExternCrate, |
37 | UnresolvedImport, | 37 | UnresolvedImport, |
38 | UnresolvedMacroCall, | 38 | UnresolvedMacroCall, |
39 | UnresolvedProcMacro, | ||
39 | MissingFields, | 40 | MissingFields, |
40 | InactiveCode, | 41 | InactiveCode, |
41 | ]; | 42 | ]; |
@@ -69,46 +70,15 @@ pub struct InactiveCode { | |||
69 | pub opts: CfgOptions, | 70 | pub opts: CfgOptions, |
70 | } | 71 | } |
71 | 72 | ||
72 | // Diagnostic: unresolved-proc-macro | ||
73 | // | ||
74 | // This diagnostic is shown when a procedural macro can not be found. This usually means that | ||
75 | // procedural macro support is simply disabled (and hence is only a weak hint instead of an error), | ||
76 | // but can also indicate project setup problems. | ||
77 | // | ||
78 | // If you are seeing a lot of "proc macro not expanded" warnings, you can add this option to the | ||
79 | // `rust-analyzer.diagnostics.disabled` list to prevent them from showing. Alternatively you can | ||
80 | // enable support for procedural macros (see `rust-analyzer.procMacro.enable`). | ||
81 | #[derive(Debug, Clone, Eq, PartialEq)] | 73 | #[derive(Debug, Clone, Eq, PartialEq)] |
82 | pub struct UnresolvedProcMacro { | 74 | pub struct UnresolvedProcMacro { |
83 | pub file: HirFileId, | 75 | pub node: InFile<SyntaxNodePtr>, |
84 | pub node: SyntaxNodePtr, | ||
85 | /// If the diagnostic can be pinpointed more accurately than via `node`, this is the `TextRange` | 76 | /// If the diagnostic can be pinpointed more accurately than via `node`, this is the `TextRange` |
86 | /// to use instead. | 77 | /// to use instead. |
87 | pub precise_location: Option<TextRange>, | 78 | pub precise_location: Option<TextRange>, |
88 | pub macro_name: Option<String>, | 79 | pub macro_name: Option<String>, |
89 | } | 80 | } |
90 | 81 | ||
91 | impl Diagnostic for UnresolvedProcMacro { | ||
92 | fn code(&self) -> DiagnosticCode { | ||
93 | DiagnosticCode("unresolved-proc-macro") | ||
94 | } | ||
95 | |||
96 | fn message(&self) -> String { | ||
97 | match &self.macro_name { | ||
98 | Some(name) => format!("proc macro `{}` not expanded", name), | ||
99 | None => "proc macro not expanded".to_string(), | ||
100 | } | ||
101 | } | ||
102 | |||
103 | fn display_source(&self) -> InFile<SyntaxNodePtr> { | ||
104 | InFile::new(self.file, self.node.clone()) | ||
105 | } | ||
106 | |||
107 | fn as_any(&self) -> &(dyn Any + Send + 'static) { | ||
108 | self | ||
109 | } | ||
110 | } | ||
111 | |||
112 | // Diagnostic: macro-error | 82 | // Diagnostic: macro-error |
113 | // | 83 | // |
114 | // This diagnostic is shown for macro expansion errors. | 84 | // This diagnostic is shown for macro expansion errors. |
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index d59b52b25..87a3db946 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs | |||
@@ -518,10 +518,10 @@ impl Module { | |||
518 | 518 | ||
519 | DefDiagnosticKind::UnresolvedProcMacro { ast } => { | 519 | DefDiagnosticKind::UnresolvedProcMacro { ast } => { |
520 | let mut precise_location = None; | 520 | let mut precise_location = None; |
521 | let (file, ast, name) = match ast { | 521 | let (node, name) = match ast { |
522 | MacroCallKind::FnLike { ast_id, .. } => { | 522 | MacroCallKind::FnLike { ast_id, .. } => { |
523 | let node = ast_id.to_node(db.upcast()); | 523 | let node = ast_id.to_node(db.upcast()); |
524 | (ast_id.file_id, SyntaxNodePtr::from(AstPtr::new(&node)), None) | 524 | (ast_id.with_value(SyntaxNodePtr::from(AstPtr::new(&node))), None) |
525 | } | 525 | } |
526 | MacroCallKind::Derive { ast_id, derive_name, .. } => { | 526 | MacroCallKind::Derive { ast_id, derive_name, .. } => { |
527 | let node = ast_id.to_node(db.upcast()); | 527 | let node = ast_id.to_node(db.upcast()); |
@@ -554,8 +554,7 @@ impl Module { | |||
554 | } | 554 | } |
555 | 555 | ||
556 | ( | 556 | ( |
557 | ast_id.file_id, | 557 | ast_id.with_value(SyntaxNodePtr::from(AstPtr::new(&node))), |
558 | SyntaxNodePtr::from(AstPtr::new(&node)), | ||
559 | Some(derive_name.clone()), | 558 | Some(derive_name.clone()), |
560 | ) | 559 | ) |
561 | } | 560 | } |
@@ -566,18 +565,14 @@ impl Module { | |||
566 | || panic!("cannot find attribute #{}", invoc_attr_index), | 565 | || panic!("cannot find attribute #{}", invoc_attr_index), |
567 | ); | 566 | ); |
568 | ( | 567 | ( |
569 | ast_id.file_id, | 568 | ast_id.with_value(SyntaxNodePtr::from(AstPtr::new(&attr))), |
570 | SyntaxNodePtr::from(AstPtr::new(&attr)), | ||
571 | Some(attr_name.clone()), | 569 | Some(attr_name.clone()), |
572 | ) | 570 | ) |
573 | } | 571 | } |
574 | }; | 572 | }; |
575 | sink.push(UnresolvedProcMacro { | 573 | acc.push( |
576 | file, | 574 | UnresolvedProcMacro { node, precise_location, macro_name: name }.into(), |
577 | node: ast, | 575 | ); |
578 | precise_location, | ||
579 | macro_name: name, | ||
580 | }); | ||
581 | } | 576 | } |
582 | 577 | ||
583 | DefDiagnosticKind::UnresolvedMacroCall { ast, path } => { | 578 | DefDiagnosticKind::UnresolvedMacroCall { ast, path } => { |
@@ -1056,12 +1051,14 @@ impl Function { | |||
1056 | node: node.value.clone().into(), | 1051 | node: node.value.clone().into(), |
1057 | message: message.to_string(), | 1052 | message: message.to_string(), |
1058 | }), | 1053 | }), |
1059 | BodyDiagnostic::UnresolvedProcMacro { node } => sink.push(UnresolvedProcMacro { | 1054 | BodyDiagnostic::UnresolvedProcMacro { node } => acc.push( |
1060 | file: node.file_id, | 1055 | UnresolvedProcMacro { |
1061 | node: node.value.clone().into(), | 1056 | node: node.clone().map(|it| it.into()), |
1062 | precise_location: None, | 1057 | precise_location: None, |
1063 | macro_name: None, | 1058 | macro_name: None, |
1064 | }), | 1059 | } |
1060 | .into(), | ||
1061 | ), | ||
1065 | BodyDiagnostic::UnresolvedMacroCall { node, path } => acc.push( | 1062 | BodyDiagnostic::UnresolvedMacroCall { node, path } => acc.push( |
1066 | UnresolvedMacroCall { macro_call: node.clone(), path: path.clone() }.into(), | 1063 | UnresolvedMacroCall { macro_call: node.clone(), path: path.clone() }.into(), |
1067 | ), | 1064 | ), |
diff --git a/crates/ide/src/diagnostics.rs b/crates/ide/src/diagnostics.rs index 634e6a043..f7965326d 100644 --- a/crates/ide/src/diagnostics.rs +++ b/crates/ide/src/diagnostics.rs | |||
@@ -8,6 +8,7 @@ mod unresolved_module; | |||
8 | mod unresolved_extern_crate; | 8 | mod unresolved_extern_crate; |
9 | mod unresolved_import; | 9 | mod unresolved_import; |
10 | mod unresolved_macro_call; | 10 | mod unresolved_macro_call; |
11 | mod unresolved_proc_macro; | ||
11 | mod inactive_code; | 12 | mod inactive_code; |
12 | mod missing_fields; | 13 | mod missing_fields; |
13 | 14 | ||
@@ -68,6 +69,11 @@ impl Diagnostic { | |||
68 | self | 69 | self |
69 | } | 70 | } |
70 | 71 | ||
72 | fn severity(mut self, severity: Severity) -> Diagnostic { | ||
73 | self.severity = severity; | ||
74 | self | ||
75 | } | ||
76 | |||
71 | fn error(range: TextRange, message: String) -> Self { | 77 | fn error(range: TextRange, message: String) -> Self { |
72 | Self { | 78 | Self { |
73 | message, | 79 | message, |
@@ -178,16 +184,6 @@ pub(crate) fn diagnostics( | |||
178 | .with_code(Some(d.code())), | 184 | .with_code(Some(d.code())), |
179 | ); | 185 | ); |
180 | }) | 186 | }) |
181 | .on::<hir::diagnostics::UnresolvedProcMacro, _>(|d| { | ||
182 | // Use more accurate position if available. | ||
183 | let display_range = d | ||
184 | .precise_location | ||
185 | .unwrap_or_else(|| sema.diagnostics_display_range(d.display_source()).range); | ||
186 | |||
187 | // FIXME: it would be nice to tell the user whether proc macros are currently disabled | ||
188 | res.borrow_mut() | ||
189 | .push(Diagnostic::hint(display_range, d.message()).with_code(Some(d.code()))); | ||
190 | }) | ||
191 | .on::<hir::diagnostics::UnimplementedBuiltinMacro, _>(|d| { | 187 | .on::<hir::diagnostics::UnimplementedBuiltinMacro, _>(|d| { |
192 | let display_range = sema.diagnostics_display_range(d.display_source()).range; | 188 | let display_range = sema.diagnostics_display_range(d.display_source()).range; |
193 | res.borrow_mut() | 189 | res.borrow_mut() |
@@ -231,6 +227,7 @@ pub(crate) fn diagnostics( | |||
231 | AnyDiagnostic::UnresolvedExternCrate(d) => unresolved_extern_crate::unresolved_extern_crate(&ctx, &d), | 227 | AnyDiagnostic::UnresolvedExternCrate(d) => unresolved_extern_crate::unresolved_extern_crate(&ctx, &d), |
232 | AnyDiagnostic::UnresolvedImport(d) => unresolved_import::unresolved_import(&ctx, &d), | 228 | AnyDiagnostic::UnresolvedImport(d) => unresolved_import::unresolved_import(&ctx, &d), |
233 | AnyDiagnostic::UnresolvedMacroCall(d) => unresolved_macro_call::unresolved_macro_call(&ctx, &d), | 229 | AnyDiagnostic::UnresolvedMacroCall(d) => unresolved_macro_call::unresolved_macro_call(&ctx, &d), |
230 | AnyDiagnostic::UnresolvedProcMacro(d) => unresolved_proc_macro::unresolved_proc_macro(&ctx, &d), | ||
234 | AnyDiagnostic::MissingFields(d) => missing_fields::missing_fields(&ctx, &d), | 231 | AnyDiagnostic::MissingFields(d) => missing_fields::missing_fields(&ctx, &d), |
235 | 232 | ||
236 | AnyDiagnostic::InactiveCode(d) => match inactive_code::inactive_code(&ctx, &d) { | 233 | AnyDiagnostic::InactiveCode(d) => match inactive_code::inactive_code(&ctx, &d) { |
diff --git a/crates/ide/src/diagnostics/inactive_code.rs b/crates/ide/src/diagnostics/inactive_code.rs index 52f97cb4c..afe333204 100644 --- a/crates/ide/src/diagnostics/inactive_code.rs +++ b/crates/ide/src/diagnostics/inactive_code.rs | |||
@@ -1,7 +1,10 @@ | |||
1 | use cfg::DnfExpr; | 1 | use cfg::DnfExpr; |
2 | use stdx::format_to; | 2 | use stdx::format_to; |
3 | 3 | ||
4 | use crate::diagnostics::{Diagnostic, DiagnosticsContext}; | 4 | use crate::{ |
5 | diagnostics::{Diagnostic, DiagnosticsContext}, | ||
6 | Severity, | ||
7 | }; | ||
5 | 8 | ||
6 | // Diagnostic: inactive-code | 9 | // Diagnostic: inactive-code |
7 | // | 10 | // |
@@ -27,6 +30,7 @@ pub(super) fn inactive_code( | |||
27 | message, | 30 | message, |
28 | ctx.sema.diagnostics_display_range(d.node.clone()).range, | 31 | ctx.sema.diagnostics_display_range(d.node.clone()).range, |
29 | ) | 32 | ) |
33 | .severity(Severity::WeakWarning) | ||
30 | .with_unused(true); | 34 | .with_unused(true); |
31 | Some(res) | 35 | Some(res) |
32 | } | 36 | } |
diff --git a/crates/ide/src/diagnostics/unresolved_proc_macro.rs b/crates/ide/src/diagnostics/unresolved_proc_macro.rs new file mode 100644 index 000000000..3dc6ab451 --- /dev/null +++ b/crates/ide/src/diagnostics/unresolved_proc_macro.rs | |||
@@ -0,0 +1,30 @@ | |||
1 | use crate::{ | ||
2 | diagnostics::{Diagnostic, DiagnosticsContext}, | ||
3 | Severity, | ||
4 | }; | ||
5 | |||
6 | // Diagnostic: unresolved-proc-macro | ||
7 | // | ||
8 | // This diagnostic is shown when a procedural macro can not be found. This usually means that | ||
9 | // procedural macro support is simply disabled (and hence is only a weak hint instead of an error), | ||
10 | // but can also indicate project setup problems. | ||
11 | // | ||
12 | // If you are seeing a lot of "proc macro not expanded" warnings, you can add this option to the | ||
13 | // `rust-analyzer.diagnostics.disabled` list to prevent them from showing. Alternatively you can | ||
14 | // enable support for procedural macros (see `rust-analyzer.procMacro.enable`). | ||
15 | pub(super) fn unresolved_proc_macro( | ||
16 | ctx: &DiagnosticsContext<'_>, | ||
17 | d: &hir::UnresolvedProcMacro, | ||
18 | ) -> Diagnostic { | ||
19 | // Use more accurate position if available. | ||
20 | let display_range = d | ||
21 | .precise_location | ||
22 | .unwrap_or_else(|| ctx.sema.diagnostics_display_range(d.node.clone()).range); | ||
23 | // FIXME: it would be nice to tell the user whether proc macros are currently disabled | ||
24 | let message = match &d.macro_name { | ||
25 | Some(name) => format!("proc macro `{}` not expanded", name), | ||
26 | None => "proc macro not expanded".to_string(), | ||
27 | }; | ||
28 | |||
29 | Diagnostic::new("unresolved-proc-macro", message, display_range).severity(Severity::WeakWarning) | ||
30 | } | ||