about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/hir-ty/src/layout/adt.rs14
-rw-r--r--crates/rust-analyzer/src/handlers.rs45
-rw-r--r--crates/rust-analyzer/src/lib.rs6
-rw-r--r--crates/rust-analyzer/src/main_loop.rs52
4 files changed, 58 insertions, 59 deletions
diff --git a/crates/hir-ty/src/layout/adt.rs b/crates/hir-ty/src/layout/adt.rs
index 9dbf9b2419c..81793e3795a 100644
--- a/crates/hir-ty/src/layout/adt.rs
+++ b/crates/hir-ty/src/layout/adt.rs
@@ -38,18 +38,18 @@ pub fn layout_of_adt_query(
             .map(|(fd, _)| layout_of_ty(db, &field_ty(db, def, fd, &subst), cx.krate))
             .collect::<Result<Vec<_>, _>>()
     };
-    let (variants, is_enum, is_union, repr) = match def {
+    let (variants, repr) = match def {
         AdtId::StructId(s) => {
             let data = db.struct_data(s);
             let mut r = SmallVec::<[_; 1]>::new();
             r.push(handle_variant(s.into(), &data.variant_data)?);
-            (r, false, false, data.repr.unwrap_or_default())
+            (r, data.repr.unwrap_or_default())
         }
         AdtId::UnionId(id) => {
             let data = db.union_data(id);
             let mut r = SmallVec::new();
             r.push(handle_variant(id.into(), &data.variant_data)?);
-            (r, false, true, data.repr.unwrap_or_default())
+            (r, data.repr.unwrap_or_default())
         }
         AdtId::EnumId(e) => {
             let data = db.enum_data(e);
@@ -63,19 +63,19 @@ pub fn layout_of_adt_query(
                     )
                 })
                 .collect::<Result<SmallVec<_>, _>>()?;
-            (r, true, false, data.repr.unwrap_or_default())
+            (r, data.repr.unwrap_or_default())
         }
     };
     let variants =
         variants.iter().map(|x| x.iter().collect::<Vec<_>>()).collect::<SmallVec<[_; 1]>>();
     let variants = variants.iter().map(|x| x.iter().collect()).collect();
