Start on a test for grouped diagnostics

Nathan Sobo created

Change summary

crates/language/src/tests.rs | 110 ++++++++++++++++++++++++++++++++++++++
1 file changed, 110 insertions(+)

Detailed changes

crates/language/src/tests.rs 🔗

@@ -694,6 +694,116 @@ async fn test_empty_diagnostic_ranges(mut cx: gpui::TestAppContext) {
     });
 }
 
+#[gpui::test]
+async fn test_grouped_diagnostics(mut cx: gpui::TestAppContext) {
+    cx.add_model(|cx| {
+        let text = "
+            fn foo(mut v: Vec<usize>) {
+                for x in &v {
+                    v.push(1);
+                }
+            }
+        "
+        .unindent();
+
+        let mut buffer = Buffer::new(0, text, cx);
+        buffer.set_language(Some(Arc::new(rust_lang())), None, cx);
+        let diagnostics = vec![
+            lsp::Diagnostic {
+                range: lsp::Range::new(lsp::Position::new(1, 8), lsp::Position::new(1, 9)),
+                severity: Some(DiagnosticSeverity::WARNING),
+                message: "unused variable: `x`\n`#[warn(unused_variables)]` on by default"
+                    .to_string(),
+                related_information: Some(vec![lsp::DiagnosticRelatedInformation {
+                    location: lsp::Location {
+                        uri: lsp::Url::from_file_path("/example.rs").unwrap(),
+                        range: lsp::Range::new(lsp::Position::new(1, 8), lsp::Position::new(1, 9)),
+                    },
+                    message: "if this is intentional, prefix it with an underscore: `_x`"
+                        .to_string(),
+                }]),
+                ..Default::default()
+            },
+            lsp::Diagnostic {
+                range: lsp::Range::new(lsp::Position::new(1, 8), lsp::Position::new(1, 9)),
+                severity: Some(DiagnosticSeverity::HINT),
+                message: "if this is intentional, prefix it with an underscore: `_x`".to_string(),
+                related_information: Some(vec![lsp::DiagnosticRelatedInformation {
+                    location: lsp::Location {
+                        uri: lsp::Url::from_file_path("/example.rs").unwrap(),
+                        range: lsp::Range::new(lsp::Position::new(1, 8), lsp::Position::new(1, 9)),
+                    },
+                    message: "original diagnostic".to_string(),
+                }]),
+                ..Default::default()
+            },
+            lsp::Diagnostic {
+                range: lsp::Range::new( lsp::Position::new(2, 8), lsp::Position::new(2, 17)),
+                severity: Some(DiagnosticSeverity::ERROR),
+                message: "cannot borrow `v` as mutable because it is also borrowed as immutable\nmutable borrow occurs here".to_string(),
+                related_information: Some(
+                    vec![
+                        lsp::DiagnosticRelatedInformation {
+                            location: lsp::Location {
+                                uri: lsp::Url::from_file_path("/example.rs").unwrap(),
+                                range: lsp::Range::new(lsp::Position::new( 1, 13, ), lsp::Position::new(1, 15)),
+                            },
+                            message: "immutable borrow occurs here".to_string(),
+                        },
+                        lsp::DiagnosticRelatedInformation {
+                            location: lsp::Location {
+                                uri: lsp::Url::from_file_path("/example.rs").unwrap(),
+                                range: lsp::Range::new(lsp::Position::new( 1, 13, ), lsp::Position::new(1, 15)),
+                            },
+                            message: "immutable borrow later used here".to_string(),
+                        },
+                    ],
+                ),
+                ..Default::default()
+            },
+            lsp::Diagnostic {
+                range: lsp::Range::new( lsp::Position::new(1, 13), lsp::Position::new(1, 15)),
+                severity: Some( DiagnosticSeverity::HINT),
+                message: "immutable borrow occurs here".to_string(),
+                related_information: Some(
+                    vec![
+                        lsp::DiagnosticRelatedInformation {
+                            location: lsp::Location {
+                                uri: lsp::Url::from_file_path("/example.rs").unwrap(),
+                                range: lsp::Range::new(lsp::Position::new( 2, 8, ), lsp::Position::new(2, 17)),
+                            },
+                            message: "original diagnostic".to_string(),
+                        },
+                    ],
+                ),
+                ..Default::default()
+            },
+            lsp::Diagnostic {
+                range: lsp::Range::new( lsp::Position::new(1, 13), lsp::Position::new(1, 15)),
+                severity: Some(DiagnosticSeverity::HINT),
+                message: "immutable borrow later used here".to_string(),
+                related_information: Some(
+                    vec![
+                        lsp::DiagnosticRelatedInformation {
+                            location: lsp::Location {
+                                uri: lsp::Url::from_file_path("/example.rs").unwrap(),
+                                range: lsp::Range::new(lsp::Position::new( 2, 8, ), lsp::Position::new(2, 17)),
+                            },
+                            message: "original diagnostic".to_string(),
+                        },
+                    ],
+                ),
+                ..Default::default()
+            },
+        ];
+        buffer.update_diagnostics(None, diagnostics, cx).unwrap();
+
+        // TODO: Group these diagnostics somehow.
+
+        buffer
+    });
+}
+
 fn chunks_with_diagnostics<T: ToOffset>(
     buffer: &Buffer,
     range: Range<T>,