mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Merge #5158
5158: Use CrateName correctly r=matklad a=matklad
bors r+
🤖
Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
686e115e73
8 changed files with 45 additions and 29 deletions
|
@ -149,15 +149,17 @@ fn with_files(
|
||||||
let crate_id = crate_graph.add_crate_root(
|
let crate_id = crate_graph.add_crate_root(
|
||||||
file_id,
|
file_id,
|
||||||
meta.edition,
|
meta.edition,
|
||||||
Some(CrateName::new(&krate).unwrap()),
|
Some(krate.clone()),
|
||||||
meta.cfg,
|
meta.cfg,
|
||||||
meta.env,
|
meta.env,
|
||||||
Default::default(),
|
Default::default(),
|
||||||
);
|
);
|
||||||
let prev = crates.insert(krate.clone(), crate_id);
|
let crate_name = CrateName::new(&krate).unwrap();
|
||||||
|
let prev = crates.insert(crate_name.clone(), crate_id);
|
||||||
assert!(prev.is_none());
|
assert!(prev.is_none());
|
||||||
for dep in meta.deps {
|
for dep in meta.deps {
|
||||||
crate_deps.push((krate.clone(), dep))
|
let dep = CrateName::new(&dep).unwrap();
|
||||||
|
crate_deps.push((crate_name.clone(), dep))
|
||||||
}
|
}
|
||||||
} else if meta.path == "/main.rs" || meta.path == "/lib.rs" {
|
} else if meta.path == "/main.rs" || meta.path == "/lib.rs" {
|
||||||
assert!(default_crate_root.is_none());
|
assert!(default_crate_root.is_none());
|
||||||
|
|
|
@ -67,7 +67,7 @@ pub struct CrateGraph {
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
pub struct CrateId(pub u32);
|
pub struct CrateId(pub u32);
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
pub struct CrateName(SmolStr);
|
pub struct CrateName(SmolStr);
|
||||||
|
|
||||||
impl CrateName {
|
impl CrateName {
|
||||||
|
@ -94,6 +94,13 @@ impl fmt::Display for CrateName {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ops::Deref for CrateName {
|
||||||
|
type Target = str;
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&*self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
|
||||||
pub struct ProcMacroId(pub u32);
|
pub struct ProcMacroId(pub u32);
|
||||||
|
|
||||||
|
@ -117,7 +124,7 @@ pub struct CrateData {
|
||||||
/// The name to display to the end user.
|
/// The name to display to the end user.
|
||||||
/// This actual crate name can be different in a particular dependent crate
|
/// This actual crate name can be different in a particular dependent crate
|
||||||
/// or may even be missing for some cases, such as a dummy crate for the code snippet.
|
/// or may even be missing for some cases, such as a dummy crate for the code snippet.
|
||||||
pub display_name: Option<CrateName>,
|
pub display_name: Option<String>,
|
||||||
pub cfg_options: CfgOptions,
|
pub cfg_options: CfgOptions,
|
||||||
pub env: Env,
|
pub env: Env,
|
||||||
pub dependencies: Vec<Dependency>,
|
pub dependencies: Vec<Dependency>,
|
||||||
|
@ -138,7 +145,7 @@ pub struct Env {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct Dependency {
|
pub struct Dependency {
|
||||||
pub crate_id: CrateId,
|
pub crate_id: CrateId,
|
||||||
pub name: SmolStr,
|
pub name: CrateName,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CrateGraph {
|
impl CrateGraph {
|
||||||
|
@ -146,7 +153,7 @@ impl CrateGraph {
|
||||||
&mut self,
|
&mut self,
|
||||||
file_id: FileId,
|
file_id: FileId,
|
||||||
edition: Edition,
|
edition: Edition,
|
||||||
display_name: Option<CrateName>,
|
display_name: Option<String>,
|
||||||
cfg_options: CfgOptions,
|
cfg_options: CfgOptions,
|
||||||
env: Env,
|
env: Env,
|
||||||
proc_macro: Vec<(SmolStr, Arc<dyn ra_tt::TokenExpander>)>,
|
proc_macro: Vec<(SmolStr, Arc<dyn ra_tt::TokenExpander>)>,
|
||||||
|
@ -178,7 +185,7 @@ impl CrateGraph {
|
||||||
if self.dfs_find(from, to, &mut FxHashSet::default()) {
|
if self.dfs_find(from, to, &mut FxHashSet::default()) {
|
||||||
return Err(CyclicDependenciesError);
|
return Err(CyclicDependenciesError);
|
||||||
}
|
}
|
||||||
self.arena.get_mut(&from).unwrap().add_dep(name.0, to);
|
self.arena.get_mut(&from).unwrap().add_dep(name, to);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +254,7 @@ impl CrateId {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CrateData {
|
impl CrateData {
|
||||||
fn add_dep(&mut self, name: SmolStr, crate_id: CrateId) {
|
fn add_dep(&mut self, name: CrateName, crate_id: CrateId) {
|
||||||
self.dependencies.push(Dependency { name, crate_id })
|
self.dependencies.push(Dependency { name, crate_id })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -429,7 +436,10 @@ mod tests {
|
||||||
.is_ok());
|
.is_ok());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
graph[crate1].dependencies,
|
graph[crate1].dependencies,
|
||||||
vec![Dependency { crate_id: crate2, name: "crate_name_with_dashes".into() }]
|
vec![Dependency {
|
||||||
|
crate_id: crate2,
|
||||||
|
name: CrateName::new("crate_name_with_dashes").unwrap()
|
||||||
|
}]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ use hir_ty::{
|
||||||
ApplicationTy, Canonical, GenericPredicate, InEnvironment, Substs, TraitEnvironment, Ty,
|
ApplicationTy, Canonical, GenericPredicate, InEnvironment, Substs, TraitEnvironment, Ty,
|
||||||
TyDefId, TypeCtor,
|
TyDefId, TypeCtor,
|
||||||
};
|
};
|
||||||
use ra_db::{CrateId, CrateName, Edition, FileId};
|
use ra_db::{CrateId, Edition, FileId};
|
||||||
use ra_prof::profile;
|
use ra_prof::profile;
|
||||||
use ra_syntax::ast::{self, AttrsOwner, NameOwner};
|
use ra_syntax::ast::{self, AttrsOwner, NameOwner};
|
||||||
use rustc_hash::FxHashSet;
|
use rustc_hash::FxHashSet;
|
||||||
|
@ -94,8 +94,8 @@ impl Crate {
|
||||||
db.crate_graph()[self.id].edition
|
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<String> {
|
||||||
db.crate_graph()[self.id].display_name.as_ref().cloned()
|
db.crate_graph()[self.id].display_name.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn query_external_importables(
|
pub fn query_external_importables(
|
||||||
|
|
|
@ -161,7 +161,7 @@ fn find_builtin_crate(db: &dyn AstDatabase, id: LazyMacroId) -> tt::TokenTree {
|
||||||
// XXX
|
// XXX
|
||||||
// All crates except core itself should have a dependency on core,
|
// All crates except core itself should have a dependency on core,
|
||||||
// We detect `core` by seeing whether it doesn't have such a dependency.
|
// We detect `core` by seeing whether it doesn't have such a dependency.
|
||||||
let tt = if cg[krate].dependencies.iter().any(|dep| dep.name == "core") {
|
let tt = if cg[krate].dependencies.iter().any(|dep| &*dep.name == "core") {
|
||||||
quote! { core }
|
quote! { core }
|
||||||
} else {
|
} else {
|
||||||
quote! { crate }
|
quote! { crate }
|
||||||
|
|
|
@ -117,7 +117,7 @@ impl AsName for ast::FieldKind {
|
||||||
|
|
||||||
impl AsName for ra_db::Dependency {
|
impl AsName for ra_db::Dependency {
|
||||||
fn as_name(&self) -> Name {
|
fn as_name(&self) -> Name {
|
||||||
Name::new_text(self.name.clone())
|
Name::new_text(SmolStr::new(&*self.name))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ impl MockAnalysis {
|
||||||
let other_crate = crate_graph.add_crate_root(
|
let other_crate = crate_graph.add_crate_root(
|
||||||
file_id,
|
file_id,
|
||||||
edition,
|
edition,
|
||||||
Some(CrateName::new(crate_name).unwrap()),
|
Some(crate_name.to_string()),
|
||||||
cfg,
|
cfg,
|
||||||
env,
|
env,
|
||||||
Default::default(),
|
Default::default(),
|
||||||
|
|
|
@ -288,10 +288,7 @@ impl ProjectWorkspace {
|
||||||
if let (Some(&from), Some(&to)) =
|
if let (Some(&from), Some(&to)) =
|
||||||
(crates.get(&from_crate_id), crates.get(&to_crate_id))
|
(crates.get(&from_crate_id), crates.get(&to_crate_id))
|
||||||
{
|
{
|
||||||
if crate_graph
|
if crate_graph.add_dep(from, dep.name.clone(), to).is_err() {
|
||||||
.add_dep(from, CrateName::new(&dep.name).unwrap(), to)
|
|
||||||
.is_err()
|
|
||||||
{
|
|
||||||
log::error!(
|
log::error!(
|
||||||
"cyclic dependency {:?} -> {:?}",
|
"cyclic dependency {:?} -> {:?}",
|
||||||
from_crate_id,
|
from_crate_id,
|
||||||
|
@ -312,13 +309,11 @@ impl ProjectWorkspace {
|
||||||
|
|
||||||
let env = Env::default();
|
let env = Env::default();
|
||||||
let proc_macro = vec![];
|
let proc_macro = vec![];
|
||||||
let crate_name = CrateName::new(&sysroot[krate].name)
|
let name = sysroot[krate].name.clone();
|
||||||
.expect("Sysroot crate names should not contain dashes");
|
|
||||||
|
|
||||||
let crate_id = crate_graph.add_crate_root(
|
let crate_id = crate_graph.add_crate_root(
|
||||||
file_id,
|
file_id,
|
||||||
Edition::Edition2018,
|
Edition::Edition2018,
|
||||||
Some(crate_name),
|
Some(name),
|
||||||
cfg_options.clone(),
|
cfg_options.clone(),
|
||||||
env,
|
env,
|
||||||
proc_macro,
|
proc_macro,
|
||||||
|
@ -392,7 +387,7 @@ impl ProjectWorkspace {
|
||||||
let crate_id = crate_graph.add_crate_root(
|
let crate_id = crate_graph.add_crate_root(
|
||||||
file_id,
|
file_id,
|
||||||
edition,
|
edition,
|
||||||
Some(CrateName::normalize_dashes(&cargo[pkg].name)),
|
Some(cargo[pkg].name.clone()),
|
||||||
cfg_options,
|
cfg_options,
|
||||||
env,
|
env,
|
||||||
proc_macro.clone(),
|
proc_macro.clone(),
|
||||||
|
|
|
@ -4,9 +4,9 @@ use std::path::PathBuf;
|
||||||
|
|
||||||
use paths::{AbsPath, AbsPathBuf};
|
use paths::{AbsPath, AbsPathBuf};
|
||||||
use ra_cfg::CfgOptions;
|
use ra_cfg::CfgOptions;
|
||||||
use ra_db::{CrateId, Dependency, Edition};
|
use ra_db::{CrateId, CrateName, Dependency, Edition};
|
||||||
use rustc_hash::FxHashSet;
|
use rustc_hash::FxHashSet;
|
||||||
use serde::Deserialize;
|
use serde::{de, Deserialize};
|
||||||
use stdx::split_delim;
|
use stdx::split_delim;
|
||||||
|
|
||||||
/// Roots and crates that compose this Rust project.
|
/// Roots and crates that compose this Rust project.
|
||||||
|
@ -50,7 +50,7 @@ impl ProjectJson {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|dep_data| Dependency {
|
.map(|dep_data| Dependency {
|
||||||
crate_id: CrateId(dep_data.krate as u32),
|
crate_id: CrateId(dep_data.krate as u32),
|
||||||
name: dep_data.name.into(),
|
name: dep_data.name,
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
cfg: {
|
cfg: {
|
||||||
|
@ -113,5 +113,14 @@ struct DepData {
|
||||||
/// Identifies a crate by position in the crates array.
|
/// Identifies a crate by position in the crates array.
|
||||||
#[serde(rename = "crate")]
|
#[serde(rename = "crate")]
|
||||||
krate: usize,
|
krate: usize,
|
||||||
name: String,
|
#[serde(deserialize_with = "deserialize_crate_name")]
|
||||||
|
name: CrateName,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_crate_name<'de, D>(de: D) -> Result<CrateName, D::Error>
|
||||||
|
where
|
||||||
|
D: de::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let name = String::deserialize(de)?;
|
||||||
|
CrateName::new(&name).map_err(|err| de::Error::custom(format!("invalid crate name: {:?}", err)))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue