mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-27 12:29:21 +00:00
Merge #2172
2172: Use new text DSL instead of crate_graph! macro r=matklad a=matklad Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
cc2d75d0f8
3 changed files with 25 additions and 138 deletions
|
@ -1,21 +1,10 @@
|
||||||
//! See test_utils/src/marks.rs
|
//! See test_utils/src/marks.rs
|
||||||
|
|
||||||
test_utils::marks!(
|
test_utils::marks!(
|
||||||
bogus_paths
|
|
||||||
// FIXME: restore this mark once hir is split
|
|
||||||
name_res_works_for_broken_modules
|
|
||||||
can_import_enum_variant
|
|
||||||
type_var_cycles_resolve_completely
|
type_var_cycles_resolve_completely
|
||||||
type_var_cycles_resolve_as_possible
|
type_var_cycles_resolve_as_possible
|
||||||
type_var_resolves_to_int_var
|
type_var_resolves_to_int_var
|
||||||
glob_enum
|
|
||||||
glob_across_crates
|
|
||||||
std_prelude
|
|
||||||
match_ergonomics_ref
|
match_ergonomics_ref
|
||||||
infer_while_let
|
infer_while_let
|
||||||
macro_rules_from_other_crates_are_visible_with_macro_use
|
|
||||||
prelude_is_macro_use
|
|
||||||
coerce_merge_fail_fallback
|
coerce_merge_fail_fallback
|
||||||
macro_dollar_crate_self
|
|
||||||
macro_dollar_crate_other
|
|
||||||
);
|
);
|
||||||
|
|
|
@ -77,12 +77,6 @@ impl MockDatabase {
|
||||||
(db, source_root, file_id)
|
(db, source_root, file_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_position(fixture: &str) -> (MockDatabase, FilePosition) {
|
|
||||||
let (db, position) = MockDatabase::from_fixture(fixture);
|
|
||||||
let position = position.expect("expected a marker ( <|> )");
|
|
||||||
(db, position)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn file_id_of(&self, path: &str) -> FileId {
|
pub fn file_id_of(&self, path: &str) -> FileId {
|
||||||
match self.files.get(path) {
|
match self.files.get(path) {
|
||||||
Some(it) => *it,
|
Some(it) => *it,
|
||||||
|
@ -90,25 +84,6 @@ impl MockDatabase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_crate_graph_from_fixture(&mut self, graph: CrateGraphFixture) {
|
|
||||||
let mut ids = FxHashMap::default();
|
|
||||||
let mut crate_graph = CrateGraph::default();
|
|
||||||
for (crate_name, (crate_root, edition, cfg_options, _)) in graph.0.iter() {
|
|
||||||
let crate_root = self.file_id_of(&crate_root);
|
|
||||||
let crate_id = crate_graph.add_crate_root(crate_root, *edition, cfg_options.clone());
|
|
||||||
Arc::make_mut(&mut self.crate_names).insert(crate_id, crate_name.clone());
|
|
||||||
ids.insert(crate_name, crate_id);
|
|
||||||
}
|
|
||||||
for (crate_name, (_, _, _, deps)) in graph.0.iter() {
|
|
||||||
let from = ids[crate_name];
|
|
||||||
for dep in deps {
|
|
||||||
let to = ids[dep];
|
|
||||||
crate_graph.add_dep(from, dep.as_str().into(), to).unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.set_crate_graph(Arc::new(crate_graph))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn diagnostics(&self) -> String {
|
pub fn diagnostics(&self) -> String {
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
let mut files: Vec<FileId> = self.files.values().copied().collect();
|
let mut files: Vec<FileId> = self.files.values().copied().collect();
|
||||||
|
@ -285,46 +260,3 @@ impl MockDatabase {
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct CrateGraphFixture(pub Vec<(String, (String, Edition, CfgOptions, Vec<String>))>);
|
|
||||||
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! crate_graph {
|
|
||||||
($(
|
|
||||||
$crate_name:literal: (
|
|
||||||
$crate_path:literal,
|
|
||||||
$($edition:literal,)?
|
|
||||||
[$($dep:literal),*]
|
|
||||||
$(, cfg = {
|
|
||||||
$($key:literal $(= $value:literal)?),*
|
|
||||||
$(,)?
|
|
||||||
})?
|
|
||||||
),
|
|
||||||
)*) => {{
|
|
||||||
let mut res = $crate::mock::CrateGraphFixture::default();
|
|
||||||
$(
|
|
||||||
#[allow(unused_mut, unused_assignments)]
|
|
||||||
let mut edition = ra_db::Edition::Edition2018;
|
|
||||||
$(edition = ra_db::Edition::from_string($edition);)?
|
|
||||||
let cfg_options = {
|
|
||||||
#[allow(unused_mut)]
|
|
||||||
let mut cfg = ::ra_cfg::CfgOptions::default();
|
|
||||||
$(
|
|
||||||
$(
|
|
||||||
if 0 == 0 $(+ { drop($value); 1})? {
|
|
||||||
cfg.insert_atom($key.into());
|
|
||||||
}
|
|
||||||
$(cfg.insert_key_value($key.into(), $value.into());)?
|
|
||||||
)*
|
|
||||||
)?
|
|
||||||
cfg
|
|
||||||
};
|
|
||||||
res.0.push((
|
|
||||||
$crate_name.to_string(),
|
|
||||||
($crate_path.to_string(), edition, cfg_options, vec![$($dep.to_string()),*])
|
|
||||||
));
|
|
||||||
)*
|
|
||||||
res
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
|
@ -2,8 +2,7 @@ use std::fmt::Write;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use insta::assert_snapshot;
|
use insta::assert_snapshot;
|
||||||
|
use ra_db::{fixture::WithFixture, salsa::Database, FilePosition, SourceDatabase};
|
||||||
use ra_db::{salsa::Database, FilePosition, SourceDatabase};
|
|
||||||
use ra_syntax::{
|
use ra_syntax::{
|
||||||
algo,
|
algo,
|
||||||
ast::{self, AstNode},
|
ast::{self, AstNode},
|
||||||
|
@ -25,9 +24,9 @@ mod coercion;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn cfg_impl_block() {
|
fn cfg_impl_block() {
|
||||||
let (mut db, pos) = MockDatabase::with_position(
|
let (db, pos) = MockDatabase::with_position(
|
||||||
r#"
|
r#"
|
||||||
//- /main.rs
|
//- /main.rs crate:main deps:foo cfg:test
|
||||||
use foo::S as T;
|
use foo::S as T;
|
||||||
struct S;
|
struct S;
|
||||||
|
|
||||||
|
@ -46,7 +45,7 @@ fn test() {
|
||||||
t<|>;
|
t<|>;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- /foo.rs
|
//- /foo.rs crate:foo
|
||||||
struct S;
|
struct S;
|
||||||
|
|
||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
|
@ -60,18 +59,14 @@ impl S {
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
db.set_crate_graph_from_fixture(crate_graph! {
|
|
||||||
"main": ("/main.rs", ["foo"], cfg = { "test" }),
|
|
||||||
"foo": ("/foo.rs", []),
|
|
||||||
});
|
|
||||||
assert_eq!("(i32, {unknown}, i32, {unknown})", type_at_pos(&db, pos));
|
assert_eq!("(i32, {unknown}, i32, {unknown})", type_at_pos(&db, pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn infer_await() {
|
fn infer_await() {
|
||||||
let (mut db, pos) = MockDatabase::with_position(
|
let (db, pos) = MockDatabase::with_position(
|
||||||
r#"
|
r#"
|
||||||
//- /main.rs
|
//- /main.rs crate:main deps:std
|
||||||
|
|
||||||
struct IntFuture;
|
struct IntFuture;
|
||||||
|
|
||||||
|
@ -85,7 +80,7 @@ fn test() {
|
||||||
v<|>;
|
v<|>;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- /std.rs
|
//- /std.rs crate:std
|
||||||
#[prelude_import] use future::*;
|
#[prelude_import] use future::*;
|
||||||
mod future {
|
mod future {
|
||||||
trait Future {
|
trait Future {
|
||||||
|
@ -95,18 +90,14 @@ mod future {
|
||||||
|
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
db.set_crate_graph_from_fixture(crate_graph! {
|
|
||||||
"main": ("/main.rs", ["std"]),
|
|
||||||
"std": ("/std.rs", []),
|
|
||||||
});
|
|
||||||
assert_eq!("u64", type_at_pos(&db, pos));
|
assert_eq!("u64", type_at_pos(&db, pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn infer_box() {
|
fn infer_box() {
|
||||||
let (mut db, pos) = MockDatabase::with_position(
|
let (db, pos) = MockDatabase::with_position(
|
||||||
r#"
|
r#"
|
||||||
//- /main.rs
|
//- /main.rs crate:main deps:std
|
||||||
|
|
||||||
fn test() {
|
fn test() {
|
||||||
let x = box 1;
|
let x = box 1;
|
||||||
|
@ -114,7 +105,7 @@ fn test() {
|
||||||
t<|>;
|
t<|>;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- /std.rs
|
//- /std.rs crate:std
|
||||||
#[prelude_import] use prelude::*;
|
#[prelude_import] use prelude::*;
|
||||||
mod prelude {}
|
mod prelude {}
|
||||||
|
|
||||||
|
@ -126,10 +117,6 @@ mod boxed {
|
||||||
|
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
db.set_crate_graph_from_fixture(crate_graph! {
|
|
||||||
"main": ("/main.rs", ["std"]),
|
|
||||||
"std": ("/std.rs", []),
|
|
||||||
});
|
|
||||||
assert_eq!("(Box<i32>, Box<Box<i32>>, Box<&i32>, Box<[i32;_]>)", type_at_pos(&db, pos));
|
assert_eq!("(Box<i32>, Box<Box<i32>>, Box<&i32>, Box<[i32;_]>)", type_at_pos(&db, pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,9 +141,9 @@ fn test() {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn infer_try() {
|
fn infer_try() {
|
||||||
let (mut db, pos) = MockDatabase::with_position(
|
let (db, pos) = MockDatabase::with_position(
|
||||||
r#"
|
r#"
|
||||||
//- /main.rs
|
//- /main.rs crate:main deps:std
|
||||||
|
|
||||||
fn test() {
|
fn test() {
|
||||||
let r: Result<i32, u64> = Result::Ok(1);
|
let r: Result<i32, u64> = Result::Ok(1);
|
||||||
|
@ -164,7 +151,7 @@ fn test() {
|
||||||
v<|>;
|
v<|>;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- /std.rs
|
//- /std.rs crate:std
|
||||||
|
|
||||||
#[prelude_import] use ops::*;
|
#[prelude_import] use ops::*;
|
||||||
mod ops {
|
mod ops {
|
||||||
|
@ -189,18 +176,14 @@ mod result {
|
||||||
|
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
db.set_crate_graph_from_fixture(crate_graph! {
|
|
||||||
"main": ("/main.rs", ["std"]),
|
|
||||||
"std": ("/std.rs", []),
|
|
||||||
});
|
|
||||||
assert_eq!("i32", type_at_pos(&db, pos));
|
assert_eq!("i32", type_at_pos(&db, pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn infer_for_loop() {
|
fn infer_for_loop() {
|
||||||
let (mut db, pos) = MockDatabase::with_position(
|
let (db, pos) = MockDatabase::with_position(
|
||||||
r#"
|
r#"
|
||||||
//- /main.rs
|
//- /main.rs crate:main deps:std
|
||||||
|
|
||||||
use std::collections::Vec;
|
use std::collections::Vec;
|
||||||
|
|
||||||
|
@ -212,7 +195,7 @@ fn test() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//- /std.rs
|
//- /std.rs crate:std
|
||||||
|
|
||||||
#[prelude_import] use iter::*;
|
#[prelude_import] use iter::*;
|
||||||
mod iter {
|
mod iter {
|
||||||
|
@ -234,10 +217,6 @@ mod collections {
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
db.set_crate_graph_from_fixture(crate_graph! {
|
|
||||||
"main": ("/main.rs", ["std"]),
|
|
||||||
"std": ("/std.rs", []),
|
|
||||||
});
|
|
||||||
assert_eq!("&str", type_at_pos(&db, pos));
|
assert_eq!("&str", type_at_pos(&db, pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2505,15 +2484,15 @@ pub fn main_loop() {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn cross_crate_associated_method_call() {
|
fn cross_crate_associated_method_call() {
|
||||||
let (mut db, pos) = MockDatabase::with_position(
|
let (db, pos) = MockDatabase::with_position(
|
||||||
r#"
|
r#"
|
||||||
//- /main.rs
|
//- /main.rs crate:main deps:other_crate
|
||||||
fn test() {
|
fn test() {
|
||||||
let x = other_crate::foo::S::thing();
|
let x = other_crate::foo::S::thing();
|
||||||
x<|>;
|
x<|>;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- /lib.rs
|
//- /lib.rs crate:other_crate
|
||||||
mod foo {
|
mod foo {
|
||||||
struct S;
|
struct S;
|
||||||
impl S {
|
impl S {
|
||||||
|
@ -2522,10 +2501,6 @@ mod foo {
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
db.set_crate_graph_from_fixture(crate_graph! {
|
|
||||||
"main": ("/main.rs", ["other_crate"]),
|
|
||||||
"other_crate": ("/lib.rs", []),
|
|
||||||
});
|
|
||||||
assert_eq!("i128", type_at_pos(&db, pos));
|
assert_eq!("i128", type_at_pos(&db, pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3403,16 +3378,15 @@ fn test() { S.foo()<|>; }
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn infer_macro_with_dollar_crate_is_correct_in_expr() {
|
fn infer_macro_with_dollar_crate_is_correct_in_expr() {
|
||||||
// covers!(macro_dollar_crate_other);
|
let (db, pos) = MockDatabase::with_position(
|
||||||
let (mut db, pos) = MockDatabase::with_position(
|
|
||||||
r#"
|
r#"
|
||||||
//- /main.rs
|
//- /main.rs crate:main deps:foo
|
||||||
fn test() {
|
fn test() {
|
||||||
let x = (foo::foo!(1), foo::foo!(2));
|
let x = (foo::foo!(1), foo::foo!(2));
|
||||||
x<|>;
|
x<|>;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- /lib.rs
|
//- /lib.rs crate:foo
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! foo {
|
macro_rules! foo {
|
||||||
(1) => { $crate::bar!() };
|
(1) => { $crate::bar!() };
|
||||||
|
@ -3427,10 +3401,6 @@ macro_rules! bar {
|
||||||
pub fn baz() -> usize { 31usize }
|
pub fn baz() -> usize { 31usize }
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
db.set_crate_graph_from_fixture(crate_graph! {
|
|
||||||
"main": ("/main.rs", ["foo"]),
|
|
||||||
"foo": ("/lib.rs", []),
|
|
||||||
});
|
|
||||||
assert_eq!("(i32, usize)", type_at_pos(&db, pos));
|
assert_eq!("(i32, usize)", type_at_pos(&db, pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3512,9 +3482,9 @@ fn test() { (&S).foo()<|>; }
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn method_resolution_trait_from_prelude() {
|
fn method_resolution_trait_from_prelude() {
|
||||||
let (mut db, pos) = MockDatabase::with_position(
|
let (db, pos) = MockDatabase::with_position(
|
||||||
r#"
|
r#"
|
||||||
//- /main.rs
|
//- /main.rs crate:main deps:other_crate
|
||||||
struct S;
|
struct S;
|
||||||
impl Clone for S {}
|
impl Clone for S {}
|
||||||
|
|
||||||
|
@ -3522,7 +3492,7 @@ fn test() {
|
||||||
S.clone()<|>;
|
S.clone()<|>;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- /lib.rs
|
//- /lib.rs crate:other_crate
|
||||||
#[prelude_import] use foo::*;
|
#[prelude_import] use foo::*;
|
||||||
|
|
||||||
mod foo {
|
mod foo {
|
||||||
|
@ -3532,10 +3502,6 @@ mod foo {
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
db.set_crate_graph_from_fixture(crate_graph! {
|
|
||||||
"main": ("/main.rs", ["other_crate"]),
|
|
||||||
"other_crate": ("/lib.rs", []),
|
|
||||||
});
|
|
||||||
assert_eq!("S", type_at_pos(&db, pos));
|
assert_eq!("S", type_at_pos(&db, pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue