ide: Generate monikers for local crates.

This commit is contained in:
Emilio Cobos Álvarez 2022-10-22 15:10:03 +02:00
parent 19efa0b110
commit 8039a07a5e
No known key found for this signature in database
GPG key ID: E1152D0994E4BF8A
3 changed files with 56 additions and 18 deletions

View file

@ -73,8 +73,8 @@ impl MonikerResult {
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct PackageInformation { pub struct PackageInformation {
pub name: String, pub name: String,
pub repo: String, pub repo: Option<String>,
pub version: String, pub version: Option<String>,
} }
pub(crate) fn crate_for_file(db: &RootDatabase, file_id: FileId) -> Option<Crate> { pub(crate) fn crate_for_file(db: &RootDatabase, file_id: FileId) -> Option<Crate> {
@ -256,18 +256,18 @@ pub(crate) fn def_to_moniker(
let (name, repo, version) = match krate.origin(db) { let (name, repo, version) = match krate.origin(db) {
CrateOrigin::CratesIo { repo, name } => ( CrateOrigin::CratesIo { repo, name } => (
name.unwrap_or(krate.display_name(db)?.canonical_name().to_string()), name.unwrap_or(krate.display_name(db)?.canonical_name().to_string()),
repo?, repo,
krate.version(db)?, krate.version(db),
), ),
CrateOrigin::Lang(lang) => ( CrateOrigin::Lang(lang) => (
krate.display_name(db)?.canonical_name().to_string(), krate.display_name(db)?.canonical_name().to_string(),
"https://github.com/rust-lang/rust/".to_string(), Some("https://github.com/rust-lang/rust/".to_string()),
match lang { Some(match lang {
LangCrateOrigin::Other => { LangCrateOrigin::Other => {
"https://github.com/rust-lang/rust/library/".into() "https://github.com/rust-lang/rust/library/".into()
} }
lang => format!("https://github.com/rust-lang/rust/library/{lang}",), lang => format!("https://github.com/rust-lang/rust/library/{lang}",),
}, }),
), ),
}; };
PackageInformation { name, repo, version } PackageInformation { name, repo, version }
@ -315,7 +315,7 @@ pub mod module {
} }
"#, "#,
"foo::module::func", "foo::module::func",
r#"PackageInformation { name: "foo", repo: "https://a.b/foo.git", version: "0.1.0" }"#, r#"PackageInformation { name: "foo", repo: Some("https://a.b/foo.git"), version: Some("0.1.0") }"#,
MonikerKind::Import, MonikerKind::Import,
); );
check_moniker( check_moniker(
@ -331,7 +331,7 @@ pub mod module {
} }
"#, "#,
"foo::module::func", "foo::module::func",
r#"PackageInformation { name: "foo", repo: "https://a.b/foo.git", version: "0.1.0" }"#, r#"PackageInformation { name: "foo", repo: Some("https://a.b/foo.git"), version: Some("0.1.0") }"#,
MonikerKind::Export, MonikerKind::Export,
); );
} }
@ -348,7 +348,7 @@ pub mod module {
} }
"#, "#,
"foo::module::MyTrait::func", "foo::module::MyTrait::func",
r#"PackageInformation { name: "foo", repo: "https://a.b/foo.git", version: "0.1.0" }"#, r#"PackageInformation { name: "foo", repo: Some("https://a.b/foo.git"), version: Some("0.1.0") }"#,
MonikerKind::Export, MonikerKind::Export,
); );
} }
@ -365,7 +365,7 @@ pub mod module {
} }
"#, "#,
"foo::module::MyTrait::MY_CONST", "foo::module::MyTrait::MY_CONST",
r#"PackageInformation { name: "foo", repo: "https://a.b/foo.git", version: "0.1.0" }"#, r#"PackageInformation { name: "foo", repo: Some("https://a.b/foo.git"), version: Some("0.1.0") }"#,
MonikerKind::Export, MonikerKind::Export,
); );
} }
@ -382,7 +382,7 @@ pub mod module {
} }
"#, "#,
"foo::module::MyTrait::MyType", "foo::module::MyTrait::MyType",
r#"PackageInformation { name: "foo", repo: "https://a.b/foo.git", version: "0.1.0" }"#, r#"PackageInformation { name: "foo", repo: Some("https://a.b/foo.git"), version: Some("0.1.0") }"#,
MonikerKind::Export, MonikerKind::Export,
); );
} }
@ -405,7 +405,7 @@ pub mod module {
} }
"#, "#,
"foo::module::MyStruct::MyTrait::func", "foo::module::MyStruct::MyTrait::func",
r#"PackageInformation { name: "foo", repo: "https://a.b/foo.git", version: "0.1.0" }"#, r#"PackageInformation { name: "foo", repo: Some("https://a.b/foo.git"), version: Some("0.1.0") }"#,
MonikerKind::Export, MonikerKind::Export,
); );
} }
@ -425,7 +425,7 @@ pub struct St {
} }
"#, "#,
"foo::St::a", "foo::St::a",
r#"PackageInformation { name: "foo", repo: "https://a.b/foo.git", version: "0.1.0" }"#, r#"PackageInformation { name: "foo", repo: Some("https://a.b/foo.git"), version: Some("0.1.0") }"#,
MonikerKind::Import, MonikerKind::Import,
); );
} }

View file

@ -106,12 +106,12 @@ impl LsifManager<'_> {
manager: "cargo".to_string(), manager: "cargo".to_string(),
uri: None, uri: None,
content: None, content: None,
repository: Some(lsif::Repository { repository: pi.repo.map(|url| lsif::Repository {
url: pi.repo, url,
r#type: "git".to_string(), r#type: "git".to_string(),
commit_id: None, commit_id: None,
}), }),
version: Some(pi.version), version: pi.version,
})); }));
self.package_map.insert(package_information, result_set_id); self.package_map.insert(package_information, result_set_id);
result_set_id result_set_id

View file

@ -231,7 +231,7 @@ fn token_to_symbol(token: &TokenStaticData) -> Option<scip_types::Symbol> {
package: Some(scip_types::Package { package: Some(scip_types::Package {
manager: "cargo".to_string(), manager: "cargo".to_string(),
name: package_name, name: package_name,
version, version: version.unwrap_or_else(|| ".".to_string()),
..Default::default() ..Default::default()
}) })
.into(), .into(),
@ -415,4 +415,42 @@ pub mod module {
"", "",
); );
} }
#[test]
fn global_symbol_for_pub_struct() {
check_symbol(
r#"
//- /lib.rs crate:main
mod foo;
fn main() {
let _bar = foo::Bar { i: 0 };
}
//- /foo.rs
pub struct Bar$0 {
pub i: i32,
}
"#,
"rust-analyzer cargo main . foo/Bar#",
);
}
#[test]
fn global_symbol_for_pub_struct_reference() {
check_symbol(
r#"
//- /lib.rs crate:main
mod foo;
fn main() {
let _bar = foo::Bar$0 { i: 0 };
}
//- /foo.rs
pub struct Bar {
pub i: i32,
}
"#,
"rust-analyzer cargo main . foo/Bar#",
);
}
} }