From 886b66cd03cbe7cb13e248d7c7bbdeba66c7796a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 13 Jun 2021 19:51:19 +0300 Subject: internal: refactor BreakOutsideOfLoop diagnostic --- crates/hir/src/diagnostics.rs | 22 ++-------------- crates/hir/src/lib.rs | 4 +-- crates/ide/src/diagnostics.rs | 12 ++------- .../ide/src/diagnostics/break_outside_of_loop.rs | 30 ++++++++++++++++++++++ 4 files changed, 36 insertions(+), 32 deletions(-) create mode 100644 crates/ide/src/diagnostics/break_outside_of_loop.rs diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs index c7702e09f..47d17ba70 100644 --- a/crates/hir/src/diagnostics.rs +++ b/crates/hir/src/diagnostics.rs @@ -32,6 +32,7 @@ macro_rules! diagnostics { } diagnostics![ + BreakOutsideOfLoop, InactiveCode, MacroError, MissingFields, @@ -98,28 +99,9 @@ pub struct NoSuchField { pub field: InFile>, } -// Diagnostic: break-outside-of-loop -// -// This diagnostic is triggered if the `break` keyword is used outside of a loop. #[derive(Debug)] pub struct BreakOutsideOfLoop { - pub file: HirFileId, - pub expr: AstPtr, -} - -impl Diagnostic for BreakOutsideOfLoop { - fn code(&self) -> DiagnosticCode { - DiagnosticCode("break-outside-of-loop") - } - fn message(&self) -> String { - "break outside of loop".to_string() - } - fn display_source(&self) -> InFile { - InFile { file_id: self.file, value: self.expr.clone().into() } - } - fn as_any(&self) -> &(dyn Any + Send + 'static) { - self - } + pub expr: InFile>, } // Diagnostic: missing-unsafe diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 7faf6ec1f..2f507b83b 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -1080,10 +1080,10 @@ impl Function { acc.push(NoSuchField { field }.into()) } hir_ty::InferenceDiagnostic::BreakOutsideOfLoop { expr } => { - let ptr = source_map + let expr = source_map .expr_syntax(*expr) .expect("break outside of loop in synthetic syntax"); - sink.push(BreakOutsideOfLoop { file: ptr.file_id, expr: ptr.value }) + acc.push(BreakOutsideOfLoop { expr }.into()) } } } diff --git a/crates/ide/src/diagnostics.rs b/crates/ide/src/diagnostics.rs index caaa89e0a..e8f22c889 100644 --- a/crates/ide/src/diagnostics.rs +++ b/crates/ide/src/diagnostics.rs @@ -4,6 +4,7 @@ //! macro-expanded files, but we need to present them to the users in terms of //! original files. So we need to map the ranges. +mod break_outside_of_loop; mod inactive_code; mod macro_error; mod missing_fields; @@ -218,6 +219,7 @@ pub(crate) fn diagnostics( for diag in diags { #[rustfmt::skip] let d = match diag { + AnyDiagnostic::BreakOutsideOfLoop(d) => break_outside_of_loop::break_outside_of_loop(&ctx, &d), AnyDiagnostic::MacroError(d) => macro_error::macro_error(&ctx, &d), AnyDiagnostic::MissingFields(d) => missing_fields::missing_fields(&ctx, &d), AnyDiagnostic::NoSuchField(d) => no_such_field::no_such_field(&ctx, &d), @@ -711,16 +713,6 @@ mod foo; ); } - #[test] - fn break_outside_of_loop() { - check_diagnostics( - r#" -fn foo() { break; } - //^^^^^ break outside of loop -"#, - ); - } - #[test] fn missing_unsafe_diagnostic_with_raw_ptr() { check_diagnostics( diff --git a/crates/ide/src/diagnostics/break_outside_of_loop.rs b/crates/ide/src/diagnostics/break_outside_of_loop.rs new file mode 100644 index 000000000..80e68f3cc --- /dev/null +++ b/crates/ide/src/diagnostics/break_outside_of_loop.rs @@ -0,0 +1,30 @@ +use crate::diagnostics::{Diagnostic, DiagnosticsContext}; + +// Diagnostic: break-outside-of-loop +// +// This diagnostic is triggered if the `break` keyword is used outside of a loop. +pub(super) fn break_outside_of_loop( + ctx: &DiagnosticsContext<'_>, + d: &hir::BreakOutsideOfLoop, +) -> Diagnostic { + Diagnostic::new( + "break-outside-of-loop", + "break outside of loop", + ctx.sema.diagnostics_display_range(d.expr.clone().map(|it| it.into())).range, + ) +} + +#[cfg(test)] +mod tests { + use crate::diagnostics::tests::check_diagnostics; + + #[test] + fn break_outside_of_loop() { + check_diagnostics( + r#" +fn foo() { break; } + //^^^^^ break outside of loop +"#, + ); + } +} -- cgit v1.2.3