Mercurial > projects > dil
annotate trunk/src/dil/Information.d @ 422:ad7977fe315a
Added support for column numbers in error messages.
Moved class Location to module Information.
In class Lexer:
Renamed p_newl to beginLine.
Added member errorLoc.
Renamed fileName to filePath.
Tidied up the code and reordered some methods.
Renamed set_p_newl() to setLineBegin().
All other modifications are pretty much self-explanatory.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sun, 30 Sep 2007 15:20:35 +0200 |
parents | 33b566df6af4 |
children | bb3cb00feeb2 |
rev | line source |
---|---|
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
1 /++ |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
2 Author: Aziz Köksal |
249 | 3 License: GPL3 |
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
4 +/ |
326 | 5 module dil.Information; |
327 | 6 import dil.Messages; |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
327
diff
changeset
|
7 import common; |
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
8 |
94 | 9 enum InfoType |
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
10 { |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
11 Lexer, |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
12 Parser, |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
13 Semantic |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
14 } |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
15 |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
16 class Information |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
17 { |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
18 MID id; |
94 | 19 InfoType type; |
422
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
20 Location location; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
21 uint column; |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
327
diff
changeset
|
22 string message; |
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
23 |
422
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
24 this(InfoType type, MID id, Location location, string message) |
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
25 { |
422
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
26 assert(location !is null); |
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
27 this.id = id; |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
28 this.type = type; |
422
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
29 this.location = location; |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
327
diff
changeset
|
30 this.message = message; |
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
31 } |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
32 |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
33 string getMsg() |
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
34 { |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
327
diff
changeset
|
35 return this.message; |
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
36 } |
422
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
37 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
38 size_t loc() |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
39 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
40 return location.lineNum; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
41 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
42 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
43 size_t col() |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
44 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
45 if (column == 0) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
46 column = location.calculateColumn(); |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
47 return column; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
48 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
49 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
50 string filePath() |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
51 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
52 return location.filePath; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
53 } |
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
diff
changeset
|
54 } |
422
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
55 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
56 final class Location |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
57 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
58 char[] filePath; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
59 size_t lineNum; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
60 char* lineBegin, to; // Used to calculate column. |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
61 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
62 this(char[] filePath, size_t lineNum) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
63 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
64 set(filePath, lineNum); |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
65 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
66 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
67 this(char[] filePath, size_t lineNum, char* lineBegin, char* to) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
68 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
69 set(filePath, lineNum, lineBegin, to); |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
70 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
71 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
72 Location clone() |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
73 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
74 return new Location(filePath, lineNum, lineBegin, to); |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
75 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
76 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
77 void set(char[] filePath, size_t lineNum) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
78 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
79 set(filePath, lineNum, null, null); |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
80 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
81 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
82 void set(char[] filePath, size_t lineNum, char* lineBegin, char* to) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
83 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
84 this.filePath = filePath; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
85 set(lineNum, lineBegin, to); |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
86 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
87 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
88 void set(size_t lineNum, char* lineBegin, char* to) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
89 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
90 assert(lineBegin <= to); |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
91 this.lineNum = lineNum; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
92 this.lineBegin = lineBegin; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
93 this.to = to; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
94 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
95 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
96 void setFilePath(char[] filePath) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
97 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
98 this.filePath = filePath; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
99 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
100 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
101 /+ |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
102 This is a primitive method to count the number of characters in a string. |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
103 Unicode compound characters and other special characters are not |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
104 taken into account. |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
105 +/ |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
106 uint calculateColumn() |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
107 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
108 uint col; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
109 auto p = lineBegin; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
110 for (; p <= to; ++p) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
111 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
112 assert(delegate () |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
113 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
114 const char[3] LS = \u2028; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
115 const char[3] PS = \u2029; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
116 // Check that there is no newline between p and to. |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
117 // But 'to' may point to a newline. |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
118 if (p != to && (*p == '\n' || *p == '\r')) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
119 return false; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
120 if (to-p >= 2) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
121 { |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
122 if (*p == LS[0] && p[1] == LS[1] && (p[2] == LS[2] || p[2] == PS[2])) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
123 return false; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
124 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
125 return true; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
126 }() == true |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
127 ); |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
128 |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
129 // Skip this byte if it is a trail byte of a UTF-8 sequence. |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
130 if (*p & 0x80 && !(*p & 0x40)) |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
131 continue; // *p == 0b10xx_xxxx |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
132 // Only count ASCII characters and the first byte of a UTF-8 sequence. |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
133 ++col; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
134 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
135 return col; |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
136 } |
ad7977fe315a
Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
137 } |