2016-07-21 16:56:58 -04:00
|
|
|
/**
|
|
|
|
* @license
|
|
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
|
|
* found in the LICENSE file at https://angular.io/license
|
|
|
|
*/
|
|
|
|
|
|
|
|
import {ParseSourceSpan} from '../parse_util';
|
|
|
|
|
|
|
|
export interface Node {
|
2017-03-24 12:59:58 -04:00
|
|
|
sourceSpan: ParseSourceSpan|null;
|
2016-07-21 16:56:58 -04:00
|
|
|
visit(visitor: Visitor, context: any): any;
|
|
|
|
}
|
|
|
|
|
|
|
|
export class Text implements Node {
|
2017-03-24 12:59:58 -04:00
|
|
|
constructor(public value: string, public sourceSpan: ParseSourceSpan|null) {}
|
2016-07-21 16:56:58 -04:00
|
|
|
visit(visitor: Visitor, context: any): any { return visitor.visitText(this, context); }
|
|
|
|
}
|
|
|
|
|
|
|
|
export class Expansion implements Node {
|
|
|
|
constructor(
|
|
|
|
public switchValue: string, public type: string, public cases: ExpansionCase[],
|
|
|
|
public sourceSpan: ParseSourceSpan, public switchValueSourceSpan: ParseSourceSpan) {}
|
|
|
|
visit(visitor: Visitor, context: any): any { return visitor.visitExpansion(this, context); }
|
|
|
|
}
|
|
|
|
|
|
|
|
export class ExpansionCase implements Node {
|
|
|
|
constructor(
|
|
|
|
public value: string, public expression: Node[], public sourceSpan: ParseSourceSpan,
|
|
|
|
public valueSourceSpan: ParseSourceSpan, public expSourceSpan: ParseSourceSpan) {}
|
|
|
|
|
|
|
|
visit(visitor: Visitor, context: any): any { return visitor.visitExpansionCase(this, context); }
|
|
|
|
}
|
|
|
|
|
|
|
|
export class Attribute implements Node {
|
2016-10-07 16:53:29 -04:00
|
|
|
constructor(
|
|
|
|
public name: string, public value: string, public sourceSpan: ParseSourceSpan,
|
|
|
|
public valueSpan?: ParseSourceSpan) {}
|
2016-07-21 16:56:58 -04:00
|
|
|
visit(visitor: Visitor, context: any): any { return visitor.visitAttribute(this, context); }
|
|
|
|
}
|
|
|
|
|
|
|
|
export class Element implements Node {
|
|
|
|
constructor(
|
|
|
|
public name: string, public attrs: Attribute[], public children: Node[],
|
2017-03-24 12:59:58 -04:00
|
|
|
public sourceSpan: ParseSourceSpan|null = null,
|
|
|
|
public startSourceSpan: ParseSourceSpan|null = null,
|
|
|
|
public endSourceSpan: ParseSourceSpan|null = null) {}
|
2016-07-21 16:56:58 -04:00
|
|
|
visit(visitor: Visitor, context: any): any { return visitor.visitElement(this, context); }
|
|
|
|
}
|
|
|
|
|
|
|
|
export class Comment implements Node {
|
2017-03-24 12:59:58 -04:00
|
|
|
constructor(public value: string|null, public sourceSpan: ParseSourceSpan) {}
|
2016-07-21 16:56:58 -04:00
|
|
|
visit(visitor: Visitor, context: any): any { return visitor.visitComment(this, context); }
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface Visitor {
|
2016-10-10 12:13:50 -04:00
|
|
|
// Returning a truthy value from `visit()` will prevent `visitAll()` from the call to the typed
|
|
|
|
// method and result returned will become the result included in `visitAll()`s result array.
|
|
|
|
visit?(node: Node, context: any): any;
|
|
|
|
|
2016-07-21 16:56:58 -04:00
|
|
|
visitElement(element: Element, context: any): any;
|
|
|
|
visitAttribute(attribute: Attribute, context: any): any;
|
|
|
|
visitText(text: Text, context: any): any;
|
|
|
|
visitComment(comment: Comment, context: any): any;
|
|
|
|
visitExpansion(expansion: Expansion, context: any): any;
|
|
|
|
visitExpansionCase(expansionCase: ExpansionCase, context: any): any;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function visitAll(visitor: Visitor, nodes: Node[], context: any = null): any[] {
|
2016-11-12 08:08:58 -05:00
|
|
|
const result: any[] = [];
|
2016-10-10 12:13:50 -04:00
|
|
|
|
2016-11-12 08:08:58 -05:00
|
|
|
const visit = visitor.visit ?
|
2017-03-24 12:59:58 -04:00
|
|
|
(ast: Node) => visitor.visit !(ast, context) || ast.visit(visitor, context) :
|
2016-10-10 12:13:50 -04:00
|
|
|
(ast: Node) => ast.visit(visitor, context);
|
2016-07-21 16:56:58 -04:00
|
|
|
nodes.forEach(ast => {
|
2016-10-10 12:13:50 -04:00
|
|
|
const astResult = visit(ast);
|
2016-07-21 16:56:58 -04:00
|
|
|
if (astResult) {
|
|
|
|
result.push(astResult);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return result;
|
|
|
|
}
|