diff --git a/packages/language-service/src/diagnostics.ts b/packages/language-service/src/diagnostics.ts index 9b38f7b2e4..6b8bed9616 100644 --- a/packages/language-service/src/diagnostics.ts +++ b/packages/language-service/src/diagnostics.ts @@ -228,25 +228,3 @@ export function ngDiagnosticToTsDiagnostic( source: 'ng', }; } - -/** - * Return elements filtered by unique span. - * @param elements - */ -export function uniqueBySpan(elements: T[]): T[] { - const result: T[] = []; - const map = new Map>(); - for (const element of elements) { - const {span} = element; - let set = map.get(span.start); - if (!set) { - set = new Set(); - map.set(span.start, set); - } - if (!set.has(span.end)) { - set.add(span.end); - result.push(element); - } - } - return result; -} diff --git a/packages/language-service/src/language_service.ts b/packages/language-service/src/language_service.ts index d07c25274d..c6d1faacfe 100644 --- a/packages/language-service/src/language_service.ts +++ b/packages/language-service/src/language_service.ts @@ -10,7 +10,7 @@ import * as tss from 'typescript/lib/tsserverlibrary'; import {getTemplateCompletions} from './completions'; import {getDefinitionAndBoundSpan, getTsDefinitionAndBoundSpan} from './definitions'; -import {getDeclarationDiagnostics, getTemplateDiagnostics, ngDiagnosticToTsDiagnostic, uniqueBySpan} from './diagnostics'; +import {getDeclarationDiagnostics, getTemplateDiagnostics, ngDiagnosticToTsDiagnostic} from './diagnostics'; import {getTemplateHover, getTsHover} from './hover'; import * as ng from './types'; import {TypeScriptServiceHost} from './typescript_host'; @@ -29,23 +29,22 @@ class LanguageServiceImpl implements ng.LanguageService { getSemanticDiagnostics(fileName: string): tss.Diagnostic[] { const analyzedModules = this.host.getAnalyzedModules(); // same role as 'synchronizeHostData' - const results: ng.Diagnostic[] = []; - const templates = this.host.getTemplates(fileName); + const ngDiagnostics: ng.Diagnostic[] = []; + const templates = this.host.getTemplates(fileName); for (const template of templates) { const ast = this.host.getTemplateAst(template); if (ast) { - results.push(...getTemplateDiagnostics(ast)); + ngDiagnostics.push(...getTemplateDiagnostics(ast)); } } const declarations = this.host.getDeclarations(fileName); - if (declarations && declarations.length) { - results.push(...getDeclarationDiagnostics(declarations, analyzedModules, this.host)); - } + ngDiagnostics.push(...getDeclarationDiagnostics(declarations, analyzedModules, this.host)); const sourceFile = fileName.endsWith('.ts') ? this.host.getSourceFile(fileName) : undefined; - return uniqueBySpan(results).map(d => ngDiagnosticToTsDiagnostic(d, sourceFile)); + const tsDiagnostics = ngDiagnostics.map(d => ngDiagnosticToTsDiagnostic(d, sourceFile)); + return [...tss.sortAndDeduplicateDiagnostics(tsDiagnostics)]; } getCompletionsAtPosition(