1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
use std::sync::Arc;
use salsa::Database;
use ra_db::{FilesDatabase, CrateGraph, SyntaxDatabase};
use ra_syntax::{SmolStr, algo::visit::{visitor, Visitor}, ast::{self, AstNode}};
use relative_path::RelativePath;
use crate::{source_binder, mock::WORKSPACE, module::ModuleSourceNode};
use crate::{
self as hir,
db::HirDatabase,
mock::MockDatabase,
};
fn infer_all_fns(fixture: &str) -> () {
let (db, source_root) = MockDatabase::with_files(fixture);
for &file_id in source_root.files.values() {
let source_file = db.source_file(file_id);
for fn_def in source_file.syntax().descendants().filter_map(ast::FnDef::cast) {
let func = source_binder::function_from_source(&db, file_id, fn_def).unwrap().unwrap();
let inference_result = func.infer(&db);
for (syntax_ptr, ty) in &inference_result.type_for {
let node = syntax_ptr.resolve(&source_file);
eprintln!("{} '{}': {:?}", syntax_ptr.range(), node.text(), ty);
}
}
}
}
#[test]
fn infer_smoke_test() {
let text = "
//- /lib.rs
fn foo(x: u32, y: !) -> i128 {
x;
y;
return 1;
\"hello\";
0
}
";
infer_all_fns(text);
}
|