From 3b1a648539487c08bc613b6fd6e573b0e0e38948 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 20 Oct 2020 17:04:38 +0200 Subject: More type safety around names --- crates/base_db/src/fixture.rs | 4 ++-- crates/base_db/src/input.rs | 27 ++++++++++++++++++++------- crates/base_db/src/lib.rs | 4 ++-- crates/hir/src/code_model.rs | 4 ++-- crates/ide/src/inlay_hints.rs | 5 ++--- crates/project_model/src/lib.rs | 8 +++++--- 6 files changed, 33 insertions(+), 19 deletions(-) diff --git a/crates/base_db/src/fixture.rs b/crates/base_db/src/fixture.rs index 72f1fd667..66e6443cb 100644 --- a/crates/base_db/src/fixture.rs +++ b/crates/base_db/src/fixture.rs @@ -158,7 +158,7 @@ impl ChangeFixture { let crate_id = crate_graph.add_crate_root( file_id, meta.edition, - Some(crate_name.clone()), + Some(crate_name.clone().into()), meta.cfg, meta.env, Default::default(), @@ -187,7 +187,7 @@ impl ChangeFixture { crate_graph.add_crate_root( crate_root, Edition::Edition2018, - Some(CrateName::new("test").unwrap()), + Some(CrateName::new("test").unwrap().into()), default_cfg, Env::default(), Default::default(), diff --git a/crates/base_db/src/input.rs b/crates/base_db/src/input.rs index 02c7348ff..87f0a0ce5 100644 --- a/crates/base_db/src/input.rs +++ b/crates/base_db/src/input.rs @@ -108,24 +108,37 @@ impl ops::Deref for CrateName { } #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct CrateDisplayName(CrateName); +pub struct CrateDisplayName { + // The name we use to display various paths (with `_`). + crate_name: CrateName, + // The name as specified in Cargo.toml (with `-`). + canonical_name: String, +} impl From for CrateDisplayName { - fn from(inner: CrateName) -> CrateDisplayName { - CrateDisplayName(inner) + fn from(crate_name: CrateName) -> CrateDisplayName { + let canonical_name = crate_name.to_string(); + CrateDisplayName { crate_name, canonical_name } } } impl fmt::Display for CrateDisplayName { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.0) + write!(f, "{}", self.crate_name) } } impl ops::Deref for CrateDisplayName { type Target = str; fn deref(&self) -> &str { - &*self.0 + &*self.crate_name + } +} + +impl CrateDisplayName { + pub fn from_canonical_name(canonical_name: String) -> CrateDisplayName { + let crate_name = CrateName::normalize_dashes(&canonical_name); + CrateDisplayName { crate_name, canonical_name } } } @@ -155,7 +168,7 @@ pub struct CrateData { /// /// For purposes of analysis, crates are anonymous (only names in /// `Dependency` matters), this name should only be used for UI. - pub display_name: Option, + pub display_name: Option, pub cfg_options: CfgOptions, pub env: Env, pub dependencies: Vec, @@ -184,7 +197,7 @@ impl CrateGraph { &mut self, file_id: FileId, edition: Edition, - display_name: Option, + display_name: Option, cfg_options: CfgOptions, env: Env, proc_macro: Vec<(SmolStr, Arc)>, diff --git a/crates/base_db/src/lib.rs b/crates/base_db/src/lib.rs index e38aa7257..0804202d6 100644 --- a/crates/base_db/src/lib.rs +++ b/crates/base_db/src/lib.rs @@ -13,8 +13,8 @@ pub use crate::{ cancellation::Canceled, change::Change, input::{ - CrateData, CrateGraph, CrateId, CrateName, Dependency, Edition, Env, FileId, ProcMacroId, - SourceRoot, SourceRootId, + CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, Dependency, Edition, Env, + FileId, ProcMacroId, SourceRoot, SourceRootId, }, }; pub use salsa; diff --git a/crates/hir/src/code_model.rs b/crates/hir/src/code_model.rs index 64f3fbe31..7f169ccd2 100644 --- a/crates/hir/src/code_model.rs +++ b/crates/hir/src/code_model.rs @@ -2,7 +2,7 @@ use std::{iter, sync::Arc}; use arrayvec::ArrayVec; -use base_db::{CrateId, CrateName, Edition, FileId}; +use base_db::{CrateDisplayName, CrateId, Edition, FileId}; use either::Either; use hir_def::find_path::PrefixKind; use hir_def::{ @@ -103,7 +103,7 @@ impl Crate { db.crate_graph()[self.id].edition } - pub fn display_name(self, db: &dyn HirDatabase) -> Option { + pub fn display_name(self, db: &dyn HirDatabase) -> Option { db.crate_graph()[self.id].display_name.clone() } diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs index f5f366354..56b985e80 100644 --- a/crates/ide/src/inlay_hints.rs +++ b/crates/ide/src/inlay_hints.rs @@ -1,15 +1,14 @@ use assists::utils::FamousDefs; +use either::Either; use hir::{known, HirDisplay, Semantics}; use ide_db::RootDatabase; use stdx::to_lower_snake_case; use syntax::{ - ast::{self, ArgListOwner, AstNode}, + ast::{self, ArgListOwner, AstNode, NameOwner}, match_ast, Direction, NodeOrToken, SmolStr, SyntaxKind, TextRange, T, }; use crate::FileId; -use ast::NameOwner; -use either::Either; #[derive(Clone, Debug, PartialEq, Eq)] pub struct InlayHintsConfig { diff --git a/crates/project_model/src/lib.rs b/crates/project_model/src/lib.rs index ea95d1c77..5db41bc16 100644 --- a/crates/project_model/src/lib.rs +++ b/crates/project_model/src/lib.rs @@ -13,7 +13,7 @@ use std::{ }; use anyhow::{bail, Context, Result}; -use base_db::{CrateGraph, CrateId, CrateName, Edition, Env, FileId}; +use base_db::{CrateDisplayName, CrateGraph, CrateId, CrateName, Edition, Env, FileId}; use cfg::CfgOptions; use paths::{AbsPath, AbsPathBuf}; use rustc_hash::{FxHashMap, FxHashSet}; @@ -408,10 +408,12 @@ impl ProjectWorkspace { .map(|it| proc_macro_client.by_dylib_path(&it)) .unwrap_or_default(); + let display_name = + CrateDisplayName::from_canonical_name(cargo[pkg].name.clone()); let crate_id = crate_graph.add_crate_root( file_id, edition, - Some(CrateName::normalize_dashes(&cargo[pkg].name)), + Some(display_name), cfg_options, env, proc_macro.clone(), @@ -556,7 +558,7 @@ fn sysroot_to_crate_graph( let crate_id = crate_graph.add_crate_root( file_id, Edition::Edition2018, - Some(name), + Some(name.into()), cfg_options.clone(), env, proc_macro, -- cgit v1.2.3