aboutsummaryrefslogtreecommitdiff
path: root/src/comp/driver/session.rs
blob: 501b50b1ad6f7a8505934061b8f068312801e492 (plain) (blame)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import front.ast;
import front.codemap;
import util.common.span;
import util.common.ty_mach;
import std._uint;
import std.Term;
import std.io;
import std.map;

tag os {
    os_win32;
    os_macos;
    os_linux;
}

tag arch {
    arch_x86;
    arch_x64;
    arch_arm;
}

type cfg = rec(os os,
               arch arch,
               ty_mach int_type,
               ty_mach uint_type,
               ty_mach float_type);

type crate_metadata = rec(str name,
                          vec[u8] data);

fn emit_diagnostic(span sp, str msg, str kind, u8 color, codemap.codemap cm) {
    auto lo = codemap.lookup_pos(cm, sp.lo);
    auto hi = codemap.lookup_pos(cm, sp.hi);
    io.stdout().write_str(#fmt("%s:%u:%u:%u:%u: ", lo.filename, lo.line,
                               lo.col, hi.line, hi.col));

    if (Term.color_supported()) {
        Term.fg(io.stdout().get_buf_writer(), color);
    }

    io.stdout().write_str(#fmt("%s:", kind));

    if (Term.color_supported()) {
        Term.reset(io.stdout().get_buf_writer());
    }

    io.stdout().write_str(#fmt(" %s\n", msg));
}

state obj session(ast.crate_num cnum, cfg targ,
                  map.hashmap[int, crate_metadata] crates,
                  mutable vec[@ast.meta_item] metadata,
                  codemap.codemap cm) {

    fn get_targ_cfg() -> cfg {
        ret targ;
    }

    fn get_targ_crate_num() -> ast.crate_num {
        ret cnum;
    }

    fn span_err(span sp, str msg) {
        // FIXME: Use constants, but rustboot doesn't know how to export them.
        emit_diagnostic(sp, msg, "error", 9u8, cm);
        fail;
    }

    fn err(str msg) {
        log_err #fmt("error: %s", msg);
        fail;
    }

    fn add_metadata(vec[@ast.meta_item] data) {
        metadata = metadata + data;
    }
    fn get_metadata() -> vec[@ast.meta_item] {
        ret metadata;
    }

    fn span_warn(span sp, str msg) {
        // FIXME: Use constants, but rustboot doesn't know how to export them.
        emit_diagnostic(sp, msg, "warning", 11u8, cm);
    }

    fn bug(str msg) {
        log_err #fmt("error: internal compiler error %s", msg);
        fail;
    }

    fn span_unimpl(span sp, str msg) {
        // FIXME: Use constants, but rustboot doesn't know how to export them.
        emit_diagnostic(sp, "internal compiler error: unimplemented " + msg,
                        "error", 9u8, cm);
        fail;
    }

    fn unimpl(str msg) {
        log_err #fmt("error: unimplemented %s", msg);
        fail;
    }

    fn get_external_crate(int num) -> crate_metadata {
        ret crates.get(num);
    }

    fn set_external_crate(int num, &crate_metadata metadata) {
        crates.insert(num, metadata);
    }

    fn has_external_crate(int num) -> bool {
        ret crates.contains_key(num);
    }

    fn get_codemap() -> codemap.codemap {
        ret cm;
    }

    fn lookup_pos(uint pos) -> codemap.loc {
        ret codemap.lookup_pos(cm, pos);
    }
}


// Local Variables:
// fill-column: 78;
// indent-tabs-mode: nil
// c-basic-offset: 4
// buffer-file-coding-system: utf-8-unix
// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
// End: