Merge pull request #16595 from alexeagle/pretty

--pretty diagnostics: move context after the file/error
This commit is contained in:
Daniel Rosenwasser 2017-09-27 21:41:36 -07:00 committed by GitHub
commit 9b77dd6a98
2 changed files with 20 additions and 15 deletions

View file

@ -271,6 +271,7 @@ namespace ts {
export function formatDiagnosticsWithColorAndContext(diagnostics: ReadonlyArray<Diagnostic>, host: FormatDiagnosticsHost): string { export function formatDiagnosticsWithColorAndContext(diagnostics: ReadonlyArray<Diagnostic>, host: FormatDiagnosticsHost): string {
let output = ""; let output = "";
for (const diagnostic of diagnostics) { for (const diagnostic of diagnostics) {
let context = "";
if (diagnostic.file) { if (diagnostic.file) {
const { start, length, file } = diagnostic; const { start, length, file } = diagnostic;
const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start); const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start);
@ -284,12 +285,12 @@ namespace ts {
gutterWidth = Math.max(ellipsis.length, gutterWidth); gutterWidth = Math.max(ellipsis.length, gutterWidth);
} }
output += host.getNewLine(); context += host.getNewLine();
for (let i = firstLine; i <= lastLine; i++) { for (let i = firstLine; i <= lastLine; i++) {
// If the error spans over 5 lines, we'll only show the first 2 and last 2 lines, // If the error spans over 5 lines, we'll only show the first 2 and last 2 lines,
// so we'll skip ahead to the second-to-last line. // so we'll skip ahead to the second-to-last line.
if (hasMoreThanFiveLines && firstLine + 1 < i && i < lastLine - 1) { if (hasMoreThanFiveLines && firstLine + 1 < i && i < lastLine - 1) {
output += formatAndReset(padLeft(ellipsis, gutterWidth), gutterStyleSequence) + gutterSeparator + host.getNewLine(); context += formatAndReset(padLeft(ellipsis, gutterWidth), gutterStyleSequence) + gutterSeparator + host.getNewLine();
i = lastLine - 1; i = lastLine - 1;
} }
@ -300,30 +301,28 @@ namespace ts {
lineContent = lineContent.replace("\t", " "); // convert tabs to single spaces lineContent = lineContent.replace("\t", " "); // convert tabs to single spaces
// Output the gutter and the actual contents of the line. // Output the gutter and the actual contents of the line.
output += formatAndReset(padLeft(i + 1 + "", gutterWidth), gutterStyleSequence) + gutterSeparator; context += formatAndReset(padLeft(i + 1 + "", gutterWidth), gutterStyleSequence) + gutterSeparator;
output += lineContent + host.getNewLine(); context += lineContent + host.getNewLine();
// Output the gutter and the error span for the line using tildes. // Output the gutter and the error span for the line using tildes.
output += formatAndReset(padLeft("", gutterWidth), gutterStyleSequence) + gutterSeparator; context += formatAndReset(padLeft("", gutterWidth), gutterStyleSequence) + gutterSeparator;
output += redForegroundEscapeSequence; context += redForegroundEscapeSequence;
if (i === firstLine) { if (i === firstLine) {
// If we're on the last line, then limit it to the last character of the last line. // If we're on the last line, then limit it to the last character of the last line.
// Otherwise, we'll just squiggle the rest of the line, giving 'slice' no end position. // Otherwise, we'll just squiggle the rest of the line, giving 'slice' no end position.
const lastCharForLine = i === lastLine ? lastLineChar : undefined; const lastCharForLine = i === lastLine ? lastLineChar : undefined;
output += lineContent.slice(0, firstLineChar).replace(/\S/g, " "); context += lineContent.slice(0, firstLineChar).replace(/\S/g, " ");
output += lineContent.slice(firstLineChar, lastCharForLine).replace(/./g, "~"); context += lineContent.slice(firstLineChar, lastCharForLine).replace(/./g, "~");
} }
else if (i === lastLine) { else if (i === lastLine) {
output += lineContent.slice(0, lastLineChar).replace(/./g, "~"); context += lineContent.slice(0, lastLineChar).replace(/./g, "~");
} }
else { else {
// Squiggle the entire line. // Squiggle the entire line.
output += lineContent.replace(/./g, "~"); context += lineContent.replace(/./g, "~");
} }
output += resetEscapeSequence; context += resetEscapeSequence;
output += host.getNewLine();
} }
output += host.getNewLine(); output += host.getNewLine();
@ -333,6 +332,12 @@ namespace ts {
const categoryColor = getCategoryFormat(diagnostic.category); const categoryColor = getCategoryFormat(diagnostic.category);
const category = DiagnosticCategory[diagnostic.category].toLowerCase(); const category = DiagnosticCategory[diagnostic.category].toLowerCase();
output += `${ formatAndReset(category, categoryColor) } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()) }`; output += `${ formatAndReset(category, categoryColor) } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()) }`;
if (diagnostic.file) {
output += host.getNewLine();
output += context;
}
output += host.getNewLine(); output += host.getNewLine();
} }
return output; return output;

View file

@ -1,9 +1,9 @@
tests/cases/compiler/index.ts(2,1): error TS1005: '}' expected.
2 2
     
tests/cases/compiler/index.ts(2,1): error TS1005: '}' expected.
==== tests/cases/compiler/index.ts (1 errors) ==== ==== tests/cases/compiler/index.ts (1 errors) ====
if (true) { if (true) {