Mercurial > projects > dang
annotate misc/Error.d @ 93:621cedba53ea new_gen
Removed the Symbol from semantics - it was not needed anymore. From now on you set the type by doing a setType on an Identifier.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Mon, 05 May 2008 20:53:13 +0200 |
parents | eb5b2c719a39 |
children |
rev | line source |
---|---|
1 | 1 module misc.Error; |
2 | |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
3 import tango.core.Exception, |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
4 Array = tango.core.Array, |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
5 tango.text.Util; |
1 | 6 |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
7 import llvm.type; |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
8 |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
9 import lexer.Token, |
93
621cedba53ea
Removed the Symbol from semantics - it was not needed anymore. From now on you set the type by doing a setType on an Identifier.
Anders Johnsen <skabet@gmail.com>
parents:
88
diff
changeset
|
10 sema.DType; |
6 | 11 |
12 class Error : Exception | |
1 | 13 { |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
14 |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
15 this(char[] message) |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
16 { |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
17 super(message); |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
18 args ~= message; |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
19 } |
6 | 20 |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
21 char[] toString() |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
22 { |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
23 char[256] tmp = void; |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
24 char[] msg = layout(tmp, args); |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
56
diff
changeset
|
25 /* |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
26 if (location.source.name.length > 0) |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
27 msg = location.toString ~ ": " ~ msg; |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
28 else |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
29 msg = msg.dup; |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
30 |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
31 if (toks.length > 0) |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
32 { |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
33 Array.sort(toks, |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
34 (Token a, Token b) |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
35 { |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
36 return a.location.position - b.location.position; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
37 }); |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
38 char[] data = toks[0].location.source.data; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
39 size_t low = toks[0].location.position; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
40 size_t high = toks[$ - 1].location.position; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
41 |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
42 size_t line_start = Array.rfind(data[0 .. low], '\n'); |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
43 size_t line_end = high + Array.find(data[high .. $], '\n'); |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
44 char[] line = trim(data[line_start + 1 .. line_end]); |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
45 char[] marks = line.dup; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
46 marks[] = ' '; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
47 foreach (tok; toks[0 .. $]) |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
48 { |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
49 size_t p = tok.location.position - (line.ptr - data.ptr); |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
50 marks[p .. p + tok.length] = '~'; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
51 } |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
52 size_t p = main_tok.location.position - (line.ptr - data.ptr); |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
53 marks[p .. p + main_tok.length] = '^'; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
54 |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
55 msg ~= "\n "; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
56 msg ~= line; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
57 msg ~= "\n "; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
58 msg ~= marks; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
59 } |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
56
diff
changeset
|
60 */ |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
61 return msg; |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
62 } |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
63 |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
64 Error arg(char[] s) |
6 | 65 { |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
66 if (args.length == 11) |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
67 throw new Exception("Sorry, errors only support up to 10 args"); |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
68 args ~= s; |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
69 return this; |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
70 } |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
71 |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
72 Error arg(char[][] s) |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
73 { |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
74 char[] res = s[0 .. $ - 1].join(", "); |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
33
diff
changeset
|
75 if (s.length > 1) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
33
diff
changeset
|
76 res ~= " and "; |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
77 res ~= s[$ - 1]; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
78 return arg(res); |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
79 } |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
80 |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
81 Error arg(char c) |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
82 { |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
83 return arg([c]); |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
84 } |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
85 |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
86 Error arg(DType[] types) |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
87 { |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
88 char[][] res; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
89 foreach (type; types) |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
90 res ~= type.name(); |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
91 return arg(res); |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
92 } |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
93 |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
94 Error arg(Tok[] toks...) |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
95 { |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
96 char[][] res; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
97 foreach (t; toks) |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
98 res ~= typeToString[t]; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
99 return arg(res); |
6 | 100 } |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
101 |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
56
diff
changeset
|
102 /* |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
103 Error loc(Location loc) |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
104 { |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
105 location = loc; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
106 return this; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
107 } |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
56
diff
changeset
|
108 */ |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
109 |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
110 Error tok(Token tok) |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
111 { |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
56
diff
changeset
|
112 /* |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
113 if (toks.length > 0) |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
114 assert(tok.location.source == toks[0].location.source, |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
115 "Tokens must come from the same source"); |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
116 else |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
117 { |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
118 main_tok = tok; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
119 loc = tok.location; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
120 } |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
121 toks ~= tok; |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
56
diff
changeset
|
122 */ |
29
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
123 return this; |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
124 } |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
125 |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
126 private: |
41d23f2762c3
Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents:
24
diff
changeset
|
127 char[][] args; |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
56
diff
changeset
|
128 //Location location; |
33
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
129 Token[] toks; |
084c2c147c4f
Improvements to the Error class.
Anders Halager <halager@gmail.com>
parents:
29
diff
changeset
|
130 Token main_tok; |
1 | 131 } |