From 43241a560ae0c351a34c8dc1f9d1806b35395fb0 Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Wed, 16 Oct 2019 11:01:31 -0700 Subject: [PATCH] fix(language-service): Increase project/script version in MockHost.reset() (#33200) PR Close #33200 --- packages/language-service/test/hover_spec.ts | 31 ++++++++++++-------- packages/language-service/test/test_utils.ts | 20 ++++++++++--- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/packages/language-service/test/hover_spec.ts b/packages/language-service/test/hover_spec.ts index 56bc477e23..ec2f3a3960 100644 --- a/packages/language-service/test/hover_spec.ts +++ b/packages/language-service/test/hover_spec.ts @@ -14,17 +14,22 @@ import {TypeScriptServiceHost} from '../src/typescript_host'; import {MockTypescriptHost} from './test_utils'; -describe('hover', () => { - let mockHost: MockTypescriptHost; - let tsLS: ts.LanguageService; - let ngLSHost: TypeScriptServiceHost; - let ngLS: LanguageService; +fdescribe('hover', () => { + // const mockHost: MockTypescriptHost; + // const tsLS: ts.LanguageService; + // const ngLSHost: TypeScriptServiceHost; + // const ngLS: LanguageService; + const mockHost = new MockTypescriptHost(['/app/main.ts']); + const tsLS = ts.createLanguageService(mockHost); + const ngLSHost = new TypeScriptServiceHost(mockHost, tsLS); + const ngLS = createLanguageService(ngLSHost); beforeEach(() => { - mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts']); - tsLS = ts.createLanguageService(mockHost); - ngLSHost = new TypeScriptServiceHost(mockHost, tsLS); - ngLS = createLanguageService(ngLSHost); + // mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts']); + // tsLS = ts.createLanguageService(mockHost); + // ngLSHost = new TypeScriptServiceHost(mockHost, tsLS); + // ngLS = createLanguageService(ngLSHost); + mockHost.reset(); }); it('should be able to find field in an interpolation', () => { @@ -183,20 +188,20 @@ describe('hover', () => { }); it('should be able to find the NgModule of a directive', () => { - const fileName = '/app/parsing-cases.ts'; + const fileName = '/app/app.component.ts'; mockHost.override(fileName, ` import {Directive} from '@angular/core'; @Directive({ selector: '[string-model]', }) - export class «StringModel» {}`); - const marker = mockHost.getReferenceMarkerFor(fileName, 'StringModel'); + export class «AppComponent» {}`); + const marker = mockHost.getReferenceMarkerFor(fileName, 'AppComponent'); const quickInfo = ngLS.getHoverAt(fileName, marker.start); expect(quickInfo).toBeTruthy(); const {textSpan, displayParts} = quickInfo !; expect(textSpan).toEqual(marker); - expect(toText(displayParts)).toBe('(directive) AppModule.StringModel: class'); + expect(toText(displayParts)).toBe('(directive) AppModule.AppComponent: class'); }); }); diff --git a/packages/language-service/test/test_utils.ts b/packages/language-service/test/test_utils.ts index 30637b7bbc..554202af64 100644 --- a/packages/language-service/test/test_utils.ts +++ b/packages/language-service/test/test_utils.ts @@ -92,7 +92,7 @@ const COMPILER_OPTIONS: Readonly = { }; export class MockTypescriptHost implements ts.LanguageServiceHost { - private angularPath?: string; + private readonly angularPath: string; private readonly nodeModulesPath: string; private readonly scriptVersion = new Map(); private readonly overrides = new Map(); @@ -127,14 +127,16 @@ export class MockTypescriptHost implements ts.LanguageServiceHost { } addScript(fileName: string, content: string) { + if (this.scriptVersion.has(fileName)) { + throw new Error(`${fileName} is already in the root files.`); + } + this.scriptVersion.set(fileName, 0); this.projectVersion++; this.overrides.set(fileName, content); this.overrideDirectory.add(path.dirname(fileName)); this.scriptNames.push(fileName); } - forgetAngular() { this.angularPath = undefined; } - overrideOptions(options: Partial) { this.options = {...this.options, ...options}; this.projectVersion++; @@ -185,6 +187,16 @@ export class MockTypescriptHost implements ts.LanguageServiceHost { * Reset the project to its original state, effectively removing all overrides. */ reset() { + // project version and script version must be monotonically increasing, + // they must not be reset to zero. + this.projectVersion++; + for (const fileName of this.overrides.keys()) { + const version = this.scriptVersion.get(fileName); + if (version === undefined) { + throw new Error(`No prior version found for ${fileName}`); + } + this.scriptVersion.set(fileName, version + 1); + } // Remove overrides from scriptNames let length = 0; for (let i = 0; i < this.scriptNames.length; ++i) { @@ -251,7 +263,7 @@ export class MockTypescriptHost implements ts.LanguageServiceHost { return result; } } - if (this.angularPath && name.startsWith('/' + node_modules + at_angular)) { + if (name.startsWith('/' + node_modules + at_angular)) { return this.myPath.posix.join( this.angularPath, name.substr(node_modules.length + at_angular.length + 1)); }