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:
Chuck Jazdzewski 2016-03-31 12:14:08 -07:00
parent 7a1a1b80ed
commit 226e662cf1
1 changed files with 16 additions and 3 deletions

View File

@ -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);
} }
} }