aboutsummaryrefslogtreecommitdiff
path: root/crates/hir/src
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2021-06-13 15:51:44 +0100
committerAleksey Kladov <[email protected]>2021-06-13 15:51:44 +0100
commit1e4aaee7bbc1d56698e70158aa35f578422623d9 (patch)
tree0d7a63a204895fb6c9f3425bb6fce9d6a46b1de5 /crates/hir/src
parentf85e383b94376d55bb5ee6be375ef3dc0006590f (diff)
internal: refactor unresolved proc macro diagnostic
Diffstat (limited to 'crates/hir/src')
-rw-r--r--crates/hir/src/diagnostics.rs34
-rw-r--r--crates/hir/src/lib.rs33
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)]
82pub struct UnresolvedProcMacro { 74pub 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
91impl 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 ),