@@ -17,7 +17,10 @@ use crate::{
17
17
diagnostics_sink:: { Diagnostic , DiagnosticCode , DiagnosticSink } ,
18
18
} ;
19
19
20
- pub use crate :: diagnostics:: expr:: { record_literal_missing_fields, record_pattern_missing_fields} ;
20
+ pub use crate :: diagnostics:: {
21
+ expr:: { record_literal_missing_fields, record_pattern_missing_fields} ,
22
+ unsafe_check:: missing_unsafe,
23
+ } ;
21
24
22
25
pub fn validate_module_item (
23
26
db : & dyn HirDatabase ,
@@ -33,38 +36,8 @@ pub fn validate_module_item(
33
36
pub fn validate_body ( db : & dyn HirDatabase , owner : DefWithBodyId , sink : & mut DiagnosticSink < ' _ > ) {
34
37
let _p = profile:: span ( "validate_body" ) ;
35
38
let infer = db. infer ( owner) ;
36
- infer. add_diagnostics ( db, owner, sink) ;
37
39
let mut validator = expr:: ExprValidator :: new ( owner, infer. clone ( ) , sink) ;
38
40
validator. validate_body ( db) ;
39
- let mut validator = unsafe_check:: UnsafeValidator :: new ( owner, infer, sink) ;
40
- validator. validate_body ( db) ;
41
- }
42
-
43
- // Diagnostic: no-such-field
44
- //
45
- // This diagnostic is triggered if created structure does not have field provided in record.
46
- #[ derive( Debug ) ]
47
- pub struct NoSuchField {
48
- pub file : HirFileId ,
49
- pub field : AstPtr < ast:: RecordExprField > ,
50
- }
51
-
52
- impl Diagnostic for NoSuchField {
53
- fn code ( & self ) -> DiagnosticCode {
54
- DiagnosticCode ( "no-such-field" )
55
- }
56
-
57
- fn message ( & self ) -> String {
58
- "no such field" . to_string ( )
59
- }
60
-
61
- fn display_source ( & self ) -> InFile < SyntaxNodePtr > {
62
- InFile :: new ( self . file , self . field . clone ( ) . into ( ) )
63
- }
64
-
65
- fn as_any ( & self ) -> & ( dyn Any + Send + ' static ) {
66
- self
67
- }
68
41
}
69
42
70
43
// Diagnostic: missing-structure-fields
@@ -247,54 +220,6 @@ impl Diagnostic for RemoveThisSemicolon {
247
220
}
248
221
}
249
222
250
- // Diagnostic: break-outside-of-loop
251
- //
252
- // This diagnostic is triggered if the `break` keyword is used outside of a loop.
253
- #[ derive( Debug ) ]
254
- pub struct BreakOutsideOfLoop {
255
- pub file : HirFileId ,
256
- pub expr : AstPtr < ast:: Expr > ,
257
- }
258
-
259
- impl Diagnostic for BreakOutsideOfLoop {
260
- fn code ( & self ) -> DiagnosticCode {
261
- DiagnosticCode ( "break-outside-of-loop" )
262
- }
263
- fn message ( & self ) -> String {
264
- "break outside of loop" . to_string ( )
265
- }
266
- fn display_source ( & self ) -> InFile < SyntaxNodePtr > {
267
- InFile { file_id : self . file , value : self . expr . clone ( ) . into ( ) }
268
- }
269
- fn as_any ( & self ) -> & ( dyn Any + Send + ' static ) {
270
- self
271
- }
272
- }
273
-
274
- // Diagnostic: missing-unsafe
275
- //
276
- // This diagnostic is triggered if an operation marked as `unsafe` is used outside of an `unsafe` function or block.
277
- #[ derive( Debug ) ]
278
- pub struct MissingUnsafe {
279
- pub file : HirFileId ,
280
- pub expr : AstPtr < ast:: Expr > ,
281
- }
282
-
283
- impl Diagnostic for MissingUnsafe {
284
- fn code ( & self ) -> DiagnosticCode {
285
- DiagnosticCode ( "missing-unsafe" )
286
- }
287
- fn message ( & self ) -> String {
288
- format ! ( "This operation is unsafe and requires an unsafe function or block" )
289
- }
290
- fn display_source ( & self ) -> InFile < SyntaxNodePtr > {
291
- InFile { file_id : self . file , value : self . expr . clone ( ) . into ( ) }
292
- }
293
- fn as_any ( & self ) -> & ( dyn Any + Send + ' static ) {
294
- self
295
- }
296
- }
297
-
298
223
// Diagnostic: mismatched-arg-count
299
224
//
300
225
// This diagnostic is triggered if a function is invoked with an incorrect amount of arguments.
@@ -530,129 +455,6 @@ mod tests {
530
455
assert_eq ! ( annotations, actual) ;
531
456
}
532
457
533
- #[ test]
534
- fn no_such_field_diagnostics ( ) {
535
- check_diagnostics (
536
- r#"
537
- struct S { foo: i32, bar: () }
538
- impl S {
539
- fn new() -> S {
540
- S {
541
- //^ Missing structure fields:
542
- //| - bar
543
- foo: 92,
544
- baz: 62,
545
- //^^^^^^^ no such field
546
- }
547
- }
548
- }
549
- "# ,
550
- ) ;
551
- }
552
- #[ test]
553
- fn no_such_field_with_feature_flag_diagnostics ( ) {
554
- check_diagnostics (
555
- r#"
556
- //- /lib.rs crate:foo cfg:feature=foo
557
- struct MyStruct {
558
- my_val: usize,
559
- #[cfg(feature = "foo")]
560
- bar: bool,
561
- }
562
-
563
- impl MyStruct {
564
- #[cfg(feature = "foo")]
565
- pub(crate) fn new(my_val: usize, bar: bool) -> Self {
566
- Self { my_val, bar }
567
- }
568
- #[cfg(not(feature = "foo"))]
569
- pub(crate) fn new(my_val: usize, _bar: bool) -> Self {
570
- Self { my_val }
571
- }
572
- }
573
- "# ,
574
- ) ;
575
- }
576
-
577
- #[ test]
578
- fn no_such_field_enum_with_feature_flag_diagnostics ( ) {
579
- check_diagnostics (
580
- r#"
581
- //- /lib.rs crate:foo cfg:feature=foo
582
- enum Foo {
583
- #[cfg(not(feature = "foo"))]
584
- Buz,
585
- #[cfg(feature = "foo")]
586
- Bar,
587
- Baz
588
- }
589
-
590
- fn test_fn(f: Foo) {
591
- match f {
592
- Foo::Bar => {},
593
- Foo::Baz => {},
594
- }
595
- }
596
- "# ,
597
- ) ;
598
- }
599
-
600
- #[ test]
601
- fn no_such_field_with_feature_flag_diagnostics_on_struct_lit ( ) {
602
- check_diagnostics (
603
- r#"
604
- //- /lib.rs crate:foo cfg:feature=foo
605
- struct S {
606
- #[cfg(feature = "foo")]
607
- foo: u32,
608
- #[cfg(not(feature = "foo"))]
609
- bar: u32,
610
- }
611
-
612
- impl S {
613
- #[cfg(feature = "foo")]
614
- fn new(foo: u32) -> Self {
615
- Self { foo }
616
- }
617
- #[cfg(not(feature = "foo"))]
618
- fn new(bar: u32) -> Self {
619
- Self { bar }
620
- }
621
- fn new2(bar: u32) -> Self {
622
- #[cfg(feature = "foo")]
623
- { Self { foo: bar } }
624
- #[cfg(not(feature = "foo"))]
625
- { Self { bar } }
626
- }
627
- fn new2(val: u32) -> Self {
628
- Self {
629
- #[cfg(feature = "foo")]
630
- foo: val,
631
- #[cfg(not(feature = "foo"))]
632
- bar: val,
633
- }
634
- }
635
- }
636
- "# ,
637
- ) ;
638
- }
639
-
640
- #[ test]
641
- fn no_such_field_with_type_macro ( ) {
642
- check_diagnostics (
643
- r#"
644
- macro_rules! Type { () => { u32 }; }
645
- struct Foo { bar: Type![] }
646
-
647
- impl Foo {
648
- fn new() -> Self {
649
- Foo { bar: 0 }
650
- }
651
- }
652
- "# ,
653
- ) ;
654
- }
655
-
656
458
#[ test]
657
459
fn missing_record_pat_field_diagnostic ( ) {
658
460
check_diagnostics (
@@ -734,16 +536,6 @@ pub struct Claims {
734
536
) ;
735
537
}
736
538
737
- #[ test]
738
- fn break_outside_of_loop ( ) {
739
- check_diagnostics (
740
- r#"
741
- fn foo() { break; }
742
- //^^^^^ break outside of loop
743
- "# ,
744
- ) ;
745
- }
746
-
747
539
#[ test]
748
540
fn missing_semicolon ( ) {
749
541
check_diagnostics (
0 commit comments