aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/tests.rs
blob: f2466dd517eb5dfb206e2a134f5036cb82ce55c4 (plain)
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);
}