forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsession.rs
147 lines (119 loc) · 3.58 KB
/
session.rs
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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 config = rec(os os,
arch arch,
ty_mach int_type,
ty_mach uint_type,
ty_mach float_type);
type options = rec(bool shared,
uint optimize,
bool debuginfo,
bool verify,
bool run_typestate,
bool save_temps,
bool time_passes,
back.Link.output_type output_type,
vec[str] library_search_paths,
str sysroot);
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,
@config targ_cfg, @options opts,
Map.hashmap[int, crate_metadata] crates,
mutable vec[@ast.meta_item] metadata,
codemap.codemap cm) {
fn get_targ_cfg() -> @config {
ret targ_cfg;
}
fn get_opts() -> @options {
ret opts;
}
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: