Skip to content
This repository has been archived by the owner on Mar 25, 2021. It is now read-only.

Sort failures by failure's line and character #3345

Merged
merged 4 commits into from Oct 20, 2017
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions src/formatters/codeFrameFormatter.ts
Expand Up @@ -50,6 +50,7 @@ export class Formatter extends AbstractFormatter {
if (typeof failures[0] === "undefined") {
return "\n";
}
failures = this.sortFailures(failures);

const outputLines: string[] = [];

Expand Down
1 change: 1 addition & 0 deletions src/formatters/proseFormatter.ts
Expand Up @@ -33,6 +33,7 @@ export class Formatter extends AbstractFormatter {
if (failures.length === 0 && (fixes === undefined || fixes.length === 0)) {
return "\n";
}
failures = this.sortFailures(failures);

const fixLines: string[] = [];
if (fixes !== undefined) {
Expand Down
1 change: 1 addition & 0 deletions src/formatters/stylishFormatter.ts
Expand Up @@ -39,6 +39,7 @@ export class Formatter extends AbstractFormatter {
/* tslint:enable:object-literal-sort-keys */

public format(failures: RuleFailure[]): string {
failures = this.sortFailures(failures)
const outputLines = this.mapToMessages(failures);

// Removes initial blank line
Expand Down
1 change: 1 addition & 0 deletions src/formatters/verboseFormatter.ts
Expand Up @@ -31,6 +31,7 @@ export class Formatter extends AbstractFormatter {
/* tslint:enable:object-literal-sort-keys */

public format(failures: RuleFailure[]): string {
failures = this.sortFailures(failures);
return `${this.mapToMessages(failures).join("\n")}\n`;
}

Expand Down
4 changes: 4 additions & 0 deletions src/language/formatter/abstractFormatter.ts
Expand Up @@ -21,4 +21,8 @@ import { IFormatter, IFormatterMetadata } from "./formatter";
export abstract class AbstractFormatter implements IFormatter {
public static metadata: IFormatterMetadata;
public abstract format(failures: RuleFailure[]): string;

protected sortFailures(failures: RuleFailure[]): RuleFailure[] {
return failures.slice().sort(RuleFailure.compare);
}
}
7 changes: 7 additions & 0 deletions src/language/rule/rule.ts
Expand Up @@ -258,6 +258,13 @@ export class RuleFailure {
this.ruleSeverity = "error";
}

public static compare(a: RuleFailure, b: RuleFailure): number {
if (a.fileName !== b.fileName) {
return a.fileName < b.fileName ? -1 : 1;
}
return a.startPosition.getPosition() - b.startPosition.getPosition();
}

public getFileName() {
return this.fileName;
}
Expand Down
12 changes: 6 additions & 6 deletions test/formatters/codeFrameFormatterTests.ts
Expand Up @@ -82,6 +82,12 @@ describe("CodeFrame Formatter", () => {
\u001b[90m 3 | \u001b[39m private name\u001b[33m:\u001b[39m string\u001b[33m;\u001b[39m
\u001b[90m 4 | \u001b[39m\u001b[0m

\u001b[31mfull failure\u001b[39m \u001b[90m(full-name)\u001b[39m
\u001b[0m\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 1 | \u001b[39mmodule \u001b[33mCodeFrameModule\u001b[39m {
\u001b[90m 2 | \u001b[39m \u001b[36mexport\u001b[39m \u001b[36mclass\u001b[39m \u001b[33mCodeFrameClass\u001b[39m {
\u001b[90m 3 | \u001b[39m private name\u001b[33m:\u001b[39m string\u001b[33m;\u001b[39m
\u001b[90m 4 | \u001b[39m\u001b[0m

\u001b[31m&<>'\" should be escaped\u001b[39m \u001b[90m(escape)\u001b[39m
\u001b[0m\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 1 | \u001b[39mmodule \u001b[33mCodeFrameModule\u001b[39m {
\u001b[90m | \u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m
Expand All @@ -96,12 +102,6 @@ describe("CodeFrame Formatter", () => {
\u001b[90m | \u001b[39m\u001b[31m\u001b[1m^\u001b[22m\u001b[39m
\u001b[90m 10 | \u001b[39m\u001b[0m

\u001b[31mfull failure\u001b[39m \u001b[90m(full-name)\u001b[39m
\u001b[0m\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 1 | \u001b[39mmodule \u001b[33mCodeFrameModule\u001b[39m {
\u001b[90m 2 | \u001b[39m \u001b[36mexport\u001b[39m \u001b[36mclass\u001b[39m \u001b[33mCodeFrameClass\u001b[39m {
\u001b[90m 3 | \u001b[39m private name\u001b[33m:\u001b[39m string\u001b[33m;\u001b[39m
\u001b[90m 4 | \u001b[39m\u001b[0m

`;

/** Convert output lines to an array of trimmed lines for easier comparing */
Expand Down
4 changes: 2 additions & 2 deletions test/formatters/stylishFormatterTests.ts
Expand Up @@ -49,9 +49,9 @@ describe("Stylish Formatter", () => {
const expectedResult = dedent`
formatters/stylishFormatter.test.ts
\u001b[31mERROR: 1:1\u001b[39m \u001b[90mfirst-name\u001b[39m \u001b[33mfirst failure\u001b[39m
\u001b[31mERROR: 1:1\u001b[39m \u001b[90mfull-name \u001b[39m \u001b[33mfull failure\u001b[39m
\u001b[31mERROR: 1:3\u001b[39m \u001b[90mescape \u001b[39m \u001b[33m&<>'\" should be escaped\u001b[39m
\u001b[31mERROR: ${maxPositionTuple}\u001b[39m \u001b[90mlast-name \u001b[39m \u001b[33mlast failure\u001b[39m
\u001b[31mERROR: 1:1\u001b[39m \u001b[90mfull-name \u001b[39m \u001b[33mfull failure\u001b[39m\n`
\u001b[31mERROR: ${maxPositionTuple}\u001b[39m \u001b[90mlast-name \u001b[39m \u001b[33mlast failure\u001b[39m\n`
.slice(1); // remove leading newline

assert.equal(formatter.format(failures), expectedResult);
Expand Down