From b2dbe6e43a28a22be2b5d8631dff83b644520f59 Mon Sep 17 00:00:00 2001 From: Phil Ellison Date: Wed, 30 Dec 2020 17:23:00 +0000 Subject: Add fix to wrap return expression in Some --- crates/hir_ty/src/diagnostics.rs | 15 +++++++++------ crates/hir_ty/src/diagnostics/expr.rs | 22 ++++++++++++++++------ 2 files changed, 25 insertions(+), 12 deletions(-) (limited to 'crates/hir_ty/src') diff --git a/crates/hir_ty/src/diagnostics.rs b/crates/hir_ty/src/diagnostics.rs index 14e18f5a1..c67a289f2 100644 --- a/crates/hir_ty/src/diagnostics.rs +++ b/crates/hir_ty/src/diagnostics.rs @@ -186,9 +186,10 @@ impl Diagnostic for MissingMatchArms { } } -// Diagnostic: missing-ok-in-tail-expr +// Diagnostic: missing-ok-or-some-in-tail-expr // -// This diagnostic is triggered if block that should return `Result` returns a value not wrapped in `Ok`. +// This diagnostic is triggered if a block that should return `Result` returns a value not wrapped in `Ok`, +// or if a block that should return `Option` returns a value not wrapped in `Some`. // // Example: // @@ -198,17 +199,19 @@ impl Diagnostic for MissingMatchArms { // } // ``` #[derive(Debug)] -pub struct MissingOkInTailExpr { +pub struct MissingOkOrSomeInTailExpr { pub file: HirFileId, pub expr: AstPtr, + // `Some` or `Ok` depending on whether the return type is Result or Option + pub required: String, } -impl Diagnostic for MissingOkInTailExpr { +impl Diagnostic for MissingOkOrSomeInTailExpr { fn code(&self) -> DiagnosticCode { - DiagnosticCode("missing-ok-in-tail-expr") + DiagnosticCode("missing-ok-or-some-in-tail-expr") } fn message(&self) -> String { - "wrap return expression in Ok".to_string() + format!("wrap return expression in {}", self.required) } fn display_source(&self) -> InFile { InFile { file_id: self.file, value: self.expr.clone().into() } diff --git a/crates/hir_ty/src/diagnostics/expr.rs b/crates/hir_ty/src/diagnostics/expr.rs index b4e453411..455b0d4aa 100644 --- a/crates/hir_ty/src/diagnostics/expr.rs +++ b/crates/hir_ty/src/diagnostics/expr.rs @@ -11,7 +11,7 @@ use crate::{ db::HirDatabase, diagnostics::{ match_check::{is_useful, MatchCheckCtx, Matrix, PatStack, Usefulness}, - MismatchedArgCount, MissingFields, MissingMatchArms, MissingOkInTailExpr, MissingPatFields, + MismatchedArgCount, MissingFields, MissingMatchArms, MissingOkOrSomeInTailExpr, MissingPatFields, RemoveThisSemicolon, }, utils::variant_data, @@ -306,27 +306,37 @@ impl<'a, 'b> ExprValidator<'a, 'b> { }; let core_result_path = path![core::result::Result]; + let core_option_path = path![core::option::Option]; let resolver = self.owner.resolver(db.upcast()); let core_result_enum = match resolver.resolve_known_enum(db.upcast(), &core_result_path) { Some(it) => it, _ => return, }; + let core_option_enum = match resolver.resolve_known_enum(db.upcast(), &core_option_path) { + Some(it) => it, + _ => return, + }; let core_result_ctor = TypeCtor::Adt(AdtId::EnumId(core_result_enum)); - let params = match &mismatch.expected { + let core_option_ctor = TypeCtor::Adt(AdtId::EnumId(core_option_enum)); + + let (params, required) = match &mismatch.expected { Ty::Apply(ApplicationTy { ctor, parameters }) if ctor == &core_result_ctor => { - parameters - } + (parameters, "Ok".to_string()) + }, + Ty::Apply(ApplicationTy { ctor, parameters }) if ctor == &core_option_ctor => { + (parameters, "Some".to_string()) + }, _ => return, }; - if params.len() == 2 && params[0] == mismatch.actual { + if params.len() > 0 && params[0] == mismatch.actual { let (_, source_map) = db.body_with_source_map(self.owner.into()); if let Ok(source_ptr) = source_map.expr_syntax(id) { self.sink - .push(MissingOkInTailExpr { file: source_ptr.file_id, expr: source_ptr.value }); + .push(MissingOkOrSomeInTailExpr { file: source_ptr.file_id, expr: source_ptr.value, required }); } } } -- cgit v1.2.3 From 554ee6ea0272349b811c81507088f6e95c2b5a00 Mon Sep 17 00:00:00 2001 From: Phil Ellison Date: Wed, 30 Dec 2020 17:33:33 +0000 Subject: cargo fmt --- crates/hir_ty/src/diagnostics/expr.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'crates/hir_ty/src') diff --git a/crates/hir_ty/src/diagnostics/expr.rs b/crates/hir_ty/src/diagnostics/expr.rs index 455b0d4aa..a1c484fdf 100644 --- a/crates/hir_ty/src/diagnostics/expr.rs +++ b/crates/hir_ty/src/diagnostics/expr.rs @@ -11,8 +11,8 @@ use crate::{ db::HirDatabase, diagnostics::{ match_check::{is_useful, MatchCheckCtx, Matrix, PatStack, Usefulness}, - MismatchedArgCount, MissingFields, MissingMatchArms, MissingOkOrSomeInTailExpr, MissingPatFields, - RemoveThisSemicolon, + MismatchedArgCount, MissingFields, MissingMatchArms, MissingOkOrSomeInTailExpr, + MissingPatFields, RemoveThisSemicolon, }, utils::variant_data, ApplicationTy, InferenceResult, Ty, TypeCtor, @@ -324,10 +324,10 @@ impl<'a, 'b> ExprValidator<'a, 'b> { let (params, required) = match &mismatch.expected { Ty::Apply(ApplicationTy { ctor, parameters }) if ctor == &core_result_ctor => { (parameters, "Ok".to_string()) - }, + } Ty::Apply(ApplicationTy { ctor, parameters }) if ctor == &core_option_ctor => { (parameters, "Some".to_string()) - }, + } _ => return, }; @@ -335,8 +335,11 @@ impl<'a, 'b> ExprValidator<'a, 'b> { let (_, source_map) = db.body_with_source_map(self.owner.into()); if let Ok(source_ptr) = source_map.expr_syntax(id) { - self.sink - .push(MissingOkOrSomeInTailExpr { file: source_ptr.file_id, expr: source_ptr.value, required }); + self.sink.push(MissingOkOrSomeInTailExpr { + file: source_ptr.file_id, + expr: source_ptr.value, + required, + }); } } } -- cgit v1.2.3