-    if is_union {
+    if matches!(def, AdtId::UnionId(..)) {
         cx.layout_of_union(&repr, &variants).ok_or(LayoutError::Unknown)
     } else {
         cx.layout_of_struct_or_enum(
             &repr,
             &variants,
-            is_enum,
+            matches!(def, AdtId::EnumId(..)),
             is_unsafe_cell(db, def),
             layout_scalar_valid_range(db, def),
             |min, max| repr_discr(&dl, &repr, min, max).unwrap_or((Integer::I8, false)),
@@ -95,7 +95,7 @@ pub fn layout_of_adt_query(
             //     .iter_enumerated()
             //     .any(|(i, v)| v.discr != ty::VariantDiscr::Relative(i.as_u32()))
             repr.inhibit_enum_layout_opt(),
-            !is_enum
+            !matches!(def, AdtId::EnumId(..))
                 && variants
                     .iter()
                     .next()
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs
deleted file mode 100644
index c19be196544..00000000000
--- a/crates/rust-analyzer/src/handlers.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-//! This module is responsible for implementing handlers for Language Server
-//! Protocol. The majority of requests are fulfilled by calling into the
-//! `ide` crate.
-
-use ide::AssistResolveStrategy;
-use lsp_types::{Diagnostic, DiagnosticTag, NumberOrString, Url};
-
-use vfs::FileId;
-
-use crate::{global_state::GlobalStateSnapshot, to_proto, Result};
-
-pub(crate) mod request;
-pub(crate) mod notification;
-
-pub(crate) fn publish_diagnostics(
-    snap: &GlobalStateSnapshot,
-    file_id: FileId,
-) -> Result<Vec<Diagnostic>> {
-    let _p = profile::span("publish_diagnostics");
-    let line_index = snap.file_line_index(file_id)?;
-
-    let diagnostics: Vec<Diagnostic> = snap
-        .analysis
-        .diagnostics(&snap.config.diagnostics(), AssistResolveStrategy::None, file_id)?
-        .into_iter()
-        .map(|d| Diagnostic {
-            range: to_proto::range(&line_index, d.range),
-            severity: Some(to_proto::diagnostic_severity(d.severity)),
-            code: Some(NumberOrString::String(d.code.as_str().to_string())),
-            code_description: Some(lsp_types::CodeDescription {
-                href: Url::parse(&format!(
-                    "https://rust-analyzer.github.io/manual.html#{}",
-                    d.code.as_str()
-                ))
-                .unwrap(),
-            }),
-            source: Some("rust-analyzer".to_string()),
-            message: d.message,
-            related_information: None,
-            tags: if d.unused { Some(vec![DiagnosticTag::UNNECESSARY]) } else { None },
-            data: None,
-        })
-        .collect();
-    Ok(diagnostics)
-}
diff --git a/crates/rust-analyzer/src/lib.rs b/crates/rust-analyzer/src/lib.rs
index 32dc3750fdf..65de4366e9f 100644
--- a/crates/rust-analyzer/src/lib.rs
+++ b/crates/rust-analyzer/src/lib.rs
@@ -25,7 +25,6 @@ mod diff;
 mod dispatch;
 mod from_proto;
 mod global_state;
-mod handlers;
 mod line_index;
 mod lsp_utils;
 mod main_loop;
@@ -38,6 +37,11 @@ mod task_pool;
 mod to_proto;
 mod version;
 
+mod handlers {
+    pub(crate) mod notification;
+    pub(crate) mod request;
+}
+
 pub mod config;
 pub mod lsp_ext;
 
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index ea8dbc54388..f06abe0763e 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -764,15 +764,55 @@ impl GlobalState {
 
         let snapshot = self.snapshot();
         self.task_pool.handle.spawn(move || {
+            let _p = profile::span("publish_diagnostics");
             let diagnostics = subscriptions
                 .into_iter()
                 .filter_map(|file_id| {
-                    crate::handlers::publish_diagnostics(&snapshot, file_id)
-                        .ok()
-                        .map(|diags| (file_id, diags))
+                    let line_index = snapshot.file_line_index(file_id).ok()?;
+                    Some((
+                        file_id,
+                        line_index,
+                        snapshot
+                            .analysis
+                            .diagnostics(
+                                &snapshot.config.diagnostics(),
+                                ide::AssistResolveStrategy::None,
+                                file_id,
+                            )
+                            .ok()?,
+                    ))
                 })
-                .collect::<Vec<_>>();
-            Task::Diagnostics(diagnostics)
-        })
+                .map(|(file_id, line_index, it)| {
+                    (
+                        file_id,
+                        it.into_iter()
+                            .map(move |d| lsp_types::Diagnostic {
+                                range: crate::to_proto::range(&line_index, d.range),
+                                severity: Some(crate::to_proto::diagnostic_severity(d.severity)),
+                                code: Some(lsp_types::NumberOrString::String(
+                                    d.code.as_str().to_string(),
+                                )),
+                                code_description: Some(lsp_types::CodeDescription {
+                                    href: lsp_types::Url::parse(&format!(
+                                        "https://rust-analyzer.github.io/manual.html#{}",
+                                        d.code.as_str()
+                                    ))
+                                    .unwrap(),
+                                }),
+                                source: Some("rust-analyzer".to_string()),
+                                message: d.message,
+                                related_information: None,
+                                tags: if d.unused {
+                                    Some(vec![lsp_types::DiagnosticTag::UNNECESSARY])
+                                } else {
+                                    None
+                                },
+                                data: None,
+                            })
+                            .collect::<Vec<_>>(),
+                    )
+                });
+            Task::Diagnostics(diagnostics.collect())
+        });
     }
 }