mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-02 22:54:58 +00:00
Emit moniker in lsif
This commit is contained in:
parent
a07e406d06
commit
30ed7fac27
12 changed files with 589 additions and 18 deletions
|
@ -10,9 +10,10 @@ use tt::Subtree;
|
|||
use vfs::{file_set::FileSet, VfsPath};
|
||||
|
||||
use crate::{
|
||||
input::CrateName, Change, CrateDisplayName, CrateGraph, CrateId, Dependency, Edition, Env,
|
||||
FileId, FilePosition, FileRange, ProcMacro, ProcMacroExpander, ProcMacroExpansionError,
|
||||
SourceDatabaseExt, SourceRoot, SourceRootId,
|
||||
input::{CrateName, CrateOrigin},
|
||||
Change, CrateDisplayName, CrateGraph, CrateId, Dependency, Edition, Env, FileId, FilePosition,
|
||||
FileRange, ProcMacro, ProcMacroExpander, ProcMacroExpansionError, SourceDatabaseExt,
|
||||
SourceRoot, SourceRootId,
|
||||
};
|
||||
|
||||
pub const WORKSPACE: SourceRootId = SourceRootId(0);
|
||||
|
@ -130,7 +131,7 @@ impl ChangeFixture {
|
|||
current_source_root_kind = *kind;
|
||||
}
|
||||
|
||||
if let Some(krate) = meta.krate {
|
||||
if let Some((krate, origin)) = meta.krate {
|
||||
let crate_name = CrateName::normalize_dashes(&krate);
|
||||
let crate_id = crate_graph.add_crate_root(
|
||||
file_id,
|
||||
|
@ -141,6 +142,7 @@ impl ChangeFixture {
|
|||
meta.cfg,
|
||||
meta.env,
|
||||
Default::default(),
|
||||
origin,
|
||||
);
|
||||
let prev = crates.insert(crate_name.clone(), crate_id);
|
||||
assert!(prev.is_none());
|
||||
|
@ -174,6 +176,7 @@ impl ChangeFixture {
|
|||
default_cfg,
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
} else {
|
||||
for (from, to, prelude) in crate_deps {
|
||||
|
@ -209,6 +212,7 @@ impl ChangeFixture {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Vec::new(),
|
||||
CrateOrigin::Lang("core".to_string()),
|
||||
);
|
||||
|
||||
for krate in all_crates {
|
||||
|
@ -243,6 +247,7 @@ impl ChangeFixture {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
proc_macro,
|
||||
CrateOrigin::Lang("proc-macro".to_string()),
|
||||
);
|
||||
|
||||
for krate in all_crates {
|
||||
|
@ -324,7 +329,7 @@ enum SourceRootKind {
|
|||
#[derive(Debug)]
|
||||
struct FileMeta {
|
||||
path: String,
|
||||
krate: Option<String>,
|
||||
krate: Option<(String, CrateOrigin)>,
|
||||
deps: Vec<String>,
|
||||
extern_prelude: Vec<String>,
|
||||
cfg: CfgOptions,
|
||||
|
@ -333,16 +338,36 @@ struct FileMeta {
|
|||
introduce_new_source_root: Option<SourceRootKind>,
|
||||
}
|
||||
|
||||
fn parse_crate(crate_str: String) -> (String, CrateOrigin) {
|
||||
if let Some((a, b)) = crate_str.split_once("@") {
|
||||
(
|
||||
a.to_owned(),
|
||||
match b.split_once(":") {
|
||||
Some(("CratesIo", data)) => match data.split_once(",") {
|
||||
Some((version, url)) => CrateOrigin::CratesIo {
|
||||
name: a.to_owned(),
|
||||
repo: Some(url.to_owned()),
|
||||
version: version.to_owned(),
|
||||
},
|
||||
_ => panic!("Bad crates.io parameter: {}", data),
|
||||
},
|
||||
_ => panic!("Bad string for crate origin: {}", b),
|
||||
},
|
||||
)
|
||||
} else {
|
||||
(crate_str, CrateOrigin::Unknown)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Fixture> for FileMeta {
|
||||
fn from(f: Fixture) -> FileMeta {
|
||||
let mut cfg = CfgOptions::default();
|
||||
f.cfg_atoms.iter().for_each(|it| cfg.insert_atom(it.into()));
|
||||
f.cfg_key_values.iter().for_each(|(k, v)| cfg.insert_key_value(k.into(), v.into()));
|
||||
|
||||
let deps = f.deps;
|
||||
FileMeta {
|
||||
path: f.path,
|
||||
krate: f.krate,
|
||||
krate: f.krate.map(parse_crate),
|
||||
extern_prelude: f.extern_prelude.unwrap_or_else(|| deps.clone()),
|
||||
deps,
|
||||
cfg,
|
||||
|
|
|
@ -112,6 +112,24 @@ impl ops::Deref for CrateName {
|
|||
}
|
||||
}
|
||||
|
||||
/// Origin of the crates. It is used in emitting monikers.
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum CrateOrigin {
|
||||
/// Crates that are from crates.io official registry,
|
||||
CratesIo { name: String, version: String, repo: Option<String> },
|
||||
/// Crates that are provided by the language, like std, core, proc-macro, ...
|
||||
Lang(String),
|
||||
/// Crates that we don't know their origin.
|
||||
// Idealy this enum should cover all cases, and then we remove this variant.
|
||||
Unknown,
|
||||
}
|
||||
|
||||
impl Default for CrateOrigin {
|
||||
fn default() -> Self {
|
||||
Self::Unknown
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
pub struct CrateDisplayName {
|
||||
// The name we use to display various paths (with `_`).
|
||||
|
@ -205,6 +223,7 @@ pub struct CrateData {
|
|||
pub env: Env,
|
||||
pub dependencies: Vec<Dependency>,
|
||||
pub proc_macro: Vec<ProcMacro>,
|
||||
pub origin: CrateOrigin,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
|
@ -256,6 +275,7 @@ impl CrateGraph {
|
|||
potential_cfg_options: CfgOptions,
|
||||
env: Env,
|
||||
proc_macro: Vec<ProcMacro>,
|
||||
origin: CrateOrigin,
|
||||
) -> CrateId {
|
||||
let data = CrateData {
|
||||
root_file_id: file_id,
|
||||
|
@ -267,6 +287,7 @@ impl CrateGraph {
|
|||
env,
|
||||
proc_macro,
|
||||
dependencies: Vec::new(),
|
||||
origin,
|
||||
};
|
||||
let crate_id = CrateId(self.arena.len() as u32);
|
||||
let prev = self.arena.insert(crate_id, data);
|
||||
|
@ -571,6 +592,7 @@ mod tests {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
let crate2 = graph.add_crate_root(
|
||||
FileId(2u32),
|
||||
|
@ -581,6 +603,7 @@ mod tests {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
let crate3 = graph.add_crate_root(
|
||||
FileId(3u32),
|
||||
|
@ -591,6 +614,7 @@ mod tests {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
assert!(graph
|
||||
.add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
|
||||
|
@ -615,6 +639,7 @@ mod tests {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
let crate2 = graph.add_crate_root(
|
||||
FileId(2u32),
|
||||
|
@ -625,6 +650,7 @@ mod tests {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
assert!(graph
|
||||
.add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
|
||||
|
@ -646,6 +672,7 @@ mod tests {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
let crate2 = graph.add_crate_root(
|
||||
FileId(2u32),
|
||||
|
@ -656,6 +683,7 @@ mod tests {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
let crate3 = graph.add_crate_root(
|
||||
FileId(3u32),
|
||||
|
@ -666,6 +694,7 @@ mod tests {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
assert!(graph
|
||||
.add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
|
||||
|
@ -687,6 +716,7 @@ mod tests {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
let crate2 = graph.add_crate_root(
|
||||
FileId(2u32),
|
||||
|
@ -697,6 +727,7 @@ mod tests {
|
|||
CfgOptions::default(),
|
||||
Env::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
assert!(graph
|
||||
.add_dep(
|
||||
|
|
|
@ -11,9 +11,9 @@ use syntax::{ast, Parse, SourceFile, TextRange, TextSize};
|
|||
pub use crate::{
|
||||
change::Change,
|
||||
input::{
|
||||
CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, Dependency, Edition, Env,
|
||||
ProcMacro, ProcMacroExpander, ProcMacroExpansionError, ProcMacroId, ProcMacroKind,
|
||||
SourceRoot, SourceRootId,
|
||||
CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency,
|
||||
Edition, Env, ProcMacro, ProcMacroExpander, ProcMacroExpansionError, ProcMacroId,
|
||||
ProcMacroKind, SourceRoot, SourceRootId,
|
||||
},
|
||||
};
|
||||
pub use salsa::{self, Cancelled};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue