feat(parser): TemplateParser.tryParse() returns both the AST and errors
The language service (#7482) always needs the AST even if there are errors in the template. Closes #7858
This commit is contained in:
parent
7a1a1b80ed
commit
226e662cf1
|
@ -83,6 +83,10 @@ export class TemplateParseError extends ParseError {
|
||||||
constructor(message: string, span: ParseSourceSpan) { super(span, message); }
|
constructor(message: string, span: ParseSourceSpan) { super(span, message); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class TemplateParseResult {
|
||||||
|
constructor(public templateAst?: TemplateAst[], public errors?: ParseError[]) {}
|
||||||
|
}
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class TemplateParser {
|
export class TemplateParser {
|
||||||
constructor(private _exprParser: Parser, private _schemaRegistry: ElementSchemaRegistry,
|
constructor(private _exprParser: Parser, private _schemaRegistry: ElementSchemaRegistry,
|
||||||
|
@ -91,20 +95,29 @@ export class TemplateParser {
|
||||||
|
|
||||||
parse(template: string, directives: CompileDirectiveMetadata[], pipes: CompilePipeMetadata[],
|
parse(template: string, directives: CompileDirectiveMetadata[], pipes: CompilePipeMetadata[],
|
||||||
templateUrl: string): TemplateAst[] {
|
templateUrl: string): TemplateAst[] {
|
||||||
|
var result = this.tryParse(template, directives, pipes, templateUrl);
|
||||||
|
if (isPresent(result.errors)) {
|
||||||
|
var errorString = result.errors.join('\n');
|
||||||
|
throw new BaseException(`Template parse errors:\n${errorString}`);
|
||||||
|
}
|
||||||
|
return result.templateAst;
|
||||||
|
}
|
||||||
|
|
||||||
|
tryParse(template: string, directives: CompileDirectiveMetadata[], pipes: CompilePipeMetadata[],
|
||||||
|
templateUrl: string): TemplateParseResult {
|
||||||
var parseVisitor =
|
var parseVisitor =
|
||||||
new TemplateParseVisitor(directives, pipes, this._exprParser, this._schemaRegistry);
|
new TemplateParseVisitor(directives, pipes, this._exprParser, this._schemaRegistry);
|
||||||
var htmlAstWithErrors = this._htmlParser.parse(template, templateUrl);
|
var htmlAstWithErrors = this._htmlParser.parse(template, templateUrl);
|
||||||
var result = htmlVisitAll(parseVisitor, htmlAstWithErrors.rootNodes, EMPTY_COMPONENT);
|
var result = htmlVisitAll(parseVisitor, htmlAstWithErrors.rootNodes, EMPTY_COMPONENT);
|
||||||
var errors: ParseError[] = htmlAstWithErrors.errors.concat(parseVisitor.errors);
|
var errors: ParseError[] = htmlAstWithErrors.errors.concat(parseVisitor.errors);
|
||||||
if (errors.length > 0) {
|
if (errors.length > 0) {
|
||||||
var errorString = errors.join('\n');
|
return new TemplateParseResult(result, errors);
|
||||||
throw new BaseException(`Template parse errors:\n${errorString}`);
|
|
||||||
}
|
}
|
||||||
if (isPresent(this.transforms)) {
|
if (isPresent(this.transforms)) {
|
||||||
this.transforms.forEach(
|
this.transforms.forEach(
|
||||||
(transform: TemplateAstVisitor) => { result = templateVisitAll(transform, result); });
|
(transform: TemplateAstVisitor) => { result = templateVisitAll(transform, result); });
|
||||||
}
|
}
|
||||||
return result;
|
return new TemplateParseResult(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue