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 /crates/hir | |
parent | f85e383b94376d55bb5ee6be375ef3dc0006590f (diff) |
internal: refactor unresolved proc macro diagnostic
Diffstat (limited to 'crates/hir')
-rw-r--r-- | crates/hir/src/diagnostics.rs | 34 | ||||
-rw-r--r-- | crates/hir/src/lib.rs | 33 |
2 files changed, 17 insertions, 50 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 | ), |