diff options
| author | Jake Vossen <jake@vossen.dev> | 2020-02-28 15:32:09 -0700 |
|---|---|---|
| committer | Jake Vossen <jake@vossen.dev> | 2020-02-29 11:53:51 -0700 |
| commit | 5f3ffee6b77f073b78bdc76e7a0f4811bc39e7f9 (patch) | |
| tree | e5f1636fb10b7b570078b96b1d7e711e663f3776 /src/librustc_errors | |
| parent | e9bca510fe17354f876aa289bb39d347d7c69c69 (diff) | |
| download | rust-5f3ffee6b77f073b78bdc76e7a0f4811bc39e7f9.tar.gz rust-5f3ffee6b77f073b78bdc76e7a0f4811bc39e7f9.zip | |
added `try_find_description` to distinguish no desc from invalid code
Diffstat (limited to 'src/librustc_errors')
| -rw-r--r-- | src/librustc_errors/json.rs | 6 | ||||
| -rw-r--r-- | src/librustc_errors/lib.rs | 8 | ||||
| -rw-r--r-- | src/librustc_errors/registry.rs | 24 |
3 files changed, 29 insertions, 9 deletions
diff --git a/src/librustc_errors/json.rs b/src/librustc_errors/json.rs index df73785b8f6..0767b8dda9b 100644 --- a/src/librustc_errors/json.rs +++ b/src/librustc_errors/json.rs @@ -419,10 +419,10 @@ impl DiagnosticCode { DiagnosticId::Error(s) => s, DiagnosticId::Lint(s) => s, }; - let explanation = - je.registry.as_ref().and_then(|registry| registry.find_description(&s)); + let je_result = + je.registry.as_ref().map(|registry| registry.try_find_description(&s)).unwrap(); - DiagnosticCode { code: s, explanation } + DiagnosticCode { code: s, explanation: je_result.unwrap_or(None) } }) } } diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs index 1a0fe343521..bc943f2c09c 100644 --- a/src/librustc_errors/lib.rs +++ b/src/librustc_errors/lib.rs @@ -786,8 +786,12 @@ impl HandlerInner { .emitted_diagnostic_codes .iter() .filter_map(|x| match &x { - DiagnosticId::Error(s) if registry.find_description(s).is_some() => { - Some(s.clone()) + DiagnosticId::Error(s) => { + if let Ok(Some(_explanation)) = registry.try_find_description(s) { + Some(s.clone()) + } else { + None + } } _ => None, }) diff --git a/src/librustc_errors/registry.rs b/src/librustc_errors/registry.rs index 771542cb06f..c92a9d04775 100644 --- a/src/librustc_errors/registry.rs +++ b/src/librustc_errors/registry.rs @@ -1,16 +1,32 @@ use rustc_data_structures::fx::FxHashMap; +#[derive(Debug)] +pub struct InvalidErrorCode; + #[derive(Clone)] pub struct Registry { - descriptions: FxHashMap<&'static str, &'static str>, + long_descriptions: FxHashMap<&'static str, Option<&'static str>>, } impl Registry { - pub fn new(descriptions: &[(&'static str, &'static str)]) -> Registry { - Registry { descriptions: descriptions.iter().cloned().collect() } + pub fn new(long_descriptions: &[(&'static str, Option<&'static str>)]) -> Registry { + Registry { long_descriptions: long_descriptions.iter().cloned().collect() } } + /// This will panic if an invalid error code is passed in pub fn find_description(&self, code: &str) -> Option<&'static str> { - self.descriptions.get(code).cloned() + self.try_find_description(code).unwrap() + } + /// Returns `InvalidErrorCode` if the code requested does not exist in the + /// registry. Otherwise, returns an `Option` where `None` means the error + /// code is valid but has no extended information. + pub fn try_find_description( + &self, + code: &str, + ) -> Result<Option<&'static str>, InvalidErrorCode> { + if !self.long_descriptions.contains_key(code) { + return Err(InvalidErrorCode); + } + Ok(self.long_descriptions.get(code).unwrap().clone()) } } |
