Struct dmd.location.BaseLoc
Mapping from byte offset into source file to line/column numbers
						
				struct BaseLoc;
						
					
				Consider this 4-line 24 byte source file:
appLoc(0) is reserved for null locations, so the first BaseLoc gets startIndex = 1
and reserves 25 possible positions. Loc(1) represents the very start of this source
file, and every next byte gets the next Loc, up to Loc(25) which represents the
location right past the very last } character (hence it's 1 more than the file
size of 24, classic fence post problem!).
The next source file will get Loc(26) .. Loc(26 + fileSize + 1) etc.
Now say we know that int y has a Loc(20) and we want to know the line and column number.
First we find the corresponding BaseLoc in locFileTable. Since 20 < 26, the first BaseLoc
contains this location. Since startIndex = 1, we subtract that to get a file offset 19.
To get the line number from the file offset, we binary search into the lines array,
which contains file offsets where each line starts:
locFileTable[0]
We see 14 would be inserted right after 11 at lines[2], so it's line 3 (+1 for 1-indexing).
Since line 3 starts at file offset 11, and 14 - 11 = 3, it's column 4 (again, accounting for 1-indexing)
#line and #file directives are handled with a separate array substitutions because they're rare,
and we don't want to penalize memory usage in their absence.
Fields
| Name | Type | Description | 
|---|---|---|
| filename | const(char)[] | Source file name | 
| lines | uint[] | For each line, the file offset at which it starts. At index 0 there's always a 0 entry. | 
| startIndex | uint | Subtract this from Loc.index to get file offset | 
| startLine | int | Line number at index 0 | 
| substitutions | BaseLoc[] | Substitutions from #line / #file directives | 
Methods
| Name | Description | 
|---|---|
| addSubstitution(offset, filename, line) | Register a new file/line mapping from #file and #line directives | 
| getLoc(offset) | Construct a Locentry for the start of the source file +offsetbytes | 
| newLine(offset) | Register that a new line starts at offsetbytes from the start of the source file | 
| substitute(loc) |