From 49fb8143e809628c5fd4da2f898b0ffebac1430d Mon Sep 17 00:00:00 2001 From: Chuck Jazdzewski Date: Thu, 26 Jan 2017 12:42:48 -0800 Subject: [PATCH] fix(language-service): do not crash when Angular cannot be located (#14123) Fixes #14122 PR Close #14123 --- .../src/aot/static_symbol_resolver.ts | 7 +++- .../test/language_service_spec.ts | 36 +++++++++++++++++++ .../language-service/test/test_utils.ts | 2 ++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 modules/@angular/language-service/test/language_service_spec.ts diff --git a/modules/@angular/compiler/src/aot/static_symbol_resolver.ts b/modules/@angular/compiler/src/aot/static_symbol_resolver.ts index cad563e52a..7d5e447d80 100644 --- a/modules/@angular/compiler/src/aot/static_symbol_resolver.ts +++ b/modules/@angular/compiler/src/aot/static_symbol_resolver.ts @@ -321,7 +321,12 @@ export class StaticSymbolResolver { getSymbolByModule(module: string, symbolName: string, containingFile?: string): StaticSymbol { const filePath = this.resolveModule(module, containingFile); if (!filePath) { - throw new Error(`Could not resolve module ${module} relative to ${containingFile}`); + this.reportError( + new Error(`Could not resolve module ${module}${containingFile ? ` relative to $ { + containingFile + } `: ''}`), + null); + return this.getStaticSymbol(`ERROR:${module}`, symbolName); } return this.getStaticSymbol(filePath, symbolName); } diff --git a/modules/@angular/language-service/test/language_service_spec.ts b/modules/@angular/language-service/test/language_service_spec.ts new file mode 100644 index 0000000000..aba0d16b99 --- /dev/null +++ b/modules/@angular/language-service/test/language_service_spec.ts @@ -0,0 +1,36 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {createLanguageService} from '../src/language_service'; +import {Completions, LanguageService} from '../src/types'; +import {TypeScriptServiceHost} from '../src/typescript_host'; + +import {toh} from './test_data'; +import {MockTypescriptHost} from './test_utils'; + +describe('service without angular', () => { + let mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts'], toh); + mockHost.forgetAngular(); + let service = ts.createLanguageService(mockHost); + let ngHost = new TypeScriptServiceHost(mockHost, service); + let ngService = createLanguageService(ngHost); + const fileName = '/app/test.ng'; + let position = mockHost.getMarkerLocations(fileName)['h1-content']; + + it('should not crash a get template references', + () => expect(() => ngService.getTemplateReferences())); + it('should not crash a get dianostics', + () => expect(() => ngService.getDiagnostics(fileName)).not.toThrow()); + it('should not crash a completion', + () => expect(() => ngService.getCompletionsAt(fileName, position)).not.toThrow()); + it('should not crash a get defintion', + () => expect(() => ngService.getDefinitionAt(fileName, position)).not.toThrow()); + it('should not crash a hover', () => expect(() => ngService.getHoverAt(fileName, position))); +}); \ No newline at end of file diff --git a/modules/@angular/language-service/test/test_utils.ts b/modules/@angular/language-service/test/test_utils.ts index df4b658f7d..f1af3c9db6 100644 --- a/modules/@angular/language-service/test/test_utils.ts +++ b/modules/@angular/language-service/test/test_utils.ts @@ -98,6 +98,8 @@ export class MockTypescriptHost implements ts.LanguageServiceHost { this.scriptNames.push(fileName); } + forgetAngular() { this.angularPath = undefined; } + getCompilationSettings(): ts.CompilerOptions { return { target: ts.ScriptTarget.ES5,