More type safety around names

This commit is contained in:
Aleksey Kladov 2020-10-20 17:04:38 +02:00
parent a85c4280bf
commit 3b1a648539
6 changed files with 33 additions and 19 deletions

View file

@ -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(),

View file

@ -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<CrateName> 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<CrateName>,
pub display_name: Option<CrateDisplayName>,
pub cfg_options: CfgOptions,
pub env: Env,
pub dependencies: Vec<Dependency>,
@ -184,7 +197,7 @@ impl CrateGraph {
&mut self,
file_id: FileId,
edition: Edition,
display_name: Option<CrateName>,
display_name: Option<CrateDisplayName>,
cfg_options: CfgOptions,
env: Env,
proc_macro: Vec<(SmolStr, Arc<dyn tt::TokenExpander>)>,

View file

@ -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;

View file

@ -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<CrateName> {
pub fn display_name(self, db: &dyn HirDatabase) -> Option<CrateDisplayName> {
db.crate_graph()[self.id].display_name.clone()
}

View file

@ -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 {

View file

@ -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,