1 use super::{infer, type_at, type_at_pos};
2 use crate::test_db::TestDB;
3 use insta::assert_snapshot;
4 use ra_db::fixture::WithFixture;
8 let (db, pos) = TestDB::with_position(
10 //- /main.rs crate:main deps:foo cfg:test
16 fn foo1(&self) -> i32 { 0 }
21 fn foo2(&self) -> i32 { 0 }
25 let t = (S.foo1(), S.foo2(), T.foo3(), T.foo4());
34 fn foo3(&self) -> i32 { 0 }
39 fn foo4(&self) -> i32 { 0 }
43 assert_eq!("(i32, {unknown}, i32, {unknown})", type_at_pos(&db, pos));
47 fn infer_macros_expanded() {
53 ($($item:expr),*) => {
65 ![0; 17) '{Foo(v...,2,])}': Foo
66 ![1; 4) 'Foo': Foo({unknown}) -> Foo
67 ![1; 16) 'Foo(vec![1,2,])': Foo
68 ![5; 15) 'vec![1,2,]': {unknown}
69 [156; 182) '{ ...,2); }': ()
76 fn infer_legacy_textual_scoped_macros_expanded() {
84 ($($item:expr),*) => {
94 let y = crate::foo!(1,2);
98 ![0; 17) '{Foo(v...,2,])}': Foo
99 ![1; 4) 'Foo': Foo({unknown}) -> Foo
100 ![1; 16) 'Foo(vec![1,2,])': Foo
101 ![5; 15) 'vec![1,2,]': {unknown}
102 [195; 251) '{ ...,2); }': ()
104 [228; 229) 'y': {unknown}
105 [232; 248) 'crate:...!(1,2)': {unknown}
111 fn infer_path_qualified_macros_expanded() {
120 pub use super::foo as bar;
124 let x = crate::foo!();
131 [111; 164) '{ ...!(); }': ()
139 fn infer_type_value_macro_having_same_name() {
157 let foo = foo::foo!(42i32);
162 [171; 206) '{ ...32); }': ()
163 [181; 184) 'foo': i32
169 fn processes_impls_generated_by_macros() {
174 ($ident:ident) => (impl Trait for $ident {})
176 trait Trait { fn foo(self) -> u128 {} }
179 fn test() { S.foo()<|>; }
182 assert_eq!(t, "u128");
186 fn infer_macro_with_dollar_crate_is_correct_in_expr() {
187 let (db, pos) = TestDB::with_position(
189 //- /main.rs crate:main deps:foo
191 let x = (foo::foo!(1), foo::foo!(2));
195 //- /lib.rs crate:foo
198 (1) => { $crate::bar!() };
199 (2) => { 1 + $crate::baz() };
207 pub fn baz() -> usize { 31usize }
210 assert_eq!("(i32, usize)", type_at_pos(&db, pos));
214 fn infer_type_value_non_legacy_macro_use_as() {
219 ($x:ident) => { type $x = u64; }
221 pub(crate) use _foo as foo;
232 [159; 164) '{ 0 }': u64
234 [175; 199) '{ ...f(); }': ()
236 [193; 194) 'f': fn f() -> u64
237 [193; 196) 'f()': u64
243 fn infer_builtin_macros_line() {
246 #[rustc_builtin_macro]
247 macro_rules! line {() => {}}
255 [64; 88) '{ ...!(); }': ()
262 fn infer_builtin_macros_file() {
265 #[rustc_builtin_macro]
266 macro_rules! file {() => {}}
274 [64; 88) '{ ...!(); }': ()
281 fn infer_builtin_macros_column() {
284 #[rustc_builtin_macro]
285 macro_rules! column {() => {}}
293 [66; 92) '{ ...!(); }': ()
300 fn infer_derive_clone_simple() {
301 let (db, pos) = TestDB::with_position(
303 //- /main.rs crate:main deps:std
310 //- /lib.rs crate:std
315 fn clone(&self) -> Self;
320 assert_eq!("S", type_at_pos(&db, pos));
324 fn infer_derive_clone_with_params() {
325 let (db, pos) = TestDB::with_position(
327 //- /main.rs crate:main deps:std
331 struct Wrapper<T>(T);
334 (Wrapper(S).clone(), Wrapper(NonClone).clone())<|>;
337 //- /lib.rs crate:std
342 fn clone(&self) -> Self;
347 assert_eq!("(Wrapper<S>, {unknown})", type_at_pos(&db, pos));