mirror of
https://github.com/dlang/dmd.git
synced 2025-04-27 13:40:11 +03:00
This commit is contained in:
parent
3070fc288a
commit
0aee4697bd
8 changed files with 39 additions and 30 deletions
|
@ -442,7 +442,7 @@ private struct ErrorInfo
|
|||
this.kind = kind;
|
||||
}
|
||||
|
||||
const SourceLoc loc; // location of error
|
||||
const SourceLoc loc; // location of error
|
||||
Classification headerColor; // color to set `header` output to
|
||||
const(char)* p1; // additional message prefix
|
||||
const(char)* p2; // additional message prefix
|
||||
|
@ -731,13 +731,9 @@ private void verrorPrint(const(char)* format, va_list ap, ref ErrorInfo info)
|
|||
!loc.filename.startsWith(".d-mixin-") &&
|
||||
!global.params.mixinOut.doOutput)
|
||||
{
|
||||
import dmd.root.filename : FileName;
|
||||
if (auto text = cast(const(char[])) global.fileManager.getFileContents(FileName(loc.filename)))
|
||||
{
|
||||
tmp.reset();
|
||||
printErrorLineContext(tmp, text, loc.fileOffset);
|
||||
fputs(tmp.peekChars(), stderr);
|
||||
}
|
||||
tmp.reset();
|
||||
printErrorLineContext(tmp, loc.fileContent, loc.fileOffset);
|
||||
fputs(tmp.peekChars(), stderr);
|
||||
}
|
||||
old_loc = loc;
|
||||
fflush(stderr); // ensure it gets written out in case of compiler aborts
|
||||
|
@ -750,7 +746,7 @@ private void printErrorLineContext(ref OutBuffer buf, const(char)[] text, size_t
|
|||
import dmd.root.utf : utf_decodeChar;
|
||||
|
||||
if (offset >= text.length)
|
||||
return; // Out of bounds (can happen in pre-processed C files currently)
|
||||
return; // Out of bounds (missing source content in SourceLoc)
|
||||
|
||||
// Scan backwards for beginning of line
|
||||
size_t s = offset;
|
||||
|
|
|
@ -383,12 +383,14 @@ struct SourceLoc final
|
|||
uint32_t line;
|
||||
uint32_t column;
|
||||
uint32_t fileOffset;
|
||||
_d_dynamicArray< const char > fileContent;
|
||||
const char* toChars(bool showColumns = Loc::showColumns, MessageStyle messageStyle = Loc::messageStyle) const;
|
||||
SourceLoc() :
|
||||
filename(),
|
||||
line(),
|
||||
column(),
|
||||
fileOffset()
|
||||
fileOffset(),
|
||||
fileContent()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
|
|
@ -421,6 +421,7 @@ struct SourceLoc
|
|||
uint32_t line;
|
||||
uint32_t column;
|
||||
uint32_t fileOffset;
|
||||
DString fileContent;
|
||||
};
|
||||
|
||||
struct Loc
|
||||
|
|
|
@ -132,7 +132,7 @@ class Lexer
|
|||
// debug printf("Lexer::Lexer(%p)\n", base);
|
||||
// debug printf("lexer.filename = %s\n", filename);
|
||||
token = Token.init;
|
||||
this.baseLoc = newBaseLoc(filename, endoffset);
|
||||
this.baseLoc = newBaseLoc(filename, base[0 .. endoffset]);
|
||||
this.linnum = 1;
|
||||
this.base = base;
|
||||
this.end = base + endoffset;
|
||||
|
@ -224,7 +224,7 @@ class Lexer
|
|||
inTokenStringConstant = 0;
|
||||
lastDocLine = 0;
|
||||
|
||||
baseLoc = newBaseLoc("#defines", slice.length);
|
||||
baseLoc = newBaseLoc("#defines", slice);
|
||||
scanloc = baseLoc.getLoc(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ nothrow:
|
|||
extern (C++) static Loc singleFilename(const char* filename)
|
||||
{
|
||||
Loc result;
|
||||
locFileTable ~= new BaseLoc(filename.toDString, locIndex, 0, [0]);
|
||||
locFileTable ~= new BaseLoc(filename.toDString, null, locIndex, 0, [0]);
|
||||
result.index = locIndex++;
|
||||
return result;
|
||||
}
|
||||
|
@ -235,16 +235,20 @@ struct SourceLoc
|
|||
uint column; /// column number (starts at 1)
|
||||
uint fileOffset; /// byte index into file
|
||||
|
||||
/// Index `fileOffset` into this to to obtain source code context of this location
|
||||
const(char)[] fileContent;
|
||||
|
||||
// aliases for backwards compatibility
|
||||
alias linnum = line;
|
||||
alias charnum = column;
|
||||
|
||||
this(const(char)[] filename, uint line, uint column, uint fileOffset = 0) nothrow @nogc pure @safe
|
||||
this(const(char)[] filename, uint line, uint column, uint fileOffset = 0, const(char)[] fileContent = null) nothrow @nogc pure @safe
|
||||
{
|
||||
this.filename = filename;
|
||||
this.line = line;
|
||||
this.column = column;
|
||||
this.fileOffset = fileOffset;
|
||||
this.fileContent = fileContent;
|
||||
}
|
||||
|
||||
this(Loc loc) nothrow @nogc @trusted
|
||||
|
@ -300,15 +304,15 @@ private size_t fileTableIndex(uint index) nothrow @nogc
|
|||
* Create a new source location map for a file
|
||||
* Params:
|
||||
* filename = source file name
|
||||
* size = space to reserve for locations, equal to the file size in bytes
|
||||
* fileContent = content of source file
|
||||
* Returns: new BaseLoc
|
||||
*/
|
||||
BaseLoc* newBaseLoc(const(char)* filename, size_t size) nothrow
|
||||
BaseLoc* newBaseLoc(const(char)* filename, const(char)[] fileContent) nothrow
|
||||
{
|
||||
locFileTable ~= new BaseLoc(filename.toDString, locIndex, 1, [0]);
|
||||
locFileTable ~= new BaseLoc(filename.toDString, fileContent, locIndex, 1, [0]);
|
||||
// Careful: the endloc of a FuncDeclaration can
|
||||
// point to 1 past the very last byte in the file, so account for that
|
||||
locIndex += size + 1;
|
||||
locIndex += fileContent.length + 1;
|
||||
return locFileTable[$ - 1];
|
||||
}
|
||||
|
||||
|
@ -354,6 +358,7 @@ struct BaseLoc
|
|||
@safe nothrow:
|
||||
|
||||
const(char)[] filename; /// Source file name
|
||||
const(char)[] fileContents; /// Source file contents
|
||||
uint startIndex; /// Subtract this from Loc.index to get file offset
|
||||
int startLine = 1; /// Line number at index 0
|
||||
uint[] lines; /// For each line, the file offset at which it starts. At index 0 there's always a 0 entry.
|
||||
|
@ -384,11 +389,11 @@ struct BaseLoc
|
|||
{
|
||||
auto fname = filename.toDString;
|
||||
if (substitutions.length == 0)
|
||||
substitutions ~= BaseLoc(this.filename, 0, 0);
|
||||
substitutions ~= BaseLoc(this.filename, null, 0, 0);
|
||||
|
||||
if (fname.length == 0)
|
||||
fname = substitutions[$ - 1].filename;
|
||||
substitutions ~= BaseLoc(fname, offset, cast(int) (line - lines.length + startLine - 2));
|
||||
substitutions ~= BaseLoc(fname, null, offset, cast(int) (line - lines.length + startLine - 2));
|
||||
}
|
||||
|
||||
/// Returns: `loc` modified by substitutions from #file / #line directives
|
||||
|
@ -408,7 +413,7 @@ struct BaseLoc
|
|||
private SourceLoc getSourceLoc(uint offset) @nogc
|
||||
{
|
||||
const i = getLineIndex(offset);
|
||||
const sl = SourceLoc(filename, cast(int) (i + startLine), cast(int) (1 + offset - lines[i]), offset);
|
||||
const sl = SourceLoc(filename, cast(int) (i + startLine), cast(int) (1 + offset - lines[i]), offset, fileContents);
|
||||
return substitute(sl);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue