diff options
author | Aleksey Kladov <[email protected]> | 2019-03-23 13:28:47 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-03-25 07:52:12 +0000 |
commit | fcca35969dd7c63a83ee34c4ce7d54cefdb72bbe (patch) | |
tree | dd7de0fe2c391803e735cb8d65db54c42d29e823 /crates/ra_hir/src/diagnostics.rs | |
parent | 7e8f17188efcecfdfd1afbbc894a53c65985f836 (diff) |
allow dyn diagnostics
Diffstat (limited to 'crates/ra_hir/src/diagnostics.rs')
-rw-r--r-- | crates/ra_hir/src/diagnostics.rs | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/crates/ra_hir/src/diagnostics.rs b/crates/ra_hir/src/diagnostics.rs index 82aff9cee..46a3fdd47 100644 --- a/crates/ra_hir/src/diagnostics.rs +++ b/crates/ra_hir/src/diagnostics.rs | |||
@@ -1,6 +1,60 @@ | |||
1 | use crate::{expr::ExprId}; | 1 | use std::{fmt, any::Any}; |
2 | 2 | ||
3 | #[derive(Clone, Debug, PartialEq, Eq)] | 3 | use ra_syntax::{SyntaxNodePtr, AstPtr, ast}; |
4 | pub enum FunctionDiagnostic { | 4 | |
5 | NoSuchField { expr: ExprId, field: usize }, | 5 | use crate::HirFileId; |
6 | |||
7 | pub trait Diagnostic: Any + Send + Sync + fmt::Debug + 'static { | ||
8 | fn file(&self) -> HirFileId; | ||
9 | fn syntax_node(&self) -> SyntaxNodePtr; | ||
10 | fn message(&self) -> String; | ||
11 | fn as_any(&self) -> &(Any + Send + 'static); | ||
12 | } | ||
13 | |||
14 | impl dyn Diagnostic { | ||
15 | pub fn downcast_ref<D: Diagnostic>(&self) -> Option<&D> { | ||
16 | self.as_any().downcast_ref() | ||
17 | } | ||
18 | } | ||
19 | |||
20 | #[derive(Debug, Default)] | ||
21 | pub struct Diagnostics { | ||
22 | data: Vec<Box<dyn Diagnostic>>, | ||
23 | } | ||
24 | |||
25 | impl Diagnostics { | ||
26 | pub fn push(&mut self, d: impl Diagnostic) { | ||
27 | self.data.push(Box::new(d)) | ||
28 | } | ||
29 | |||
30 | pub fn iter<'a>(&'a self) -> impl Iterator<Item = &'a dyn Diagnostic> + 'a { | ||
31 | self.data.iter().map(|it| it.as_ref()) | ||
32 | } | ||
33 | } | ||
34 | |||
35 | #[derive(Debug)] | ||
36 | pub struct NoSuchField { | ||
37 | pub(crate) file: HirFileId, | ||
38 | pub(crate) field: AstPtr<ast::NamedField>, | ||
39 | } | ||
40 | |||
41 | impl NoSuchField { | ||
42 | pub fn field(&self) -> AstPtr<ast::NamedField> { | ||
43 | self.field | ||
44 | } | ||
45 | } | ||
46 | |||
47 | impl Diagnostic for NoSuchField { | ||
48 | fn file(&self) -> HirFileId { | ||
49 | self.file | ||
50 | } | ||
51 | fn syntax_node(&self) -> SyntaxNodePtr { | ||
52 | self.field.into() | ||
53 | } | ||
54 | fn message(&self) -> String { | ||
55 | "no such field".to_string() | ||
56 | } | ||
57 | fn as_any(&self) -> &(Any + Send + 'static) { | ||
58 | self | ||
59 | } | ||
6 | } | 60 | } |