Skip to content

Commit 2975d89

Browse files
chuckjazalxhub
authored andcommitted
fix(language-service): harden against partial normalization of directives
1 parent 43c0e9a commit 2975d89

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

modules/@angular/language-service/src/typescript_host.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import {NgAnalyzedModules, analyzeNgModules, extractProgramSymbols} from '@angul
1111
import {DirectiveNormalizer} from '@angular/compiler/src/directive_normalizer';
1212
import {DirectiveResolver} from '@angular/compiler/src/directive_resolver';
1313
import {CompileMetadataResolver} from '@angular/compiler/src/metadata_resolver';
14+
import {HtmlParser} from '@angular/compiler/src/ml_parser/html_parser';
15+
import {DEFAULT_INTERPOLATION_CONFIG, InterpolationConfig} from '@angular/compiler/src/ml_parser/interpolation_config';
16+
import {ParseTreeResult, Parser} from '@angular/compiler/src/ml_parser/parser';
1417
import {NgModuleResolver} from '@angular/compiler/src/ng_module_resolver';
1518
import {PipeResolver} from '@angular/compiler/src/pipe_resolver';
1619
import {ResourceLoader} from '@angular/compiler/src/resource_loader';
@@ -39,6 +42,29 @@ export function createLanguageServiceFromTypescript(
3942
return ngServer;
4043
}
4144

45+
/**
46+
* The language service never needs the normalized versions of the metadata. To avoid parsing
47+
* the content and resolving references, return an empty file. This also allows normalizing
48+
* template that are syntatically incorrect which is required to provide completions in
49+
* syntatically incorrect templates.
50+
*/
51+
export class DummyHtmlParser extends HtmlParser {
52+
constructor() { super(); }
53+
54+
parse(
55+
source: string, url: string, parseExpansionForms: boolean = false,
56+
interpolationConfig: InterpolationConfig = DEFAULT_INTERPOLATION_CONFIG): ParseTreeResult {
57+
return new ParseTreeResult([], []);
58+
}
59+
}
60+
61+
/**
62+
* Avoid loading resources in the language servcie by using a dummy loader.
63+
*/
64+
export class DummyResourceLoader extends ResourceLoader {
65+
get(url: string): Promise<string> { return Promise.resolve(''); }
66+
}
67+
4268
/**
4369
* An implemntation of a `LanguageSerivceHost` for a TypeScript project.
4470
*
@@ -82,8 +108,9 @@ export class TypeScriptServiceHost implements LanguageServiceHost {
82108
const directiveResolver = new DirectiveResolver(this.reflector);
83109
const pipeResolver = new PipeResolver(this.reflector);
84110
const elementSchemaRegistry = new DomElementSchemaRegistry();
85-
const resourceLoader = new ResourceLoader();
111+
const resourceLoader = new DummyResourceLoader();
86112
const urlResolver = createOfflineCompileUrlResolver();
113+
const htmlParser = new DummyHtmlParser();
87114
// This tracks the CompileConfig in codegen.ts. Currently these options
88115
// are hard-coded except for genDebugInfo which is not applicable as we
89116
// never generate code.
@@ -94,7 +121,7 @@ export class TypeScriptServiceHost implements LanguageServiceHost {
94121
useJit: false
95122
});
96123
const directiveNormalizer =
97-
new DirectiveNormalizer(resourceLoader, urlResolver, null, config);
124+
new DirectiveNormalizer(resourceLoader, urlResolver, htmlParser, config);
98125

99126
result = this._resolver = new CompileMetadataResolver(
100127
moduleResolver, directiveResolver, pipeResolver, elementSchemaRegistry,

0 commit comments

Comments
 (0)