Skip to content
Permalink
Browse files

fix(language-service): Remove getExternalFiles() (#34260)

This commit removes the `getExternalFiles()` from the tsserver plugin.
This API is no longer needed now that we do not intend to support
external templates under the plugin mode.
Instead, the external files are added to the project only when they are
opened by the user.
For complete discussion, see angular/vscode-ng-language-service#473

PR closes angular/vscode-ng-language-service#469
PR closes angular/vscode-ng-language-service#473

PR Close #34260
  • Loading branch information
kyliau authored and AndrewKushnir committed Dec 4, 2019
1 parent 9974500 commit 0e911f87b0b8b3d06decf59e60ba9ed70321559f
@@ -11,50 +11,8 @@ import * as tss from 'typescript/lib/tsserverlibrary';
import {createLanguageService} from './language_service';
import {TypeScriptServiceHost} from './typescript_host';

/**
* A note about importing TypeScript module.
* The TypeScript module is supplied by tsserver at runtime to ensure version
* compatibility. In Angular language service, the rollup output is augmented
* with a "banner" shim that overwrites 'typescript' and
* 'typescript/lib/tsserverlibrary' imports with the value supplied by tsserver.
* This means import of either modules will not be "required", but they'll work
* just like regular imports.
*/

const projectHostMap = new WeakMap<tss.server.Project, TypeScriptServiceHost>();

/**
* Return the external templates discovered through processing all NgModules in
* the specified `project`.
* This function is called in a few situations:
* 1. When a ConfiguredProject is created
* https://github.com/microsoft/TypeScript/blob/c26c44d5fceb04ea14da20b6ed23449df777ff34/src/server/editorServices.ts#L1755
* 2. When updateGraph() is called on a Project
* https://github.com/microsoft/TypeScript/blob/c26c44d5fceb04ea14da20b6ed23449df777ff34/src/server/project.ts#L915
* @param project Most likely a ConfiguredProject
*/
export function getExternalFiles(project: tss.server.Project): string[] {
if (!project.hasRoots()) {
// During project initialization where there is no root files yet we should
// not do any work.
return [];
}
const ngLSHost = projectHostMap.get(project);
if (!ngLSHost) {
// Without an Angular host there is no way to get template references.
return [];
}
const templates = ngLSHost.getTemplateReferences();
const logger = project.projectService.logger;
if (logger.hasLevel(tss.server.LogLevel.verbose)) {
// Log external files to help debugging.
logger.info(`External files in ${project.projectName}: ${JSON.stringify(templates)}`);
}
return templates;
}

export function create(info: tss.server.PluginCreateInfo): tss.LanguageService {
const {project, languageService: tsLS, languageServiceHost: tsLSHost, config} = info;
const {languageService: tsLS, languageServiceHost: tsLSHost, config} = info;
// This plugin could operate under two different modes:
// 1. TS + Angular
// Plugin augments TS language service to provide additional Angular
@@ -67,7 +25,6 @@ export function create(info: tss.server.PluginCreateInfo): tss.LanguageService {
const angularOnly = config ? config.angularOnly === true : false;
const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS);
const ngLS = createLanguageService(ngLSHost);
projectHostMap.set(project, ngLSHost);

function getCompletionsAtPosition(
fileName: string, position: number,
@@ -185,11 +185,6 @@ export interface LanguageServiceHost {
*/
getAnalyzedModules(): NgAnalyzedModules;

/**
* Return a list all the template files referenced by the project.
*/
getTemplateReferences(): string[];

/**
* Return the AST for both HTML and template for the contextFile.
*/
@@ -15,7 +15,7 @@ import {AstResult} from './common';
import {createLanguageService} from './language_service';
import {ReflectorHost} from './reflector_host';
import {ExternalTemplate, InlineTemplate, getClassDeclFromDecoratorProp, getPropertyAssignmentFromValue} from './template';
import {Declaration, DeclarationError, Diagnostic, DiagnosticMessageChain, LanguageService, LanguageServiceHost, Span, TemplateSource} from './types';
import {Declaration, DeclarationError, DiagnosticMessageChain, LanguageService, LanguageServiceHost, Span, TemplateSource} from './types';
import {findTightestNode, getDirectiveClassLike} from './utils';


@@ -65,7 +65,6 @@ export class TypeScriptServiceHost implements LanguageServiceHost {
private readonly fileVersions = new Map<string, string>();

private lastProgram: ts.Program|undefined = undefined;
private templateReferences: string[] = [];
private analyzedModules: NgAnalyzedModules = {
files: [],
ngModuleByPipeOrDirective: new Map(),
@@ -144,11 +143,6 @@ export class TypeScriptServiceHost implements LanguageServiceHost {
return this.resolver.getReflector() as StaticReflector;
}

getTemplateReferences(): string[] {
this.getAnalyzedModules();
return [...this.templateReferences];
}

/**
* Checks whether the program has changed and returns all analyzed modules.
* If program has changed, invalidate all caches and update fileToComponent
@@ -166,7 +160,6 @@ export class TypeScriptServiceHost implements LanguageServiceHost {
}

// Invalidate caches
this.templateReferences = [];
this.fileToComponent.clear();
this.collectedErrors.clear();
this.resolver.clearCache();
@@ -186,7 +179,6 @@ export class TypeScriptServiceHost implements LanguageServiceHost {
this.reflector.componentModuleUrl(directive.reference),
metadata.template.templateUrl);
this.fileToComponent.set(templateName, directive.reference);
this.templateReferences.push(templateName);
}
}
}
@@ -12,7 +12,6 @@ ts_library(
"html_info_spec.ts",
"language_service_spec.ts",
"reflector_host_spec.ts",
"template_references_spec.ts",
"template_spec.ts",
"test_utils.ts",
"ts_plugin_spec.ts",

This file was deleted.

@@ -8,7 +8,7 @@

import * as ts from 'typescript';

import {create, getExternalFiles} from '../src/ts_plugin';
import {create} from '../src/ts_plugin';
import {CompletionKind} from '../src/types';

import {MockTypescriptHost} from './test_utils';
@@ -65,11 +65,6 @@ describe('plugin', () => {
}
});

it('should return external templates as external files', () => {
const externalFiles = getExternalFiles(mockProject);
expect(externalFiles).toEqual(['/app/test.ng']);
});

it('should not report template errors on tour of heroes', () => {
const filesWithTemplates = [
// Ignore all '*-cases.ts' files as they intentionally contain errors.

0 comments on commit 0e911f8

Please sign in to comment.
You can’t perform that action at this time.