From f16d4d31e150da49bd74426df7b1f43f1d2a8611 Mon Sep 17 00:00:00 2001 From: eggggger Date: Thu, 19 Oct 2017 15:54:32 +0800 Subject: [PATCH] Sort failures by failure's line and character --- src/linter.ts | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/linter.ts b/src/linter.ts index e98143e8399..171e8683540 100644 --- a/src/linter.ts +++ b/src/linter.ts @@ -131,7 +131,9 @@ class Linter { throw new Error(`formatter '${formatterName}' not found`); } - const output = formatter.format(this.failures, this.fixes); + // Sort failures by failure's line and character. + const failures = this.sortFailures(this.failures); + const output = formatter.format(failures, this.fixes); const errorCount = this.failures.filter((failure) => failure.getRuleSeverity() === "error").length; return { @@ -144,6 +146,24 @@ class Linter { }; } + public sortFailures(failures: RuleFailure[]): RuleFailure[] { + let sortedFailures: RuleFailure[] = []; + + const fileFailuresMap = createMultiMap(failures, (failure) => [failure.getFileName(), failure]); + fileFailuresMap.forEach((fileFailures) => { + sortedFailures = sortedFailures.concat(fileFailures.sort((failureA, failureB) => { + const failureALineAndCharacter = failureA.getStartPosition().getLineAndCharacter(); + const failureBLineAndCharacter = failureB.getStartPosition().getLineAndCharacter(); + if (failureALineAndCharacter.line === failureBLineAndCharacter.line) { + return failureALineAndCharacter.character - failureBLineAndCharacter.character; + } + return failureALineAndCharacter.line - failureBLineAndCharacter.line; + })); + }); + + return sortedFailures; + } + private getAllFailures(sourceFile: ts.SourceFile, enabledRules: IRule[]): RuleFailure[] { const failures = flatMap(enabledRules, (rule) => this.applyRule(rule, sourceFile)); return removeDisabledFailures(sourceFile, failures);