visitor-as
Advanced tools
| import { Expression, Statement } from "../as"; | ||
| export declare class SimpleParser { | ||
| private static parser; | ||
| private static getTokenizer; | ||
| static parseExpression(s: string): Expression; | ||
| static parseStatement(s: string, topLevel?: boolean): Statement; | ||
| } |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const as_1 = require("../as"); | ||
| class SimpleParser { | ||
| static getTokenizer(s) { | ||
| return new as_1.Tokenizer(new as_1.Source(as_1.SourceKind.USER, "index.ts", s)); | ||
| } | ||
| static parseExpression(s) { | ||
| let res = this.parser.parseExpression(this.getTokenizer(s)); | ||
| if (res == null) { | ||
| throw new Error("Failed to parse the expression: '" + s + "'"); | ||
| } | ||
| return res; | ||
| } | ||
| static parseStatement(s, topLevel = false) { | ||
| let res = this.parser.parseStatement(this.getTokenizer(s), topLevel); | ||
| if (res == null) { | ||
| throw new Error("Failed to parse the statement: '" + s + "'"); | ||
| } | ||
| return res; | ||
| } | ||
| } | ||
| exports.SimpleParser = SimpleParser; | ||
| SimpleParser.parser = new as_1.Parser(); | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NpbXBsZVBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDhCQU9lO0FBRWYsTUFBYSxZQUFZO0lBR2YsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFTO1FBQ25DLE9BQU8sSUFBSSxjQUFTLENBQUMsSUFBSSxXQUFNLENBQUMsZUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFTO1FBQzlCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUNoRTtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBUyxFQUFFLFdBQW9CLEtBQUs7UUFDeEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUMvRDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7QUFyQkgsb0NBc0JDO0FBckJnQixtQkFBTSxHQUFHLElBQUksV0FBTSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQYXJzZXIsXG4gIFRva2VuaXplcixcbiAgU291cmNlLFxuICBTb3VyY2VLaW5kLFxuICBFeHByZXNzaW9uLFxuICBTdGF0ZW1lbnQsXG59IGZyb20gXCIuLi9hc1wiO1xuXG5leHBvcnQgY2xhc3MgU2ltcGxlUGFyc2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VyID0gbmV3IFBhcnNlcigpO1xuXG4gIHByaXZhdGUgc3RhdGljIGdldFRva2VuaXplcihzOiBzdHJpbmcpOiBUb2tlbml6ZXIge1xuICAgIHJldHVybiBuZXcgVG9rZW5pemVyKG5ldyBTb3VyY2UoU291cmNlS2luZC5VU0VSLCBcImluZGV4LnRzXCIsIHMpKTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUV4cHJlc3Npb24oczogc3RyaW5nKTogRXhwcmVzc2lvbiB7XG4gICAgbGV0IHJlcyA9IHRoaXMucGFyc2VyLnBhcnNlRXhwcmVzc2lvbih0aGlzLmdldFRva2VuaXplcihzKSk7XG4gICAgaWYgKHJlcyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgdGhlIGV4cHJlc3Npb246ICdcIiArIHMgKyBcIidcIik7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBzdGF0aWMgcGFyc2VTdGF0ZW1lbnQoczogc3RyaW5nLCB0b3BMZXZlbDogYm9vbGVhbiA9IGZhbHNlKTogU3RhdGVtZW50IHtcbiAgICBsZXQgcmVzID0gdGhpcy5wYXJzZXIucGFyc2VTdGF0ZW1lbnQodGhpcy5nZXRUb2tlbml6ZXIocyksIHRvcExldmVsKTtcbiAgICBpZiAocmVzID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBwYXJzZSB0aGUgc3RhdGVtZW50OiAnXCIgKyBzICsgXCInXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG4iXX0= |
| /// <reference types="assemblyscript/std/portable" /> | ||
| import { TypeNode, Node, Source, NamedTypeNode, FunctionTypeNode, TypeParameterNode, IdentifierExpression, CallExpression, ClassExpression, ElementAccessExpression, FunctionExpression, InstanceOfExpression, LiteralExpression, NewExpression, ParenthesizedExpression, PropertyAccessExpression, TernaryExpression, UnaryPostfixExpression, UnaryPrefixExpression, BlockStatement, BreakStatement, ContinueStatement, DoStatement, EmptyStatement, ExportStatement, ExportDefaultStatement, ExportImportStatement, ExpressionStatement, ForStatement, IfStatement, ImportStatement, ReturnStatement, SwitchStatement, ThrowStatement, TryStatement, VariableStatement, WhileStatement, ClassDeclaration, EnumDeclaration, EnumValueDeclaration, FieldDeclaration, FunctionDeclaration, ImportDeclaration, IndexSignatureDeclaration, InterfaceDeclaration, MethodDeclaration, NamespaceDeclaration, TypeDeclaration, VariableDeclaration, DecoratorNode, ExportMember, ParameterNode, SwitchCase, TypeName, ArrayLiteralExpression, ObjectLiteralExpression, FloatLiteralExpression, StringLiteralExpression, RegexpLiteralExpression, UnaryExpression, Statement, DeclarationStatement, AssertionExpression, BinaryExpression, CommaExpression, IntegerLiteralExpression } from "../as"; | ||
| import { TypeNode, Node, Source, NamedTypeNode, FunctionTypeNode, TypeParameterNode, IdentifierExpression, CallExpression, ClassExpression, ElementAccessExpression, FunctionExpression, InstanceOfExpression, LiteralExpression, NewExpression, ParenthesizedExpression, PropertyAccessExpression, TernaryExpression, UnaryPostfixExpression, UnaryPrefixExpression, BlockStatement, BreakStatement, ContinueStatement, DoStatement, EmptyStatement, ExportStatement, ExportDefaultStatement, ExportImportStatement, ExpressionStatement, ForStatement, IfStatement, ImportStatement, ReturnStatement, SwitchStatement, ThrowStatement, TryStatement, VariableStatement, WhileStatement, ClassDeclaration, EnumDeclaration, EnumValueDeclaration, FieldDeclaration, FunctionDeclaration, ImportDeclaration, InterfaceDeclaration, MethodDeclaration, NamespaceDeclaration, TypeDeclaration, VariableDeclaration, DecoratorNode, ExportMember, ParameterNode, SwitchCase, TypeName, ArrayLiteralExpression, ObjectLiteralExpression, FloatLiteralExpression, StringLiteralExpression, RegexpLiteralExpression, UnaryExpression, DeclarationStatement, AssertionExpression, BinaryExpression, CommaExpression, IntegerLiteralExpression, ForOfStatement, IndexSignatureNode } from "../as"; | ||
| import { AbstractVisitor } from "./visitor"; | ||
| /** An AST builder. */ | ||
| export declare class ASTBuilder extends AbstractVisitor<Node> { | ||
| _visit(node: Node): void; | ||
| /** Rebuilds the textual source from the specified AST, as far as possible. */ | ||
@@ -10,3 +11,2 @@ static build(node: Node): string; | ||
| private indentLevel; | ||
| _visit(node: Node): void; | ||
| visitNode(node: Node): void; | ||
@@ -44,3 +44,3 @@ visitSource(source: Source): void; | ||
| visitUnaryPrefixExpression(node: UnaryPrefixExpression): void; | ||
| visitNodeAndTerminate(statement: Statement): void; | ||
| visitNodeAndTerminate(node: Node): void; | ||
| visitBlockStatement(node: BlockStatement): void; | ||
@@ -61,2 +61,3 @@ visitBreakStatement(node: BreakStatement): void; | ||
| visitForStatement(node: ForStatement): void; | ||
| visitForOfStatement(node: ForOfStatement): void; | ||
| visitFunctionDeclaration(node: FunctionDeclaration, isDefault?: bool): void; | ||
@@ -67,3 +68,3 @@ visitFunctionCommon(node: FunctionDeclaration): void; | ||
| visitImportStatement(node: ImportStatement): void; | ||
| visitIndexSignatureDeclaration(node: IndexSignatureDeclaration): void; | ||
| visitIndexSignature(node: IndexSignatureNode): void; | ||
| visitInterfaceDeclaration(node: InterfaceDeclaration, isDefault?: bool): void; | ||
@@ -70,0 +71,0 @@ visitMethodDeclaration(node: MethodDeclaration): void; |
+3
-2
@@ -1,2 +0,2 @@ | ||
| import { Node, Source, NamedTypeNode, FunctionTypeNode, TypeName, TypeParameterNode, IdentifierExpression, AssertionExpression, BinaryExpression, CallExpression, ClassExpression, CommaExpression, ElementAccessExpression, FunctionExpression, InstanceOfExpression, LiteralExpression, NewExpression, ParenthesizedExpression, PropertyAccessExpression, TernaryExpression, UnaryPostfixExpression, UnaryPrefixExpression, BlockStatement, BreakStatement, ContinueStatement, DoStatement, EmptyStatement, ExportStatement, ExportDefaultStatement, ExportImportStatement, ExpressionStatement, ForStatement, IfStatement, ImportStatement, ReturnStatement, SwitchStatement, ThrowStatement, TryStatement, VariableStatement, WhileStatement, ClassDeclaration, EnumDeclaration, EnumValueDeclaration, FieldDeclaration, FunctionDeclaration, ImportDeclaration, IndexSignatureDeclaration, InterfaceDeclaration, MethodDeclaration, NamespaceDeclaration, TypeDeclaration, VariableDeclaration, DecoratorNode, ExportMember, ParameterNode, SwitchCase, TypeNode, ArrayLiteralExpression, ObjectLiteralExpression, FloatLiteralExpression, IntegerLiteralExpression, StringLiteralExpression, RegexpLiteralExpression, UnaryExpression, SuperExpression, FalseExpression, TrueExpression, ThisExpression, NullExpression, ConstructorExpression, Statement, VoidStatement, CommentNode } from "../as"; | ||
| import { Node, Source, NamedTypeNode, FunctionTypeNode, TypeName, TypeParameterNode, IdentifierExpression, AssertionExpression, BinaryExpression, CallExpression, ClassExpression, CommaExpression, ElementAccessExpression, FunctionExpression, InstanceOfExpression, LiteralExpression, NewExpression, ParenthesizedExpression, PropertyAccessExpression, TernaryExpression, UnaryPostfixExpression, UnaryPrefixExpression, BlockStatement, BreakStatement, ContinueStatement, DoStatement, EmptyStatement, ExportStatement, ExportDefaultStatement, ExportImportStatement, ExpressionStatement, ForStatement, IfStatement, ImportStatement, ReturnStatement, SwitchStatement, ThrowStatement, TryStatement, VariableStatement, WhileStatement, ClassDeclaration, EnumDeclaration, EnumValueDeclaration, FieldDeclaration, FunctionDeclaration, ImportDeclaration, InterfaceDeclaration, MethodDeclaration, NamespaceDeclaration, TypeDeclaration, VariableDeclaration, DecoratorNode, IndexSignatureNode, ParameterNode, ExportMember, SwitchCase, TypeNode, ArrayLiteralExpression, Expression, ObjectLiteralExpression, FloatLiteralExpression, IntegerLiteralExpression, StringLiteralExpression, RegexpLiteralExpression, UnaryExpression, SuperExpression, FalseExpression, TrueExpression, ThisExpression, NullExpression, ConstructorExpression, Statement, VoidStatement, CommentNode } from "../as"; | ||
| import { AbstractVisitor } from "./visitor"; | ||
@@ -18,2 +18,3 @@ export declare class BaseVisitor extends AbstractVisitor<Node> { | ||
| visitCallExpression(node: CallExpression): void; | ||
| visitArguments(typeArguments: TypeNode[] | null, args: Expression[]): void; | ||
| visitClassExpression(node: ClassExpression): void; | ||
@@ -64,3 +65,3 @@ visitCommaExpression(node: CommaExpression): void; | ||
| visitImportStatement(node: ImportStatement): void; | ||
| visitIndexSignatureDeclaration(node: IndexSignatureDeclaration): void; | ||
| visitIndexSignature(node: IndexSignatureNode): void; | ||
| visitInterfaceDeclaration(node: InterfaceDeclaration, isDefault?: boolean): void; | ||
@@ -67,0 +68,0 @@ visitMethodDeclaration(node: MethodDeclaration): void; |
@@ -18,3 +18,3 @@ /// <reference types="assemblyscript/std/portable" /> | ||
| /** | ||
| * Default filter that | ||
| * Default filter that removes library files | ||
| */ | ||
@@ -21,0 +21,0 @@ get sourceFilter(): (s: Source) => bool; |
@@ -31,3 +31,3 @@ "use strict"; | ||
| /** | ||
| * Default filter that | ||
| * Default filter that removes library files | ||
| */ | ||
@@ -48,2 +48,2 @@ get sourceFilter() { | ||
| exports.VariableDecorator = VariableDecorator; | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUF1RTtBQWN2RSxtQ0FBb0Q7QUFFcEQsU0FBZ0IsaUJBQWlCLENBQUMsU0FBMkI7SUFDM0QsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLE9BQU8saUJBQWlCLENBQUM7QUFDM0IsQ0FBQztBQUhELDhDQUdDO0FBT0QsTUFBYSxpQkFBa0IsU0FBUSxrQ0FBb0I7SUFHekQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUF5QjtRQUM5QyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFZLE9BQU87UUFDakIsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7SUFDcEMsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQW1CO1FBQ3BDLElBQUksaUJBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxDQUFTO1FBQ2xCLDhCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQXRCRCw4Q0FzQkM7QUFFRCxNQUFzQixTQUFVLFNBQVEsa0NBQW9CO0lBQzFEOztPQUVHO0lBQ0gsSUFBSSxZQUFZO1FBQ2QsT0FBTyxXQUFHLENBQUMsaUJBQVMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FHRjtBQVRELDhCQVNDO0FBRUQsTUFBc0IsY0FBZSxTQUFRLFNBQVM7Q0FJckQ7QUFKRCx3Q0FJQztBQUVELE1BQXNCLGlCQUFrQixTQUFRLFNBQVM7Q0FFeEQ7QUFGRCw4Q0FFQztBQUVELE1BQXNCLGlCQUFrQixTQUFRLFNBQVM7Q0FFeEQ7QUFGRCw4Q0FFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhdGhUcmFuc2Zvcm1WaXNpdG9yLCBtZXJnZVRyYW5zZm9ybWVyIH0gZnJvbSBcIi4vdHJhbnNmb3JtZXJcIjtcbmltcG9ydCB7XG4gIENsYXNzRGVjbGFyYXRpb24sXG4gIEZpZWxkRGVjbGFyYXRpb24sXG4gIE1ldGhvZERlY2xhcmF0aW9uLFxuICBQYXJzZXIsXG4gIERlY2xhcmF0aW9uU3RhdGVtZW50LFxuICBWYXJpYWJsZURlY2xhcmF0aW9uLFxuICBGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICBTb3VyY2UsXG4gIFRyYW5zZm9ybSxcbiAgTm9kZSxcbiAgRGVjb3JhdG9yTm9kZSxcbn0gZnJvbSBcIi4uL2FzXCI7XG5pbXBvcnQgeyBkZWNvcmF0ZXMsIG5vdCwgaXNMaWJyYXJ5IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKGRlY29yYXRvcjogRGVjb3JhdG9yVmlzaXRvcikge1xuICBUb3BMZXZlbERlY29yYXRvci5yZWdpc3RlclZpc2l0b3IoZGVjb3JhdG9yKTtcbiAgcmV0dXJuIFRvcExldmVsRGVjb3JhdG9yO1xufVxuXG5pbnRlcmZhY2UgRGVjb3JhdG9yVmlzaXRvciBleHRlbmRzIFBhdGhUcmFuc2Zvcm1WaXNpdG9yIHtcbiAgbmFtZTogc3RyaW5nO1xuICBzb3VyY2VGaWx0ZXI6IChzOiBTb3VyY2UpID0+IGJvb2w7XG59XG5cbmV4cG9ydCBjbGFzcyBUb3BMZXZlbERlY29yYXRvciBleHRlbmRzIFBhdGhUcmFuc2Zvcm1WaXNpdG9yIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX3Zpc2l0b3I6IERlY29yYXRvclZpc2l0b3I7XG5cbiAgc3RhdGljIHJlZ2lzdGVyVmlzaXRvcih2aXNpdG9yOiBEZWNvcmF0b3JWaXNpdG9yKTogdm9pZCB7XG4gICAgVG9wTGV2ZWxEZWNvcmF0b3IuX3Zpc2l0b3IgPSB2aXNpdG9yO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdmlzaXRvcigpOiBEZWNvcmF0b3JWaXNpdG9yIHtcbiAgICByZXR1cm4gVG9wTGV2ZWxEZWNvcmF0b3IuX3Zpc2l0b3I7XG4gIH1cblxuICB2aXNpdERlY29yYXRvck5vZGUobm9kZTogRGVjb3JhdG9yTm9kZSkge1xuICAgIGlmIChkZWNvcmF0ZXMobm9kZSwgdGhpcy52aXNpdG9yLm5hbWUpKSB7XG4gICAgICB0aGlzLnZpc2l0b3IuY3VycmVudFBhdGggPSB0aGlzLmN1ZXJyZW50UGFyZW50UGF0aDtcbiAgICAgIHRoaXMudmlzaXRvci52aXNpdCh0aGlzLmN1cnJlbnRQYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGFmdGVyUGFyc2UoXzogUGFyc2VyKTogdm9pZCB7XG4gICAgbWVyZ2VUcmFuc2Zvcm1lcih0aGlzLCB0aGlzLnZpc2l0b3IpO1xuICAgIHRoaXMudmlzaXQodGhpcy5wcm9ncmFtLnNvdXJjZXMuZmlsdGVyKHRoaXMudmlzaXRvci5zb3VyY2VGaWx0ZXIpKTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjb3JhdG9yIGV4dGVuZHMgUGF0aFRyYW5zZm9ybVZpc2l0b3Ige1xuICAvKipcbiAgICogRGVmYXVsdCBmaWx0ZXIgdGhhdCBcbiAgICovXG4gIGdldCBzb3VyY2VGaWx0ZXIoKTogKHM6IFNvdXJjZSkgPT4gYm9vbCB7XG4gICAgcmV0dXJuIG5vdChpc0xpYnJhcnkpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IG5hbWUoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2xhc3NEZWNvcmF0b3IgZXh0ZW5kcyBEZWNvcmF0b3Ige1xuICBhYnN0cmFjdCB2aXNpdEZpZWxkRGVjbGFyYXRpb24obm9kZTogRmllbGREZWNsYXJhdGlvbik6IHZvaWQ7XG4gIGFic3RyYWN0IHZpc2l0TWV0aG9kRGVjbGFyYXRpb24obm9kZTogTWV0aG9kRGVjbGFyYXRpb24pOiB2b2lkO1xuICBhYnN0cmFjdCB2aXNpdENsYXNzRGVjbGFyYXRpb24obm9kZTogQ2xhc3NEZWNsYXJhdGlvbik6IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGdW5jdGlvbkRlY29yYXRvciBleHRlbmRzIERlY29yYXRvciB7XG4gIGFic3RyYWN0IHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihub2RlOiBGdW5jdGlvbkRlY2xhcmF0aW9uKTogdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlRGVjb3JhdG9yIGV4dGVuZHMgRGVjb3JhdG9yIHtcbiAgYWJzdHJhY3QgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGU6IFZhcmlhYmxlRGVjbGFyYXRpb24pOiB2b2lkO1xufVxuIl19 | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUF1RTtBQVd2RSxtQ0FBb0Q7QUFFcEQsU0FBZ0IsaUJBQWlCLENBQUMsU0FBMkI7SUFDM0QsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLE9BQU8saUJBQWlCLENBQUM7QUFDM0IsQ0FBQztBQUhELDhDQUdDO0FBT0QsTUFBYSxpQkFBa0IsU0FBUSxrQ0FBb0I7SUFHekQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUF5QjtRQUM5QyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFZLE9BQU87UUFDakIsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7SUFDcEMsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQW1CO1FBQ3BDLElBQUksaUJBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxDQUFTO1FBQ2xCLDhCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQXRCRCw4Q0FzQkM7QUFFRCxNQUFzQixTQUFVLFNBQVEsa0NBQW9CO0lBQzFEOztPQUVHO0lBQ0gsSUFBSSxZQUFZO1FBQ2QsT0FBTyxXQUFHLENBQUMsaUJBQVMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FHRjtBQVRELDhCQVNDO0FBRUQsTUFBc0IsY0FBZSxTQUFRLFNBQVM7Q0FJckQ7QUFKRCx3Q0FJQztBQUVELE1BQXNCLGlCQUFrQixTQUFRLFNBQVM7Q0FFeEQ7QUFGRCw4Q0FFQztBQUVELE1BQXNCLGlCQUFrQixTQUFRLFNBQVM7Q0FFeEQ7QUFGRCw4Q0FFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhdGhUcmFuc2Zvcm1WaXNpdG9yLCBtZXJnZVRyYW5zZm9ybWVyIH0gZnJvbSBcIi4vdHJhbnNmb3JtZXJcIjtcbmltcG9ydCB7XG4gIENsYXNzRGVjbGFyYXRpb24sXG4gIEZpZWxkRGVjbGFyYXRpb24sXG4gIE1ldGhvZERlY2xhcmF0aW9uLFxuICBQYXJzZXIsXG4gIFZhcmlhYmxlRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIFNvdXJjZSxcbiAgRGVjb3JhdG9yTm9kZSxcbn0gZnJvbSBcIi4uL2FzXCI7XG5pbXBvcnQgeyBkZWNvcmF0ZXMsIG5vdCwgaXNMaWJyYXJ5IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKGRlY29yYXRvcjogRGVjb3JhdG9yVmlzaXRvcikge1xuICBUb3BMZXZlbERlY29yYXRvci5yZWdpc3RlclZpc2l0b3IoZGVjb3JhdG9yKTtcbiAgcmV0dXJuIFRvcExldmVsRGVjb3JhdG9yO1xufVxuXG5pbnRlcmZhY2UgRGVjb3JhdG9yVmlzaXRvciBleHRlbmRzIFBhdGhUcmFuc2Zvcm1WaXNpdG9yIHtcbiAgbmFtZTogc3RyaW5nO1xuICBzb3VyY2VGaWx0ZXI6IChzOiBTb3VyY2UpID0+IGJvb2w7XG59XG5cbmV4cG9ydCBjbGFzcyBUb3BMZXZlbERlY29yYXRvciBleHRlbmRzIFBhdGhUcmFuc2Zvcm1WaXNpdG9yIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX3Zpc2l0b3I6IERlY29yYXRvclZpc2l0b3I7XG5cbiAgc3RhdGljIHJlZ2lzdGVyVmlzaXRvcih2aXNpdG9yOiBEZWNvcmF0b3JWaXNpdG9yKTogdm9pZCB7XG4gICAgVG9wTGV2ZWxEZWNvcmF0b3IuX3Zpc2l0b3IgPSB2aXNpdG9yO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdmlzaXRvcigpOiBEZWNvcmF0b3JWaXNpdG9yIHtcbiAgICByZXR1cm4gVG9wTGV2ZWxEZWNvcmF0b3IuX3Zpc2l0b3I7XG4gIH1cblxuICB2aXNpdERlY29yYXRvck5vZGUobm9kZTogRGVjb3JhdG9yTm9kZSkge1xuICAgIGlmIChkZWNvcmF0ZXMobm9kZSwgdGhpcy52aXNpdG9yLm5hbWUpKSB7XG4gICAgICB0aGlzLnZpc2l0b3IuY3VycmVudFBhdGggPSB0aGlzLmN1ZXJyZW50UGFyZW50UGF0aDtcbiAgICAgIHRoaXMudmlzaXRvci52aXNpdCh0aGlzLmN1cnJlbnRQYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGFmdGVyUGFyc2UoXzogUGFyc2VyKTogdm9pZCB7XG4gICAgbWVyZ2VUcmFuc2Zvcm1lcih0aGlzLCB0aGlzLnZpc2l0b3IpO1xuICAgIHRoaXMudmlzaXQodGhpcy5wcm9ncmFtLnNvdXJjZXMuZmlsdGVyKHRoaXMudmlzaXRvci5zb3VyY2VGaWx0ZXIpKTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjb3JhdG9yIGV4dGVuZHMgUGF0aFRyYW5zZm9ybVZpc2l0b3Ige1xuICAvKipcbiAgICogRGVmYXVsdCBmaWx0ZXIgdGhhdCByZW1vdmVzIGxpYnJhcnkgZmlsZXNcbiAgICovXG4gIGdldCBzb3VyY2VGaWx0ZXIoKTogKHM6IFNvdXJjZSkgPT4gYm9vbCB7XG4gICAgcmV0dXJuIG5vdChpc0xpYnJhcnkpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IG5hbWUoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2xhc3NEZWNvcmF0b3IgZXh0ZW5kcyBEZWNvcmF0b3Ige1xuICBhYnN0cmFjdCB2aXNpdEZpZWxkRGVjbGFyYXRpb24obm9kZTogRmllbGREZWNsYXJhdGlvbik6IHZvaWQ7XG4gIGFic3RyYWN0IHZpc2l0TWV0aG9kRGVjbGFyYXRpb24obm9kZTogTWV0aG9kRGVjbGFyYXRpb24pOiB2b2lkO1xuICBhYnN0cmFjdCB2aXNpdENsYXNzRGVjbGFyYXRpb24obm9kZTogQ2xhc3NEZWNsYXJhdGlvbik6IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGdW5jdGlvbkRlY29yYXRvciBleHRlbmRzIERlY29yYXRvciB7XG4gIGFic3RyYWN0IHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihub2RlOiBGdW5jdGlvbkRlY2xhcmF0aW9uKTogdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlRGVjb3JhdG9yIGV4dGVuZHMgRGVjb3JhdG9yIHtcbiAgYWJzdHJhY3QgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGU6IFZhcmlhYmxlRGVjbGFyYXRpb24pOiB2b2lkO1xufVxuIl19 |
+1
-0
@@ -7,3 +7,4 @@ export * from "./base"; | ||
| export * from "./path"; | ||
| export * from "./simpleParser"; | ||
| import * as utils from "./utils"; | ||
| export { utils }; |
+2
-1
@@ -12,4 +12,5 @@ "use strict"; | ||
| __export(require("./path")); | ||
| __export(require("./simpleParser")); | ||
| const utils = require("./utils"); | ||
| exports.utils = utils; | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0QkFBdUI7QUFDdkIsbUNBQThCO0FBQzlCLCtCQUEwQjtBQUMxQixrQ0FBNkI7QUFDN0IsaUNBQTRCO0FBQzVCLDRCQUF1QjtBQUV2QixpQ0FBaUM7QUFFeEIsc0JBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9iYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90cmFuc2Zvcm1lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmlzaXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXN0QnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wYXRoXCI7XG5cbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCB7IHV0aWxzIH07XG4iXX0= | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0QkFBdUI7QUFDdkIsbUNBQThCO0FBQzlCLCtCQUEwQjtBQUMxQixrQ0FBNkI7QUFDN0IsaUNBQTRCO0FBQzVCLDRCQUF1QjtBQUN2QixvQ0FBOEI7QUFDOUIsaUNBQWlDO0FBQ3hCLHNCQUFLIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYmFzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHJhbnNmb3JtZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Zpc2l0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FzdEJ1aWxkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGF0aFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2ltcGxlUGFyc2VyXCJcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgeyB1dGlscyB9O1xuIl19 |
+2
-236
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const as_1 = require("../as"); | ||
| const base_1 = require("./base"); | ||
@@ -13,236 +12,3 @@ const _1 = require("."); | ||
| this.currentPath.push(node); | ||
| switch (node.kind) { | ||
| case as_1.NodeKind.SOURCE: { | ||
| this.visitSource(node); | ||
| break; | ||
| } | ||
| // types | ||
| case as_1.NodeKind.NAMEDTYPE: { | ||
| this.visitNamedTypeNode(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.FUNCTIONTYPE: { | ||
| this.visitFunctionTypeNode(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.TYPENAME: { | ||
| this.visitTypeName(node); | ||
| } | ||
| case as_1.NodeKind.TYPEPARAMETER: { | ||
| this.visitTypeParameter(node); | ||
| break; | ||
| } | ||
| // expressions | ||
| case as_1.NodeKind.FALSE: | ||
| case as_1.NodeKind.NULL: | ||
| case as_1.NodeKind.SUPER: | ||
| case as_1.NodeKind.THIS: | ||
| case as_1.NodeKind.TRUE: | ||
| case as_1.NodeKind.CONSTRUCTOR: | ||
| case as_1.NodeKind.IDENTIFIER: { | ||
| this.visitIdentifierExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.ASSERTION: { | ||
| this.visitAssertionExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.BINARY: { | ||
| this.visitBinaryExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.CALL: { | ||
| this.visitCallExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.CLASS: { | ||
| this.visitClassExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.COMMA: { | ||
| this.visitCommaExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.ELEMENTACCESS: { | ||
| this.visitElementAccessExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.FUNCTION: { | ||
| this.visitFunctionExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.INSTANCEOF: { | ||
| this.visitInstanceOfExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.LITERAL: { | ||
| this.visitLiteralExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.NEW: { | ||
| this.visitNewExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.PARENTHESIZED: { | ||
| this.visitParenthesizedExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.PROPERTYACCESS: { | ||
| this.visitPropertyAccessExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.TERNARY: { | ||
| this.visitTernaryExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.UNARYPOSTFIX: { | ||
| this.visitUnaryPostfixExpression(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.UNARYPREFIX: { | ||
| this.visitUnaryPrefixExpression(node); | ||
| break; | ||
| } | ||
| // statements | ||
| case as_1.NodeKind.BLOCK: { | ||
| this.visitBlockStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.BREAK: { | ||
| this.visitBreakStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.CONTINUE: { | ||
| this.visitContinueStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.DO: { | ||
| this.visitDoStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.EMPTY: { | ||
| this.visitEmptyStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.EXPORT: { | ||
| this.visitExportStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.EXPORTDEFAULT: { | ||
| this.visitExportDefaultStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.EXPORTIMPORT: { | ||
| this.visitExportImportStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.EXPRESSION: { | ||
| this.visitExpressionStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.FOR: { | ||
| this.visitForStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.IF: { | ||
| this.visitIfStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.IMPORT: { | ||
| this.visitImportStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.RETURN: { | ||
| this.visitReturnStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.SWITCH: { | ||
| this.visitSwitchStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.THROW: { | ||
| this.visitThrowStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.TRY: { | ||
| this.visitTryStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.VARIABLE: { | ||
| this.visitVariableStatement(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.WHILE: { | ||
| this.visitWhileStatement(node); | ||
| break; | ||
| } | ||
| // declaration statements | ||
| case as_1.NodeKind.CLASSDECLARATION: { | ||
| this.visitClassDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.ENUMDECLARATION: { | ||
| this.visitEnumDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.ENUMVALUEDECLARATION: { | ||
| this.visitEnumValueDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.FIELDDECLARATION: { | ||
| this.visitFieldDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.FUNCTIONDECLARATION: { | ||
| this.visitFunctionDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.IMPORTDECLARATION: { | ||
| this.visitImportDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.INDEXSIGNATUREDECLARATION: { | ||
| this.visitIndexSignatureDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.INTERFACEDECLARATION: { | ||
| this.visitInterfaceDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.METHODDECLARATION: { | ||
| this.visitMethodDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.NAMESPACEDECLARATION: { | ||
| this.visitNamespaceDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.TYPEDECLARATION: { | ||
| this.visitTypeDeclaration(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.VARIABLEDECLARATION: { | ||
| this.visitVariableDeclaration(node); | ||
| break; | ||
| } | ||
| // other | ||
| case as_1.NodeKind.DECORATOR: { | ||
| this.visitDecoratorNode(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.EXPORTMEMBER: { | ||
| this.visitExportMember(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.PARAMETER: { | ||
| this.visitParameter(node); | ||
| break; | ||
| } | ||
| case as_1.NodeKind.SWITCHCASE: { | ||
| this.visitSwitchCase(node); | ||
| break; | ||
| } | ||
| default: | ||
| assert(false); | ||
| } | ||
| super._visit(node); | ||
| this.currentPath.pop(); | ||
@@ -281,2 +47,2 @@ } | ||
| exports.PathVisitor = PathVisitor; | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOEJBNkVlO0FBRWYsaUNBQXFDO0FBQ3JDLHdCQUEwQjtBQUUxQixNQUFhLFdBQVksU0FBUSxrQkFBVztJQUE1Qzs7UUFDRSxnQkFBVyxHQUFXLEVBQUUsQ0FBQztJQTRSM0IsQ0FBQztJQTFSQyxNQUFNLENBQUMsSUFBVTtRQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNqQixLQUFLLGFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBUyxJQUFJLENBQUMsQ0FBQztnQkFDL0IsTUFBTTthQUNQO1lBRUQsUUFBUTtZQUVSLEtBQUssYUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQWdCLElBQUksQ0FBQyxDQUFDO2dCQUM3QyxNQUFNO2FBQ1A7WUFDRCxLQUFLLGFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLHFCQUFxQixDQUFtQixJQUFJLENBQUMsQ0FBQztnQkFDbkQsTUFBTTthQUNQO1lBQ0QsS0FBSyxhQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7YUFDcEM7WUFDRCxLQUFLLGFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFvQixJQUFJLENBQUMsQ0FBQztnQkFDakQsTUFBTTthQUNQO1lBRUQsY0FBYztZQUVkLEtBQUssYUFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLGFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbkIsS0FBSyxhQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3BCLEtB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QUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNoQyxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sUUFBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQVU7UUFDM0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM5RCxZQUFZO1lBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUM1QixZQUFZO2dCQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ2pDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE3UkQsa0NBNlJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgTm9kZSxcbiAgTm9kZUtpbmQsXG4gIFNvdXJjZSxcbiAgTmFtZWRUeXBlTm9kZSxcbiAgRnVuY3Rpb25UeXBlTm9kZSxcbiAgVHlwZU5hbWUsXG4gIFR5cGVQYXJhbWV0ZXJOb2RlLFxuICBJZGVudGlmaWVyRXhwcmVzc2lvbixcbiAgQXNzZXJ0aW9uRXhwcmVzc2lvbixcbiAgQmluYXJ5RXhwcmVzc2lvbixcbiAgQ2FsbEV4cHJlc3Npb24sXG4gIENsYXNzRXhwcmVzc2lvbixcbiAgQ29tbWFFeHByZXNzaW9uLFxuICBFbGVtZW50QWNjZXNzRXhwcmVzc2lvbixcbiAgRnVuY3Rpb25FeHByZXNzaW9uLFxuICBJbnN0YW5jZU9mRXhwcmVzc2lvbixcbiAgTGl0ZXJhbEV4cHJlc3Npb24sXG4gIE5ld0V4cHJlc3Npb24sXG4gIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLFxuICBQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24sXG4gIFRlcm5hcnlFeHByZXNzaW9uLFxuICBVbmFyeVBvc3RmaXhFeHByZXNzaW9uLFxuICBVbmFyeVByZWZpeEV4cHJlc3Npb24sXG4gIEJsb2NrU3RhdGVtZW50LFxuICBCcmVha1N0YXRlbWVudCxcbiAgQ29udGludWVTdGF0ZW1lbnQsXG4gIERvU3RhdGVtZW50LFxuICBFbXB0eVN0YXRlbWVudCxcbiAgRXhwb3J0U3RhdGVtZW50LFxuICBFeHBvcnREZWZhdWx0U3RhdGVtZW50LFxuICBFeHBvcnRJbXBvcnRTdGF0ZW1lbnQsXG4gIEV4cHJlc3Npb25TdGF0ZW1lbnQsXG4gIEZvclN0YXRlbWVudCxcbiAgSWZTdGF0ZW1lbnQsXG4gIEltcG9ydFN0YXRlbWVudCxcbiAgUmV0dXJuU3RhdGVtZW50LFxuICBTd2l0Y2hTdGF0ZW1lbnQsXG4gIFRocm93U3RhdGVtZW50LFxuICBUcnlTdGF0ZW1lbnQsXG4gIFZhcmlhYmxlU3RhdGVtZW50LFxuICBXaGlsZVN0YXRlbWVudCxcbiAgQ2xhc3NEZWNsYXJhdGlvbixcbiAgRW51bURlY2xhcmF0aW9uLFxuICBFbnVtVmFsdWVEZWNsYXJhdGlvbixcbiAgRmllbGREZWNsYXJhdGlvbixcbiAgRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgSW1wb3J0RGVjbGFyYXRpb24sXG4gIEluZGV4U2lnbmF0dXJlRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBNZXRob2REZWNsYXJhdGlvbixcbiAgTmFtZXNwYWNlRGVjbGFyYXRpb24sXG4gIFR5cGVEZWNsYXJhdGlvbixcbiAgVmFyaWFibGVEZWNsYXJhdGlvbixcbiAgRGVjb3JhdG9yTm9kZSxcbiAgRXhwb3J0TWVtYmVyLFxuICBQYXJhbWV0ZXJOb2RlLFxuICBTd2l0Y2hDYXNlLFxuICBUeXBlTm9kZSxcbiAgQXJyYXlMaXRlcmFsRXhwcmVzc2lvbixcbiAgRXhwcmVzc2lvbixcbiAgT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIEZsb2F0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIEludGVnZXJMaXRlcmFsRXhwcmVzc2lvbixcbiAgU3RyaW5nTGl0ZXJhbEV4cHJlc3Npb24sXG4gIFJlZ2V4cExpdGVyYWxFeHByZXNzaW9uLFxuICBVbmFyeUV4cHJlc3Npb24sXG4gIFN1cGVyRXhwcmVzc2lvbixcbiAgRmFsc2VFeHByZXNzaW9uLFxuICBUcnVlRXhwcmVzc2lvbixcbiAgVGhpc0V4cHJlc3Npb24sXG4gIE51bGxFeHByZXNzaW9uLFxuICBDb25zdHJ1Y3RvckV4cHJlc3Npb24sXG4gIFN0YXRlbWVudCxcbiAgVm9pZFN0YXRlbWVudCxcbiAgTGl0ZXJhbEtpbmQsXG4gIENvbW1lbnROb2RlLFxufSBmcm9tIFwiLi4vYXNcIjtcblxuaW1wb3J0IHsgQmFzZVZpc2l0b3IgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCIuXCI7XG5cbmV4cG9ydCBjbGFzcyBQYXRoVmlzaXRvciBleHRlbmRzIEJhc2VWaXNpdG9yIHtcbiAgY3VycmVudFBhdGg6IE5vZGVbXSA9IFtdO1xuXG4gIF92aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgIHN3aXRjaCAobm9kZS5raW5kKSB7XG4gICAgICBjYXNlIE5vZGVLaW5kLlNPVVJDRToge1xuICAgICAgICB0aGlzLnZpc2l0U291cmNlKDxTb3VyY2U+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyB0eXBlc1xuXG4gICAgICBjYXNlIE5vZGVLaW5kLk5BTUVEVFlQRToge1xuICAgICAgICB0aGlzLnZpc2l0TmFtZWRUeXBlTm9kZSg8TmFtZWRUeXBlTm9kZT5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLkZVTkNUSU9OVFlQRToge1xuICAgICAgICB0aGlzLnZpc2l0RnVuY3Rpb25UeXBlTm9kZSg8RnVuY3Rpb25UeXBlTm9kZT5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLlRZUEVOQU1FOiB7XG4gICAgICAgIHRoaXMudmlzaXRUeXBlTmFtZSg8VHlwZU5hbWU+bm9kZSk7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLlRZUEVQQVJBTUVURVI6IHtcbiAgICAgICAgdGhpcy52aXNpdFR5cGVQYXJhbWV0ZXIoPFR5cGVQYXJhbWV0ZXJOb2RlPm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gZXhwcmVzc2lvbnNcblxuICAgICAgY2FzZSBOb2RlS2luZC5GQUxTRTpcbiAgICAgIGNhc2UgTm9kZUtpbmQuTlVMTDpcbiAgICAgIGNhc2UgTm9kZUtpbmQuU1VQRVI6XG4gICAgICBjYXNlIE5vZGVLaW5kLlRISVM6XG4gICAgICBjYXNlIE5vZGVLaW5kLlRSVUU6XG4gICAgICBjYXNlIE5vZGVLaW5kLkNPTlNUUlVDVE9SOlxuICAgICAgY2FzZSBOb2RlS2luZC5JREVOVElGSUVSOiB7XG4gICAgICAgIHRoaXMudmlzaXRJZGVudGlmaWVyRXhwcmVzc2lvbig8SWRlbnRpZmllckV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5BU1NFUlRJT046IHtcbiAgICAgICAgdGhpcy52aXNpdEFzc2VydGlvbkV4cHJlc3Npb24oPEFzc2VydGlvbkV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5CSU5BUlk6IHtcbiAgICAgICAgdGhpcy52aXNpdEJpbmFyeUV4cHJlc3Npb24oPEJpbmFyeUV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5DQUxMOiB7XG4gICAgICAgIHRoaXMudmlzaXRDYWxsRXhwcmVzc2lvbig8Q2FsbEV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5DTEFTUzoge1xuICAgICAgICB0aGlzLnZpc2l0Q2xhc3NFeHByZXNzaW9uKDxDbGFzc0V4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5DT01NQToge1xuICAgICAgICB0aGlzLnZpc2l0Q29tbWFFeHByZXNzaW9uKDxDb21tYUV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5FTEVNRU5UQUNDRVNTOiB7XG4gICAgICAgIHRoaXMudmlzaXRFbGVtZW50QWNjZXNzRXhwcmVzc2lvbig8RWxlbWVudEFjY2Vzc0V4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5GVU5DVElPTjoge1xuICAgICAgICB0aGlzLnZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKDxGdW5jdGlvbkV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5JTlNUQU5DRU9GOiB7XG4gICAgICAgIHRoaXMudmlzaXRJbnN0YW5jZU9mRXhwcmVzc2lvbig8SW5zdGFuY2VPZkV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5MSVRFUkFMOiB7XG4gICAgICAgIHRoaXMudmlzaXRMaXRlcmFsRXhwcmVzc2lvbig8TGl0ZXJhbEV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5ORVc6IHtcbiAgICAgICAgdGhpcy52aXNpdE5ld0V4cHJlc3Npb24oPE5ld0V4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5QQVJFTlRIRVNJWkVEOiB7XG4gICAgICAgIHRoaXMudmlzaXRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbig8UGFyZW50aGVzaXplZEV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5QUk9QRVJUWUFDQ0VTUzoge1xuICAgICAgICB0aGlzLnZpc2l0UHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKDxQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5URVJOQVJZOiB7XG4gICAgICAgIHRoaXMudmlzaXRUZXJuYXJ5RXhwcmVzc2lvbig8VGVybmFyeUV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5VTkFSWVBPU1RGSVg6IHtcbiAgICAgICAgdGhpcy52aXNpdFVuYXJ5UG9zdGZpeEV4cHJlc3Npb24oPFVuYXJ5UG9zdGZpeEV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5VTkFSWVBSRUZJWDoge1xuICAgICAgICB0aGlzLnZpc2l0VW5hcnlQcmVmaXhFeHByZXNzaW9uKDxVbmFyeVByZWZpeEV4cHJlc3Npb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBzdGF0ZW1lbnRzXG5cbiAgICAgIGNhc2UgTm9kZUtpbmQuQkxPQ0s6IHtcbiAgICAgICAgdGhpcy52aXNpdEJsb2NrU3RhdGVtZW50KDxCbG9ja1N0YXRlbWVudD5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLkJSRUFLOiB7XG4gICAgICAgIHRoaXMudmlzaXRCcmVha1N0YXRlbWVudCg8QnJlYWtTdGF0ZW1lbnQ+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5DT05USU5VRToge1xuICAgICAgICB0aGlzLnZpc2l0Q29udGludWVTdGF0ZW1lbnQoPENvbnRpbnVlU3RhdGVtZW50Pm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuRE86IHtcbiAgICAgICAgdGhpcy52aXNpdERvU3RhdGVtZW50KDxEb1N0YXRlbWVudD5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLkVNUFRZOiB7XG4gICAgICAgIHRoaXMudmlzaXRFbXB0eVN0YXRlbWVudCg8RW1wdHlTdGF0ZW1lbnQ+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5FWFBPUlQ6IHtcbiAgICAgICAgdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudCg8RXhwb3J0U3RhdGVtZW50Pm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuRVhQT1JUREVGQVVMVDoge1xuICAgICAgICB0aGlzLnZpc2l0RXhwb3J0RGVmYXVsdFN0YXRlbWVudCg8RXhwb3J0RGVmYXVsdFN0YXRlbWVudD5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLkVYUE9SVElNUE9SVDoge1xuICAgICAgICB0aGlzLnZpc2l0RXhwb3J0SW1wb3J0U3RhdGVtZW50KDxFeHBvcnRJbXBvcnRTdGF0ZW1lbnQ+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5FWFBSRVNTSU9OOiB7XG4gICAgICAgIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KDxFeHByZXNzaW9uU3RhdGVtZW50Pm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuRk9SOiB7XG4gICAgICAgIHRoaXMudmlzaXRGb3JTdGF0ZW1lbnQoPEZvclN0YXRlbWVudD5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLklGOiB7XG4gICAgICAgIHRoaXMudmlzaXRJZlN0YXRlbWVudCg8SWZTdGF0ZW1lbnQ+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5JTVBPUlQ6IHtcbiAgICAgICAgdGhpcy52aXNpdEltcG9ydFN0YXRlbWVudCg8SW1wb3J0U3RhdGVtZW50Pm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuUkVUVVJOOiB7XG4gICAgICAgIHRoaXMudmlzaXRSZXR1cm5TdGF0ZW1lbnQoPFJldHVyblN0YXRlbWVudD5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLlNXSVRDSDoge1xuICAgICAgICB0aGlzLnZpc2l0U3dpdGNoU3RhdGVtZW50KDxTd2l0Y2hTdGF0ZW1lbnQ+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5USFJPVzoge1xuICAgICAgICB0aGlzLnZpc2l0VGhyb3dTdGF0ZW1lbnQoPFRocm93U3RhdGVtZW50Pm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuVFJZOiB7XG4gICAgICAgIHRoaXMudmlzaXRUcnlTdGF0ZW1lbnQoPFRyeVN0YXRlbWVudD5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLlZBUklBQkxFOiB7XG4gICAgICAgIHRoaXMudmlzaXRWYXJpYWJsZVN0YXRlbWVudCg8VmFyaWFibGVTdGF0ZW1lbnQ+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5XSElMRToge1xuICAgICAgICB0aGlzLnZpc2l0V2hpbGVTdGF0ZW1lbnQoPFdoaWxlU3RhdGVtZW50Pm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gZGVjbGFyYXRpb24gc3RhdGVtZW50c1xuXG4gICAgICBjYXNlIE5vZGVLaW5kLkNMQVNTREVDTEFSQVRJT046IHtcbiAgICAgICAgdGhpcy52aXNpdENsYXNzRGVjbGFyYXRpb24oPENsYXNzRGVjbGFyYXRpb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5FTlVNREVDTEFSQVRJT046IHtcbiAgICAgICAgdGhpcy52aXNpdEVudW1EZWNsYXJhdGlvbig8RW51bURlY2xhcmF0aW9uPm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuRU5VTVZBTFVFREVDTEFSQVRJT046IHtcbiAgICAgICAgdGhpcy52aXNpdEVudW1WYWx1ZURlY2xhcmF0aW9uKDxFbnVtVmFsdWVEZWNsYXJhdGlvbj5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLkZJRUxEREVDTEFSQVRJT046IHtcbiAgICAgICAgdGhpcy52aXNpdEZpZWxkRGVjbGFyYXRpb24oPEZpZWxkRGVjbGFyYXRpb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5GVU5DVElPTkRFQ0xBUkFUSU9OOiB7XG4gICAgICAgIHRoaXMudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKDxGdW5jdGlvbkRlY2xhcmF0aW9uPm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuSU1QT1JUREVDTEFSQVRJT046IHtcbiAgICAgICAgdGhpcy52aXNpdEltcG9ydERlY2xhcmF0aW9uKDxJbXBvcnREZWNsYXJhdGlvbj5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLklOREVYU0lHTkFUVVJFREVDTEFSQVRJT046IHtcbiAgICAgICAgdGhpcy52aXNpdEluZGV4U2lnbmF0dXJlRGVjbGFyYXRpb24oPEluZGV4U2lnbmF0dXJlRGVjbGFyYXRpb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5JTlRFUkZBQ0VERUNMQVJBVElPTjoge1xuICAgICAgICB0aGlzLnZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24oPEludGVyZmFjZURlY2xhcmF0aW9uPm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuTUVUSE9EREVDTEFSQVRJT046IHtcbiAgICAgICAgdGhpcy52aXNpdE1ldGhvZERlY2xhcmF0aW9uKDxNZXRob2REZWNsYXJhdGlvbj5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLk5BTUVTUEFDRURFQ0xBUkFUSU9OOiB7XG4gICAgICAgIHRoaXMudmlzaXROYW1lc3BhY2VEZWNsYXJhdGlvbig8TmFtZXNwYWNlRGVjbGFyYXRpb24+bm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBOb2RlS2luZC5UWVBFREVDTEFSQVRJT046IHtcbiAgICAgICAgdGhpcy52aXNpdFR5cGVEZWNsYXJhdGlvbig8VHlwZURlY2xhcmF0aW9uPm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuVkFSSUFCTEVERUNMQVJBVElPTjoge1xuICAgICAgICB0aGlzLnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbig8VmFyaWFibGVEZWNsYXJhdGlvbj5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIG90aGVyXG5cbiAgICAgIGNhc2UgTm9kZUtpbmQuREVDT1JBVE9SOiB7XG4gICAgICAgIHRoaXMudmlzaXREZWNvcmF0b3JOb2RlKDxEZWNvcmF0b3JOb2RlPm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuRVhQT1JUTUVNQkVSOiB7XG4gICAgICAgIHRoaXMudmlzaXRFeHBvcnRNZW1iZXIoPEV4cG9ydE1lbWJlcj5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE5vZGVLaW5kLlBBUkFNRVRFUjoge1xuICAgICAgICB0aGlzLnZpc2l0UGFyYW1ldGVyKDxQYXJhbWV0ZXJOb2RlPm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTm9kZUtpbmQuU1dJVENIQ0FTRToge1xuICAgICAgICB0aGlzLnZpc2l0U3dpdGNoQ2FzZSg8U3dpdGNoQ2FzZT5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYXRoLnBvcCgpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnROb2RlKCk6IE5vZGUge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYXRoW3RoaXMuY3VycmVudFBhdGgubGVuZ3RoIC0gMV07XG4gIH1cblxuICBnZXQgY3VycmVudFBhcmVudCgpOiBOb2RlIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGF0aC5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMuY3VycmVudE5vZGU7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhdGhbdGhpcy5jdXJyZW50UGF0aC5sZW5ndGggLSAyXTtcbiAgfVxuXG4gIGdldCBjdWVycmVudFBhcmVudFBhdGgoKTogTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5zbGljZSgwLCB0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRHcmFuZFBhcmVudFBhdGgoKTogTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5sZW5ndGggPCAzXG4gICAgICA/IFtdXG4gICAgICA6IHRoaXMuY3VycmVudFBhdGguc2xpY2UoMCwgdGhpcy5jdXJyZW50UGF0aC5sZW5ndGggLSAyKTtcbiAgfVxuXG4gIGNsb25lQ3VycmVudE5vZGUoKTogTm9kZSB7XG4gICAgcmV0dXJuIHV0aWxzLmNsb25lTm9kZSh0aGlzLmN1cnJlbnROb2RlKTtcbiAgfVxuXG4gIHJlcGxhY2VDdXJyZW50Tm9kZShub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5jdXJyZW50UGFyZW50KS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGNvbnN0IHByb3AgPSB0aGlzLmN1cnJlbnRQYXJlbnRbbmFtZV07XG4gICAgICBpZiAocHJvcCA9PSB0aGlzLmN1cnJlbnROb2RlKSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmN1cnJlbnRQYXJlbnRbbmFtZV0gPSBub2RlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0= | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEsaUNBQXFDO0FBQ3JDLHdCQUEwQjtBQUUxQixNQUFhLFdBQVksU0FBUSxrQkFBVztJQUE1Qzs7UUFDRSxnQkFBVyxHQUFXLEVBQUUsQ0FBQztJQXlDM0IsQ0FBQztJQXZDQyxNQUFNLENBQUMsSUFBVTtRQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsSUFBSSxzQkFBc0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxRQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBVTtRQUMzQixNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzlELFlBQVk7WUFDWixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQzVCLFlBQVk7Z0JBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDakM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTFDRCxrQ0EwQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBOb2RlLFxufSBmcm9tIFwiLi4vYXNcIjtcblxuaW1wb3J0IHsgQmFzZVZpc2l0b3IgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCIuXCI7XG5cbmV4cG9ydCBjbGFzcyBQYXRoVmlzaXRvciBleHRlbmRzIEJhc2VWaXNpdG9yIHtcbiAgY3VycmVudFBhdGg6IE5vZGVbXSA9IFtdO1xuXG4gIF92aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgIHN1cGVyLl92aXNpdChub2RlKTtcbiAgICB0aGlzLmN1cnJlbnRQYXRoLnBvcCgpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnROb2RlKCk6IE5vZGUge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYXRoW3RoaXMuY3VycmVudFBhdGgubGVuZ3RoIC0gMV07XG4gIH1cblxuICBnZXQgY3VycmVudFBhcmVudCgpOiBOb2RlIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGF0aC5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMuY3VycmVudE5vZGU7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhdGhbdGhpcy5jdXJyZW50UGF0aC5sZW5ndGggLSAyXTtcbiAgfVxuXG4gIGdldCBjdWVycmVudFBhcmVudFBhdGgoKTogTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5zbGljZSgwLCB0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRHcmFuZFBhcmVudFBhdGgoKTogTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5sZW5ndGggPCAzXG4gICAgICA/IFtdXG4gICAgICA6IHRoaXMuY3VycmVudFBhdGguc2xpY2UoMCwgdGhpcy5jdXJyZW50UGF0aC5sZW5ndGggLSAyKTtcbiAgfVxuXG4gIGNsb25lQ3VycmVudE5vZGUoKTogTm9kZSB7XG4gICAgcmV0dXJuIHV0aWxzLmNsb25lTm9kZSh0aGlzLmN1cnJlbnROb2RlKTtcbiAgfVxuXG4gIHJlcGxhY2VDdXJyZW50Tm9kZShub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5jdXJyZW50UGFyZW50KS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGNvbnN0IHByb3AgPSB0aGlzLmN1cnJlbnRQYXJlbnRbbmFtZV07XG4gICAgICBpZiAocHJvcCA9PSB0aGlzLmN1cnJlbnROb2RlKSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmN1cnJlbnRQYXJlbnRbbmFtZV0gPSBub2RlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0= |
+5
-4
| { | ||
| "name": "visitor-as", | ||
| "version": "0.1.0", | ||
| "version": "0.2.0-0", | ||
| "description": "A generic visitor framework for AssemblyScript", | ||
@@ -13,11 +13,12 @@ "main": "dist", | ||
| "test": "jest && asp", | ||
| "build": "tsc" | ||
| "build": "rimraf dist/ && tsc" | ||
| }, | ||
| "devDependencies": { | ||
| "@as-pect/cli": "^3.1.4", | ||
| "@as-pect/cli": "^4.0.0", | ||
| "@types/jest": "^25.1.4", | ||
| "@types/node": "^13.9.1", | ||
| "assemblyscript": "^0.9.4", | ||
| "assemblyscript": "^0.13.3", | ||
| "jest": "^25.1.0", | ||
| "prettier": "^2.0.4", | ||
| "rimraf": "^3.0.2", | ||
| "ts-jest": "^25.2.1", | ||
@@ -24,0 +25,0 @@ "ts-node": "^8.6.2", |
+10
-0
@@ -47,2 +47,12 @@ # Visitor utilities for AssemblyScript Compiler transformers | ||
| assembly/foo.ts: | ||
| ```ts | ||
| @list | ||
| class Foo { | ||
| a: u8; | ||
| b: bool; | ||
| i: i32; | ||
| } | ||
| ``` | ||
| And then compile with `--transform` flag: | ||
@@ -49,0 +59,0 @@ |
| module.exports = { | ||
| /** | ||
| * A set of globs passed to the glob package that qualify typescript files for testing. | ||
| */ | ||
| include: ["assembly/__tests__/**/*.spec.ts"], | ||
| /** | ||
| * A set of globs passed to the glob package that quality files to be added to each test. | ||
| */ | ||
| add: ["assembly/__tests__/**/*.include.ts"], | ||
| /** | ||
| * All the compiler flags needed for this test suite. Make sure that a binary file is output. | ||
| */ | ||
| flags: { | ||
| /** To output a wat file, uncomment the following line. */ | ||
| // "--textFile": ["output.wat"], | ||
| /** A runtime must be provided here. */ | ||
| "--runtime": ["none"], // Acceptable values are: full, half, stub (arena), and none | ||
| "--transform": ["./src/examples/capitalize.ts"], | ||
| }, | ||
| /** | ||
| * A set of regexp that will disclude source files from testing. | ||
| */ | ||
| disclude: [/node_modules/], | ||
| /** | ||
| * Add your required AssemblyScript imports here. | ||
| */ | ||
| imports(memory, createImports, instantiateSync, binary) { | ||
| let instance; // Imports can reference this | ||
| const myImports = { | ||
| // put your web assembly imports here, and return the module | ||
| }; | ||
| instance = instantiateSync(binary, createImports(myImports)); | ||
| return instance; | ||
| }, | ||
| /** | ||
| * Add a custom reporter here if you want one. The following example is in typescript. | ||
| * | ||
| * @example | ||
| * import { TestReporter, TestGroup, TestResult, TestContext } from "as-pect"; | ||
| * | ||
| * export class CustomReporter extends TestReporter { | ||
| * // implement each abstract method here | ||
| * public abstract onStart(suite: TestContext): void; | ||
| * public abstract onGroupStart(group: TestGroup): void; | ||
| * public abstract onGroupFinish(group: TestGroup): void; | ||
| * public abstract onTestStart(group: TestGroup, result: TestResult): void; | ||
| * public abstract onTestFinish(group: TestGroup, result: TestResult): void; | ||
| * public abstract onFinish(suite: TestContext): void; | ||
| * } | ||
| */ | ||
| // reporter: new CustomReporter(), | ||
| /** | ||
| * Specify if the binary wasm file should be written to the file system. | ||
| */ | ||
| outputBinary: false, | ||
| }; |
| export * from "assemblyscript"; | ||
| export * from "assemblyscript/cli/transform"; | ||
| export * from "assemblyscript/cli/asc"; |
| "use strict"; | ||
| //@ts-ignore | ||
| const path = require("path"); | ||
| let ascPath = Object.getOwnPropertyNames(require.cache).filter((s) => | ||
| s.endsWith("asc.js") | ||
| )[0]; | ||
| //@ts-ignore | ||
| let assemblyscriptPath = Object.getOwnPropertyNames(require.cache).filter((s) => | ||
| s.endsWith("assemblyscript.js") | ||
| )[0]; | ||
| let transformerPath; | ||
| if (assemblyscriptPath) { | ||
| let splitPath = assemblyscriptPath.split(path.sep).slice(0, -2); | ||
| transformerPath = splitPath.concat(["cli", "transform"]).join(path.sep); | ||
| } else { | ||
| assemblyscriptPath = require.resolve("assemblyscript"); | ||
| ascPath = require.resolve("assemblyscript/cli/asc"); | ||
| transformerPath = require.resolve("assemblyscript/cli/transform"); | ||
| } | ||
| const assemblyscript = require(assemblyscriptPath); | ||
| //@ts-ignore | ||
| module.exports.Transform = require(transformerPath).Transform; | ||
| module.exports = Object.assign( | ||
| Object.assign( | ||
| Object.assign(Object.assign({}, require(ascPath)), module.exports), | ||
| assemblyscript | ||
| ), | ||
| assemblyscript.util // Need to add because newer version adds namespace | ||
| ); | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXMvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFlBQVk7QUFDWixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFN0IsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFN0YsWUFBWTtBQUNaLElBQUksa0JBQWtCLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVuSCxJQUFJLGVBQWUsQ0FBQztBQUNwQixJQUFJLGtCQUFrQixFQUFFO0lBQ3RCLElBQUksU0FBUyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLGVBQWUsR0FBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUMzRTtLQUFNO0lBQ0wsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDcEQsZUFBZSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQztDQUNuRTtBQUNELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRW5ELFlBQVk7QUFDWixNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzlELE1BQU0sQ0FBQyxPQUFPLCtEQUNPLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FDaEIsTUFBTSxDQUFDLE9BQU8sR0FDZCxjQUFjLEdBQ2QsY0FBYyxDQUFDLElBQUksQ0FBQyxtREFBbUQ7Q0FDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vQHRzLWlnbm9yZVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG5sZXQgYXNjUGF0aCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHJlcXVpcmUuY2FjaGUpLmZpbHRlcihzID0+IHMuZW5kc1dpdGgoXCJhc2MuanNcIikpWzBdO1xuXG4vL0B0cy1pZ25vcmVcbmxldCBhc3NlbWJseXNjcmlwdFBhdGggPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyZXF1aXJlLmNhY2hlKS5maWx0ZXIocyA9PiBzLmVuZHNXaXRoKFwiYXNzZW1ibHlzY3JpcHQuanNcIikpWzBdO1xuXG5sZXQgdHJhbnNmb3JtZXJQYXRoO1xuaWYgKGFzc2VtYmx5c2NyaXB0UGF0aCkge1xuICBsZXQgc3BsaXRQYXRoID0gYXNzZW1ibHlzY3JpcHRQYXRoLnNwbGl0KHBhdGguc2VwKS5zbGljZSgwLCAtMik7XG4gIHRyYW5zZm9ybWVyUGF0aCA9ICBzcGxpdFBhdGguY29uY2F0KFsgXCJjbGlcIiwgXCJ0cmFuc2Zvcm1cIl0pLmpvaW4ocGF0aC5zZXApO1xufSBlbHNlIHtcbiAgYXNzZW1ibHlzY3JpcHRQYXRoID0gcmVxdWlyZS5yZXNvbHZlKFwiYXNzZW1ibHlzY3JpcHRcIik7XG4gIGFzY1BhdGggPSByZXF1aXJlLnJlc29sdmUoXCJhc3NlbWJseXNjcmlwdC9jbGkvYXNjXCIpO1xuICB0cmFuc2Zvcm1lclBhdGggPSByZXF1aXJlLnJlc29sdmUoXCJhc3NlbWJseXNjcmlwdC9jbGkvdHJhbnNmb3JtXCIpO1xufVxuY29uc3QgYXNzZW1ibHlzY3JpcHQgPSByZXF1aXJlKGFzc2VtYmx5c2NyaXB0UGF0aCk7XG5cbi8vQHRzLWlnbm9yZVxubW9kdWxlLmV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSh0cmFuc2Zvcm1lclBhdGgpLlRyYW5zZm9ybTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICAgICAgICAgICAgICAgLi4ucmVxdWlyZShhc2NQYXRoKSxcbiAgICAgICAgICAgICAgICAgIC4uLm1vZHVsZS5leHBvcnRzLFxuICAgICAgICAgICAgICAgICAgLi4uYXNzZW1ibHlzY3JpcHQsXG4gICAgICAgICAgICAgICAgICAuLi5hc3NlbWJseXNjcmlwdC51dGlsIC8vIE5lZWQgdG8gYWRkIGJlY2F1c2UgbmV3ZXIgdmVyc2lvbiBhZGRzIG5hbWVzcGFjZVxuICAgICAgICAgICAgICAgIH07Il19 |
| module.exports = { | ||
| preset: "ts-jest", | ||
| testEnvironment: "node", | ||
| testMatch: ["**/*.spec.ts"], | ||
| testPathIgnorePatterns: ["/assembly/", "/node_modules/"], | ||
| }; |
-1672
| // tslint:disable: as-internal-case | ||
| import { | ||
| CharCode, | ||
| CommonFlags, | ||
| TypeNode, | ||
| Node, | ||
| NodeKind, | ||
| Source, | ||
| NamedTypeNode, | ||
| FunctionTypeNode, | ||
| TypeParameterNode, | ||
| IdentifierExpression, | ||
| CallExpression, | ||
| ClassExpression, | ||
| ElementAccessExpression, | ||
| FunctionExpression, | ||
| InstanceOfExpression, | ||
| LiteralExpression, | ||
| NewExpression, | ||
| ParenthesizedExpression, | ||
| PropertyAccessExpression, | ||
| TernaryExpression, | ||
| UnaryPostfixExpression, | ||
| UnaryPrefixExpression, | ||
| BlockStatement, | ||
| BreakStatement, | ||
| ContinueStatement, | ||
| DoStatement, | ||
| EmptyStatement, | ||
| ExportStatement, | ||
| ExportDefaultStatement, | ||
| ExportImportStatement, | ||
| ExpressionStatement, | ||
| ForStatement, | ||
| IfStatement, | ||
| ImportStatement, | ||
| ReturnStatement, | ||
| SwitchStatement, | ||
| ThrowStatement, | ||
| TryStatement, | ||
| VariableStatement, | ||
| WhileStatement, | ||
| ClassDeclaration, | ||
| EnumDeclaration, | ||
| EnumValueDeclaration, | ||
| FieldDeclaration, | ||
| FunctionDeclaration, | ||
| ImportDeclaration, | ||
| IndexSignatureDeclaration, | ||
| InterfaceDeclaration, | ||
| MethodDeclaration, | ||
| NamespaceDeclaration, | ||
| TypeDeclaration, | ||
| VariableDeclaration, | ||
| DecoratorNode, | ||
| ExportMember, | ||
| ParameterNode, | ||
| SwitchCase, | ||
| TypeName, | ||
| ArrayLiteralExpression, | ||
| Expression, | ||
| ObjectLiteralExpression, | ||
| AssertionKind, | ||
| LiteralKind, | ||
| FloatLiteralExpression, | ||
| StringLiteralExpression, | ||
| RegexpLiteralExpression, | ||
| UnaryExpression, | ||
| Statement, | ||
| ArrowKind, | ||
| ParameterKind, | ||
| DeclarationStatement, | ||
| AssertionExpression, | ||
| BinaryExpression, | ||
| CommaExpression, | ||
| IntegerLiteralExpression, | ||
| isTypeOmitted, | ||
| operatorTokenToString, | ||
| indent, | ||
| } from "../as"; | ||
| import { AbstractVisitor } from "./visitor"; | ||
| // declare function i64_to_string(i: I64): string; | ||
| // import { i64_to_string } from "../../../src/glue/i64" | ||
| /** An AST builder. */ | ||
| export class ASTBuilder extends AbstractVisitor<Node> { | ||
| /** Rebuilds the textual source from the specified AST, as far as possible. */ | ||
| static build(node: Node): string { | ||
| var builder = new ASTBuilder(); | ||
| builder.visitNode(node); | ||
| return builder.finish(); | ||
| } | ||
| private sb: string[] = []; | ||
| private indentLevel: i32 = 0; | ||
| _visit(node: Node): void { | ||
| this.visitNode(node); | ||
| } | ||
| visitNode(node: Node): void { | ||
| switch (node.kind) { | ||
| case NodeKind.SOURCE: { | ||
| this.visitSource(<Source>node); | ||
| break; | ||
| } | ||
| // types | ||
| case NodeKind.NAMEDTYPE: { | ||
| this.visitNamedTypeNode(<NamedTypeNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTIONTYPE: { | ||
| this.visitFunctionTypeNode(<FunctionTypeNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.TYPEPARAMETER: { | ||
| this.visitTypeParameter(<TypeParameterNode>node); | ||
| break; | ||
| } | ||
| // expressions | ||
| case NodeKind.FALSE: | ||
| case NodeKind.NULL: | ||
| case NodeKind.SUPER: | ||
| case NodeKind.THIS: | ||
| case NodeKind.TRUE: | ||
| case NodeKind.CONSTRUCTOR: | ||
| case NodeKind.IDENTIFIER: { | ||
| this.visitIdentifierExpression(<IdentifierExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.ASSERTION: { | ||
| this.visitAssertionExpression(<AssertionExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.BINARY: { | ||
| this.visitBinaryExpression(<BinaryExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.CALL: { | ||
| this.visitCallExpression(<CallExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.CLASS: { | ||
| this.visitClassExpression(<ClassExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.COMMA: { | ||
| this.visitCommaExpression(<CommaExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.ELEMENTACCESS: { | ||
| this.visitElementAccessExpression(<ElementAccessExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTION: { | ||
| this.visitFunctionExpression(<FunctionExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.INSTANCEOF: { | ||
| this.visitInstanceOfExpression(<InstanceOfExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.LITERAL: { | ||
| this.visitLiteralExpression(<LiteralExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.NEW: { | ||
| this.visitNewExpression(<NewExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.PARENTHESIZED: { | ||
| this.visitParenthesizedExpression(<ParenthesizedExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.PROPERTYACCESS: { | ||
| this.visitPropertyAccessExpression(<PropertyAccessExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.TERNARY: { | ||
| this.visitTernaryExpression(<TernaryExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.UNARYPOSTFIX: { | ||
| this.visitUnaryPostfixExpression(<UnaryPostfixExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.UNARYPREFIX: { | ||
| this.visitUnaryPrefixExpression(<UnaryPrefixExpression>node); | ||
| break; | ||
| } | ||
| // statements | ||
| case NodeKind.BLOCK: { | ||
| this.visitBlockStatement(<BlockStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.BREAK: { | ||
| this.visitBreakStatement(<BreakStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.CONTINUE: { | ||
| this.visitContinueStatement(<ContinueStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.DO: { | ||
| this.visitDoStatement(<DoStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EMPTY: { | ||
| this.visitEmptyStatement(<EmptyStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORT: { | ||
| this.visitExportStatement(<ExportStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORTDEFAULT: { | ||
| this.visitExportDefaultStatement(<ExportDefaultStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORTIMPORT: { | ||
| this.visitExportImportStatement(<ExportImportStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPRESSION: { | ||
| this.visitExpressionStatement(<ExpressionStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.FOR: { | ||
| this.visitForStatement(<ForStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.IF: { | ||
| this.visitIfStatement(<IfStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.IMPORT: { | ||
| this.visitImportStatement(<ImportStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.RETURN: { | ||
| this.visitReturnStatement(<ReturnStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.SWITCH: { | ||
| this.visitSwitchStatement(<SwitchStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.THROW: { | ||
| this.visitThrowStatement(<ThrowStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.TRY: { | ||
| this.visitTryStatement(<TryStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.VARIABLE: { | ||
| this.visitVariableStatement(<VariableStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.WHILE: { | ||
| this.visitWhileStatement(<WhileStatement>node); | ||
| break; | ||
| } | ||
| // declaration statements | ||
| case NodeKind.CLASSDECLARATION: { | ||
| this.visitClassDeclaration(<ClassDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.ENUMDECLARATION: { | ||
| this.visitEnumDeclaration(<EnumDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.ENUMVALUEDECLARATION: { | ||
| this.visitEnumValueDeclaration(<EnumValueDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.FIELDDECLARATION: { | ||
| this.visitFieldDeclaration(<FieldDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTIONDECLARATION: { | ||
| this.visitFunctionDeclaration(<FunctionDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.IMPORTDECLARATION: { | ||
| this.visitImportDeclaration(<ImportDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.INDEXSIGNATUREDECLARATION: { | ||
| this.visitIndexSignatureDeclaration(<IndexSignatureDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.INTERFACEDECLARATION: { | ||
| this.visitInterfaceDeclaration(<InterfaceDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.METHODDECLARATION: { | ||
| this.visitMethodDeclaration(<MethodDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.NAMESPACEDECLARATION: { | ||
| this.visitNamespaceDeclaration(<NamespaceDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.TYPEDECLARATION: { | ||
| this.visitTypeDeclaration(<TypeDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.VARIABLEDECLARATION: { | ||
| this.visitVariableDeclaration(<VariableDeclaration>node); | ||
| break; | ||
| } | ||
| // other | ||
| case NodeKind.DECORATOR: { | ||
| this.serializeDecorator(<DecoratorNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORTMEMBER: { | ||
| this.visitExportMember(<ExportMember>node); | ||
| break; | ||
| } | ||
| case NodeKind.PARAMETER: { | ||
| this.serializeParameter(<ParameterNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.SWITCHCASE: { | ||
| this.visitSwitchCase(<SwitchCase>node); | ||
| break; | ||
| } | ||
| default: | ||
| assert(false); | ||
| } | ||
| } | ||
| visitSource(source: Source): void { | ||
| var statements = source.statements; | ||
| for (let i = 0, k = statements.length; i < k; ++i) { | ||
| this.visitNodeAndTerminate(statements[i]); | ||
| } | ||
| } | ||
| // types | ||
| visitTypeNode(node: TypeNode): void { | ||
| switch (node.kind) { | ||
| case NodeKind.NAMEDTYPE: { | ||
| this.visitNamedTypeNode(<NamedTypeNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTIONTYPE: { | ||
| this.visitFunctionTypeNode(<FunctionTypeNode>node); | ||
| break; | ||
| } | ||
| default: | ||
| assert(false); | ||
| } | ||
| } | ||
| visitTypeName(node: TypeName): void { | ||
| this.visitIdentifierExpression(node.identifier); | ||
| var sb = this.sb; | ||
| var current = node.next; | ||
| while (current) { | ||
| sb.push("."); | ||
| this.visitIdentifierExpression(current.identifier); | ||
| current = current.next; | ||
| } | ||
| } | ||
| visitNamedTypeNode(node: NamedTypeNode): void { | ||
| this.visitTypeName(node.name); | ||
| var typeArguments = node.typeArguments; | ||
| if (typeArguments) { | ||
| let numTypeArguments = typeArguments.length; | ||
| let sb = this.sb; | ||
| if (numTypeArguments) { | ||
| sb.push("<"); | ||
| this.visitTypeNode(typeArguments[0]); | ||
| for (let i = 1; i < numTypeArguments; ++i) { | ||
| sb.push(", "); | ||
| this.visitTypeNode(typeArguments[i]); | ||
| } | ||
| sb.push(">"); | ||
| } | ||
| if (node.isNullable) sb.push(" | null"); | ||
| } | ||
| } | ||
| visitFunctionTypeNode(node: FunctionTypeNode): void { | ||
| var isNullable = node.isNullable; | ||
| var sb = this.sb; | ||
| sb.push(isNullable ? "((" : "("); | ||
| var explicitThisType = node.explicitThisType; | ||
| if (explicitThisType) { | ||
| sb.push("this: "); | ||
| this.visitTypeNode(explicitThisType); | ||
| } | ||
| var parameters = node.parameters; | ||
| var numParameters = parameters.length; | ||
| if (numParameters) { | ||
| if (explicitThisType) sb.push(", "); | ||
| this.serializeParameter(parameters[0]); | ||
| for (let i = 1; i < numParameters; ++i) { | ||
| sb.push(", "); | ||
| this.serializeParameter(parameters[i]); | ||
| } | ||
| } | ||
| var returnType = node.returnType; | ||
| if (returnType) { | ||
| sb.push(") => "); | ||
| this.visitTypeNode(returnType); | ||
| } else { | ||
| sb.push(") => void"); | ||
| } | ||
| if (isNullable) sb.push(") | null"); | ||
| } | ||
| visitTypeParameter(node: TypeParameterNode): void { | ||
| this.visitIdentifierExpression(node.name); | ||
| var extendsType = node.extendsType; | ||
| if (extendsType) { | ||
| this.sb.push(" extends "); | ||
| this.visitTypeNode(extendsType); | ||
| } | ||
| var defaultType = node.defaultType; | ||
| if (defaultType) { | ||
| this.sb.push("="); | ||
| this.visitTypeNode(defaultType); | ||
| } | ||
| } | ||
| // expressions | ||
| visitIdentifierExpression(node: IdentifierExpression): void { | ||
| if (node.isQuoted) this.visitStringLiteral(node.text); | ||
| else this.sb.push(node.text); | ||
| } | ||
| visitArrayLiteralExpression(node: ArrayLiteralExpression): void { | ||
| var sb = this.sb; | ||
| sb.push("["); | ||
| var elements = node.elementExpressions; | ||
| var numElements = elements.length; | ||
| if (numElements) { | ||
| if (elements[0]) this.visitNode(<Expression>elements[0]); | ||
| for (let i = 1; i < numElements; ++i) { | ||
| sb.push(", "); | ||
| if (elements[i]) this.visitNode(<Expression>elements[i]); | ||
| } | ||
| } | ||
| sb.push("]"); | ||
| } | ||
| visitObjectLiteralExpression(node: ObjectLiteralExpression): void { | ||
| var sb = this.sb; | ||
| var names = node.names; | ||
| var values = node.values; | ||
| var numElements = names.length; | ||
| assert(numElements == values.length); | ||
| if (numElements) { | ||
| sb.push("{\n"); | ||
| indent(sb, ++this.indentLevel); | ||
| this.visitNode(names[0]); | ||
| sb.push(": "); | ||
| this.visitNode(values[0]); | ||
| for (let i = 1; i < numElements; ++i) { | ||
| sb.push(",\n"); | ||
| indent(sb, this.indentLevel); | ||
| let name = names[i]; | ||
| let value = values[i]; | ||
| if (name === value) { | ||
| this.visitNode(name); | ||
| } else { | ||
| this.visitNode(name); | ||
| sb.push(": "); | ||
| this.visitNode(value); | ||
| } | ||
| } | ||
| sb.push("\n"); | ||
| indent(sb, --this.indentLevel); | ||
| sb.push("}"); | ||
| } else { | ||
| sb.push("{}"); | ||
| } | ||
| } | ||
| visitAssertionExpression(node: AssertionExpression): void { | ||
| var sb = this.sb; | ||
| switch (node.assertionKind) { | ||
| case AssertionKind.PREFIX: { | ||
| sb.push("<"); | ||
| this.visitTypeNode(assert(node.toType)); | ||
| sb.push(">"); | ||
| this.visitNode(node.expression); | ||
| break; | ||
| } | ||
| case AssertionKind.AS: { | ||
| this.visitNode(node.expression); | ||
| sb.push(" as "); | ||
| this.visitTypeNode(assert(node.toType)); | ||
| break; | ||
| } | ||
| case AssertionKind.NONNULL: { | ||
| this.visitNode(node.expression); | ||
| sb.push("!"); | ||
| break; | ||
| } | ||
| default: | ||
| assert(false); | ||
| } | ||
| } | ||
| visitBinaryExpression(node: BinaryExpression): void { | ||
| var sb = this.sb; | ||
| this.visitNode(node.left); | ||
| sb.push(" "); | ||
| sb.push(operatorTokenToString(node.operator)); | ||
| sb.push(" "); | ||
| this.visitNode(node.right); | ||
| } | ||
| visitCallExpression(node: CallExpression): void { | ||
| var sb = this.sb; | ||
| this.visitNode(node.expression); | ||
| var typeArguments = node.typeArguments; | ||
| if (typeArguments) { | ||
| let numTypeArguments = typeArguments.length; | ||
| if (numTypeArguments) { | ||
| sb.push("<"); | ||
| this.visitTypeNode(typeArguments[0]); | ||
| for (let i = 1; i < numTypeArguments; ++i) { | ||
| sb.push(", "); | ||
| this.visitTypeNode(typeArguments[i]); | ||
| } | ||
| sb.push(">("); | ||
| } | ||
| } else { | ||
| sb.push("("); | ||
| } | ||
| var args = node.arguments; | ||
| var numArgs = args.length; | ||
| if (numArgs) { | ||
| this.visitNode(args[0]); | ||
| for (let i = 1; i < numArgs; ++i) { | ||
| sb.push(", "); | ||
| this.visitNode(args[i]); | ||
| } | ||
| } | ||
| sb.push(")"); | ||
| } | ||
| private visitArguments( | ||
| typeArguments: TypeNode[] | null, | ||
| args: Expression[] | ||
| ): void { | ||
| var sb = this.sb; | ||
| if (typeArguments) { | ||
| let numTypeArguments = typeArguments.length; | ||
| if (numTypeArguments) { | ||
| sb.push("<"); | ||
| this.visitTypeNode(typeArguments[0]); | ||
| for (let i = 1; i < numTypeArguments; ++i) { | ||
| sb.push(", "); | ||
| this.visitTypeNode(typeArguments[i]); | ||
| } | ||
| sb.push(">("); | ||
| } | ||
| } else { | ||
| sb.push("("); | ||
| } | ||
| var numArgs = args.length; | ||
| if (numArgs) { | ||
| this.visitNode(args[0]); | ||
| for (let i = 1; i < numArgs; ++i) { | ||
| sb.push(", "); | ||
| this.visitNode(args[i]); | ||
| } | ||
| } | ||
| sb.push(")"); | ||
| } | ||
| visitClassExpression(node: ClassExpression): void { | ||
| var declaration = node.declaration; | ||
| this.visitClassDeclaration(declaration); | ||
| } | ||
| visitCommaExpression(node: CommaExpression): void { | ||
| var expressions = node.expressions; | ||
| var numExpressions = assert(expressions.length); | ||
| this.visitNode(expressions[0]); | ||
| var sb = this.sb; | ||
| for (let i = 1; i < numExpressions; ++i) { | ||
| sb.push(","); | ||
| this.visitNode(expressions[i]); | ||
| } | ||
| } | ||
| visitElementAccessExpression(node: ElementAccessExpression): void { | ||
| var sb = this.sb; | ||
| this.visitNode(node.expression); | ||
| sb.push("["); | ||
| this.visitNode(node.elementExpression); | ||
| sb.push("]"); | ||
| } | ||
| visitFunctionExpression(node: FunctionExpression): void { | ||
| var declaration = node.declaration; | ||
| if (!declaration.arrowKind) { | ||
| if (declaration.name.text.length) { | ||
| this.sb.push("function "); | ||
| } else { | ||
| this.sb.push("function"); | ||
| } | ||
| } else { | ||
| assert(declaration.name.text.length == 0); | ||
| } | ||
| this.visitFunctionCommon(declaration); | ||
| } | ||
| visitLiteralExpression(node: LiteralExpression): void { | ||
| switch (node.literalKind) { | ||
| case LiteralKind.FLOAT: { | ||
| this.visitFloatLiteralExpression(<FloatLiteralExpression>node); | ||
| break; | ||
| } | ||
| case LiteralKind.INTEGER: { | ||
| this.visitIntegerLiteralExpression(<IntegerLiteralExpression>node); | ||
| break; | ||
| } | ||
| case LiteralKind.STRING: { | ||
| this.visitStringLiteralExpression(<StringLiteralExpression>node); | ||
| break; | ||
| } | ||
| case LiteralKind.REGEXP: { | ||
| this.visitRegexpLiteralExpression(<RegexpLiteralExpression>node); | ||
| break; | ||
| } | ||
| case LiteralKind.ARRAY: { | ||
| this.visitArrayLiteralExpression(<ArrayLiteralExpression>node); | ||
| break; | ||
| } | ||
| case LiteralKind.OBJECT: { | ||
| this.visitObjectLiteralExpression(<ObjectLiteralExpression>node); | ||
| break; | ||
| } | ||
| default: { | ||
| assert(false); | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| visitFloatLiteralExpression(node: FloatLiteralExpression): void { | ||
| this.sb.push(node.value.toString(10)); | ||
| } | ||
| visitInstanceOfExpression(node: InstanceOfExpression): void { | ||
| this.visitNode(node.expression); | ||
| this.sb.push(" instanceof "); | ||
| this.visitTypeNode(node.isType); | ||
| } | ||
| visitIntegerLiteralExpression(node: IntegerLiteralExpression): void { | ||
| this.sb.push(i64_to_string(node.value)); | ||
| } | ||
| visitStringLiteral(str: string, singleQuoted: bool = false): void { | ||
| var sb = this.sb; | ||
| var off = 0; | ||
| var quote = singleQuoted ? "'" : '"'; | ||
| sb.push(quote); | ||
| var i = 0; | ||
| for (let k = str.length; i < k; ) { | ||
| switch (str.charCodeAt(i)) { | ||
| case CharCode.NULL: { | ||
| if (i > off) sb.push(str.substring(off, (off = i + 1))); | ||
| sb.push("\\0"); | ||
| off = ++i; | ||
| break; | ||
| } | ||
| case CharCode.BACKSPACE: { | ||
| if (i > off) sb.push(str.substring(off, i)); | ||
| off = ++i; | ||
| sb.push("\\b"); | ||
| break; | ||
| } | ||
| case CharCode.TAB: { | ||
| if (i > off) sb.push(str.substring(off, i)); | ||
| off = ++i; | ||
| sb.push("\\t"); | ||
| break; | ||
| } | ||
| case CharCode.LINEFEED: { | ||
| if (i > off) sb.push(str.substring(off, i)); | ||
| off = ++i; | ||
| sb.push("\\n"); | ||
| break; | ||
| } | ||
| case CharCode.VERTICALTAB: { | ||
| if (i > off) sb.push(str.substring(off, i)); | ||
| off = ++i; | ||
| sb.push("\\v"); | ||
| break; | ||
| } | ||
| case CharCode.FORMFEED: { | ||
| if (i > off) sb.push(str.substring(off, i)); | ||
| off = ++i; | ||
| sb.push("\\f"); | ||
| break; | ||
| } | ||
| case CharCode.CARRIAGERETURN: { | ||
| if (i > off) sb.push(str.substring(off, i)); | ||
| sb.push("\\r"); | ||
| off = ++i; | ||
| break; | ||
| } | ||
| case CharCode.DOUBLEQUOTE: { | ||
| if (!singleQuoted) { | ||
| if (i > off) sb.push(str.substring(off, i)); | ||
| sb.push('\\"'); | ||
| off = ++i; | ||
| } else { | ||
| ++i; | ||
| } | ||
| break; | ||
| } | ||
| case CharCode.SINGLEQUOTE: { | ||
| if (singleQuoted) { | ||
| if (i > off) sb.push(str.substring(off, i)); | ||
| sb.push("\\'"); | ||
| off = ++i; | ||
| } else { | ||
| ++i; | ||
| } | ||
| break; | ||
| } | ||
| case CharCode.BACKSLASH: { | ||
| if (i > off) sb.push(str.substring(off, i)); | ||
| sb.push("\\\\"); | ||
| off = ++i; | ||
| break; | ||
| } | ||
| default: { | ||
| ++i; | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| if (i > off) sb.push(str.substring(off, i)); | ||
| sb.push(quote); | ||
| } | ||
| visitStringLiteralExpression(node: StringLiteralExpression): void { | ||
| this.visitStringLiteral(node.value); | ||
| } | ||
| visitRegexpLiteralExpression(node: RegexpLiteralExpression): void { | ||
| var sb = this.sb; | ||
| sb.push("/"); | ||
| sb.push(node.pattern); | ||
| sb.push("/"); | ||
| sb.push(node.patternFlags); | ||
| } | ||
| visitNewExpression(node: NewExpression): void { | ||
| this.sb.push("new "); | ||
| this.visitTypeName(node.typeName); | ||
| this.visitArguments(node.typeArguments, node.arguments); | ||
| } | ||
| visitParenthesizedExpression(node: ParenthesizedExpression): void { | ||
| var sb = this.sb; | ||
| sb.push("("); | ||
| this.visitNode(node.expression); | ||
| sb.push(")"); | ||
| } | ||
| visitPropertyAccessExpression(node: PropertyAccessExpression): void { | ||
| this.visitNode(node.expression); | ||
| this.sb.push("."); | ||
| this.visitIdentifierExpression(node.property); | ||
| } | ||
| visitTernaryExpression(node: TernaryExpression): void { | ||
| var sb = this.sb; | ||
| this.visitNode(node.condition); | ||
| sb.push(" ? "); | ||
| this.visitNode(node.ifThen); | ||
| sb.push(" : "); | ||
| this.visitNode(node.ifElse); | ||
| } | ||
| visitUnaryExpression(node: UnaryExpression): void { | ||
| switch (node.kind) { | ||
| case NodeKind.UNARYPOSTFIX: { | ||
| this.visitUnaryPostfixExpression(<UnaryPostfixExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.UNARYPREFIX: { | ||
| this.visitUnaryPrefixExpression(<UnaryPrefixExpression>node); | ||
| break; | ||
| } | ||
| default: | ||
| assert(false); | ||
| } | ||
| } | ||
| visitUnaryPostfixExpression(node: UnaryPostfixExpression): void { | ||
| this.visitNode(node.operand); | ||
| this.sb.push(operatorTokenToString(node.operator)); | ||
| } | ||
| visitUnaryPrefixExpression(node: UnaryPrefixExpression): void { | ||
| this.sb.push(operatorTokenToString(node.operator)); | ||
| this.visitNode(node.operand); | ||
| } | ||
| // statements | ||
| visitNodeAndTerminate(statement: Statement): void { | ||
| this.visitNode(statement); | ||
| var sb = this.sb; | ||
| if ( | ||
| !sb.length || // leading EmptyStatement | ||
| statement.kind == NodeKind.VARIABLE || // potentially assigns a FunctionExpression | ||
| statement.kind == NodeKind.EXPRESSION // potentially assigns a FunctionExpression | ||
| ) { | ||
| sb.push(";\n"); | ||
| } else { | ||
| let last = sb[sb.length - 1]; | ||
| let lastCharPos = last.length - 1; | ||
| if ( | ||
| lastCharPos >= 0 && | ||
| (last.charCodeAt(lastCharPos) == CharCode.CLOSEBRACE || | ||
| last.charCodeAt(lastCharPos) == CharCode.SEMICOLON) | ||
| ) { | ||
| sb.push("\n"); | ||
| } else { | ||
| sb.push(";\n"); | ||
| } | ||
| } | ||
| } | ||
| visitBlockStatement(node: BlockStatement): void { | ||
| var sb = this.sb; | ||
| var statements = node.statements; | ||
| var numStatements = statements.length; | ||
| if (numStatements) { | ||
| sb.push("{\n"); | ||
| let indentLevel = ++this.indentLevel; | ||
| for (let i = 0; i < numStatements; ++i) { | ||
| indent(sb, indentLevel); | ||
| this.visitNodeAndTerminate(statements[i]); | ||
| } | ||
| indent(sb, --this.indentLevel); | ||
| sb.push("}"); | ||
| } else { | ||
| sb.push("{}"); | ||
| } | ||
| } | ||
| visitBreakStatement(node: BreakStatement): void { | ||
| var label = node.label; | ||
| if (label) { | ||
| this.sb.push("break "); | ||
| this.visitIdentifierExpression(label); | ||
| } else { | ||
| this.sb.push("break"); | ||
| } | ||
| } | ||
| visitContinueStatement(node: ContinueStatement): void { | ||
| var label = node.label; | ||
| if (label) { | ||
| this.sb.push("continue "); | ||
| this.visitIdentifierExpression(label); | ||
| } else { | ||
| this.sb.push("continue"); | ||
| } | ||
| } | ||
| visitClassDeclaration(node: ClassDeclaration, isDefault: bool = false): void { | ||
| var decorators = node.decorators; | ||
| if (decorators) { | ||
| for (let i = 0, k = decorators.length; i < k; ++i) { | ||
| this.serializeDecorator(decorators[i]); | ||
| } | ||
| } | ||
| var sb = this.sb; | ||
| if (isDefault) { | ||
| sb.push("export default "); | ||
| } else { | ||
| this.serializeExternalModifiers(node); | ||
| } | ||
| if (node.is(CommonFlags.ABSTRACT)) sb.push("abstract "); | ||
| if (node.name.text.length) { | ||
| sb.push("class "); | ||
| this.visitIdentifierExpression(node.name); | ||
| } else { | ||
| sb.push("class"); | ||
| } | ||
| var typeParameters = node.typeParameters; | ||
| if (typeParameters && typeParameters.length) { | ||
| sb.push("<"); | ||
| this.visitTypeParameter(typeParameters[0]); | ||
| for (let i = 1, k = typeParameters.length; i < k; ++i) { | ||
| sb.push(", "); | ||
| this.visitTypeParameter(typeParameters[i]); | ||
| } | ||
| sb.push(">"); | ||
| } | ||
| var extendsType = node.extendsType; | ||
| if (extendsType) { | ||
| sb.push(" extends "); | ||
| this.visitTypeNode(extendsType); | ||
| } | ||
| var implementsTypes = node.implementsTypes; | ||
| if (implementsTypes) { | ||
| let numImplementsTypes = implementsTypes.length; | ||
| if (numImplementsTypes) { | ||
| sb.push(" implements "); | ||
| this.visitTypeNode(implementsTypes[0]); | ||
| for (let i = 1; i < numImplementsTypes; ++i) { | ||
| sb.push(", "); | ||
| this.visitTypeNode(implementsTypes[i]); | ||
| } | ||
| } | ||
| } | ||
| var members = node.members; | ||
| var numMembers = members.length; | ||
| if (numMembers) { | ||
| sb.push(" {\n"); | ||
| let indentLevel = ++this.indentLevel; | ||
| for (let i = 0, k = members.length; i < k; ++i) { | ||
| let member = members[i]; | ||
| if ( | ||
| member.kind != NodeKind.FIELDDECLARATION || | ||
| (<FieldDeclaration>member).parameterIndex < 0 | ||
| ) { | ||
| indent(sb, indentLevel); | ||
| this.visitNodeAndTerminate(member); | ||
| } | ||
| } | ||
| indent(sb, --this.indentLevel); | ||
| sb.push("}"); | ||
| } else { | ||
| sb.push(" {}"); | ||
| } | ||
| } | ||
| visitDoStatement(node: DoStatement): void { | ||
| var sb = this.sb; | ||
| sb.push("do "); | ||
| this.visitNode(node.statement); | ||
| if (node.statement.kind == NodeKind.BLOCK) { | ||
| sb.push(" while ("); | ||
| } else { | ||
| sb.push(";\n"); | ||
| indent(sb, this.indentLevel); | ||
| sb.push("while ("); | ||
| } | ||
| this.visitNode(node.condition); | ||
| sb.push(")"); | ||
| } | ||
| visitEmptyStatement(node: EmptyStatement): void {} | ||
| visitEnumDeclaration(node: EnumDeclaration, isDefault: bool = false): void { | ||
| var sb = this.sb; | ||
| if (isDefault) { | ||
| sb.push("export default "); | ||
| } else { | ||
| this.serializeExternalModifiers(node); | ||
| } | ||
| if (node.is(CommonFlags.CONST)) sb.push("const "); | ||
| sb.push("enum "); | ||
| this.visitIdentifierExpression(node.name); | ||
| var values = node.values; | ||
| var numValues = values.length; | ||
| if (numValues) { | ||
| sb.push(" {\n"); | ||
| let indentLevel = ++this.indentLevel; | ||
| indent(sb, indentLevel); | ||
| this.visitEnumValueDeclaration(node.values[0]); | ||
| for (let i = 1; i < numValues; ++i) { | ||
| sb.push(",\n"); | ||
| indent(sb, indentLevel); | ||
| this.visitEnumValueDeclaration(node.values[i]); | ||
| } | ||
| sb.push("\n"); | ||
| indent(sb, --this.indentLevel); | ||
| sb.push("}"); | ||
| } else { | ||
| sb.push(" {}"); | ||
| } | ||
| } | ||
| visitEnumValueDeclaration(node: EnumValueDeclaration): void { | ||
| this.visitIdentifierExpression(node.name); | ||
| if (node.value) { | ||
| this.sb.push(" = "); | ||
| this.visitNode(node.value); | ||
| } | ||
| } | ||
| visitExportImportStatement(node: ExportImportStatement): void { | ||
| var sb = this.sb; | ||
| sb.push("export import "); | ||
| this.visitIdentifierExpression(node.externalName); | ||
| sb.push(" = "); | ||
| this.visitIdentifierExpression(node.name); | ||
| } | ||
| visitExportMember(node: ExportMember): void { | ||
| this.visitIdentifierExpression(node.localName); | ||
| if (node.exportedName.text != node.localName.text) { | ||
| this.sb.push(" as "); | ||
| this.visitIdentifierExpression(node.exportedName); | ||
| } | ||
| } | ||
| visitExportStatement(node: ExportStatement): void { | ||
| var sb = this.sb; | ||
| if (node.isDeclare) { | ||
| sb.push("declare "); | ||
| } | ||
| var members = node.members; | ||
| if (members && members.length) { | ||
| let numMembers = members.length; | ||
| sb.push("export {\n"); | ||
| let indentLevel = ++this.indentLevel; | ||
| indent(sb, indentLevel); | ||
| this.visitExportMember(members[0]); | ||
| for (let i = 1; i < numMembers; ++i) { | ||
| sb.push(",\n"); | ||
| indent(sb, indentLevel); | ||
| this.visitExportMember(members[i]); | ||
| } | ||
| --this.indentLevel; | ||
| sb.push("\n}"); | ||
| } else { | ||
| sb.push("export {}"); | ||
| } | ||
| var path = node.path; | ||
| if (path) { | ||
| sb.push(" from "); | ||
| this.visitStringLiteralExpression(path); | ||
| } | ||
| sb.push(";"); | ||
| } | ||
| visitExportDefaultStatement(node: ExportDefaultStatement): void { | ||
| var declaration = node.declaration; | ||
| switch (declaration.kind) { | ||
| case NodeKind.ENUMDECLARATION: { | ||
| this.visitEnumDeclaration(<EnumDeclaration>declaration, true); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTIONDECLARATION: { | ||
| this.visitFunctionDeclaration(<FunctionDeclaration>declaration, true); | ||
| break; | ||
| } | ||
| case NodeKind.CLASSDECLARATION: { | ||
| this.visitClassDeclaration(<ClassDeclaration>declaration, true); | ||
| break; | ||
| } | ||
| case NodeKind.INTERFACEDECLARATION: { | ||
| this.visitInterfaceDeclaration(<InterfaceDeclaration>declaration, true); | ||
| break; | ||
| } | ||
| case NodeKind.NAMESPACEDECLARATION: { | ||
| this.visitNamespaceDeclaration(<NamespaceDeclaration>declaration, true); | ||
| break; | ||
| } | ||
| default: | ||
| assert(false); | ||
| } | ||
| } | ||
| visitExpressionStatement(node: ExpressionStatement): void { | ||
| this.visitNode(node.expression); | ||
| } | ||
| visitFieldDeclaration(node: FieldDeclaration): void { | ||
| var decorators = node.decorators; | ||
| if (decorators) { | ||
| for (let i = 0, k = decorators.length; i < k; ++i) { | ||
| this.serializeDecorator(decorators[i]); | ||
| } | ||
| } | ||
| this.serializeAccessModifiers(node); | ||
| this.visitIdentifierExpression(node.name); | ||
| var sb = this.sb; | ||
| if (node.flags & CommonFlags.DEFINITE_ASSIGNMENT) { | ||
| sb.push("!"); | ||
| } | ||
| var type = node.type; | ||
| if (type) { | ||
| sb.push(": "); | ||
| this.visitTypeNode(type); | ||
| } | ||
| var initializer = node.initializer; | ||
| if (initializer) { | ||
| sb.push(" = "); | ||
| this.visitNode(initializer); | ||
| } | ||
| } | ||
| visitForStatement(node: ForStatement): void { | ||
| var sb = this.sb; | ||
| sb.push("for ("); | ||
| var initializer = node.initializer; | ||
| if (initializer) { | ||
| this.visitNode(initializer); | ||
| } | ||
| var condition = node.condition; | ||
| if (condition) { | ||
| sb.push("; "); | ||
| this.visitNode(condition); | ||
| } else { | ||
| sb.push(";"); | ||
| } | ||
| var incrementor = node.incrementor; | ||
| if (incrementor) { | ||
| sb.push("; "); | ||
| this.visitNode(incrementor); | ||
| } else { | ||
| sb.push(";"); | ||
| } | ||
| sb.push(") "); | ||
| this.visitNode(node.statement); | ||
| } | ||
| visitFunctionDeclaration( | ||
| node: FunctionDeclaration, | ||
| isDefault: bool = false | ||
| ): void { | ||
| var sb = this.sb; | ||
| var decorators = node.decorators; | ||
| if (decorators) { | ||
| for (let i = 0, k = decorators.length; i < k; ++i) { | ||
| this.serializeDecorator(decorators[i]); | ||
| } | ||
| } | ||
| if (isDefault) { | ||
| sb.push("export default "); | ||
| } else { | ||
| this.serializeExternalModifiers(node); | ||
| this.serializeAccessModifiers(node); | ||
| } | ||
| if (node.name.text.length) { | ||
| sb.push("function "); | ||
| } else { | ||
| sb.push("function"); | ||
| } | ||
| this.visitFunctionCommon(node); | ||
| } | ||
| visitFunctionCommon(node: FunctionDeclaration): void { | ||
| var sb = this.sb; | ||
| this.visitIdentifierExpression(node.name); | ||
| var signature = node.signature; | ||
| var typeParameters = node.typeParameters; | ||
| if (typeParameters) { | ||
| let numTypeParameters = typeParameters.length; | ||
| if (numTypeParameters) { | ||
| sb.push("<"); | ||
| this.visitTypeParameter(typeParameters[0]); | ||
| for (let i = 1; i < numTypeParameters; ++i) { | ||
| sb.push(", "); | ||
| this.visitTypeParameter(typeParameters[i]); | ||
| } | ||
| sb.push(">"); | ||
| } | ||
| } | ||
| if (node.arrowKind == ArrowKind.ARROW_SINGLE) { | ||
| let parameters = signature.parameters; | ||
| assert(parameters.length == 1); | ||
| assert(!signature.explicitThisType); | ||
| this.serializeParameter(parameters[0]); | ||
| } else { | ||
| sb.push("("); | ||
| let parameters = signature.parameters; | ||
| let numParameters = parameters.length; | ||
| let explicitThisType = signature.explicitThisType; | ||
| if (explicitThisType) { | ||
| sb.push("this: "); | ||
| this.visitTypeNode(explicitThisType); | ||
| } | ||
| if (numParameters) { | ||
| if (explicitThisType) sb.push(", "); | ||
| this.serializeParameter(parameters[0]); | ||
| for (let i = 1; i < numParameters; ++i) { | ||
| sb.push(", "); | ||
| this.serializeParameter(parameters[i]); | ||
| } | ||
| } | ||
| } | ||
| var body = node.body; | ||
| var returnType = signature.returnType; | ||
| if (node.arrowKind) { | ||
| if (body) { | ||
| if (node.arrowKind == ArrowKind.ARROW_SINGLE) { | ||
| assert(isTypeOmitted(returnType)); | ||
| } else { | ||
| if (isTypeOmitted(returnType)) { | ||
| sb.push(")"); | ||
| } else { | ||
| sb.push("): "); | ||
| this.visitTypeNode(returnType); | ||
| } | ||
| } | ||
| sb.push(" => "); | ||
| this.visitNode(body); | ||
| } else { | ||
| assert(!isTypeOmitted(returnType)); | ||
| sb.push(" => "); | ||
| this.visitTypeNode(returnType); | ||
| } | ||
| } else { | ||
| if ( | ||
| !isTypeOmitted(returnType) && | ||
| !node.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.SET) | ||
| ) { | ||
| sb.push("): "); | ||
| this.visitTypeNode(returnType); | ||
| } else { | ||
| sb.push(")"); | ||
| } | ||
| if (body) { | ||
| sb.push(" "); | ||
| this.visitNode(body); | ||
| } | ||
| } | ||
| } | ||
| visitIfStatement(node: IfStatement): void { | ||
| var sb = this.sb; | ||
| sb.push("if ("); | ||
| this.visitNode(node.condition); | ||
| sb.push(") "); | ||
| var ifTrue = node.ifTrue; | ||
| this.visitNode(ifTrue); | ||
| if (ifTrue.kind != NodeKind.BLOCK) { | ||
| sb.push(";\n"); | ||
| } | ||
| var ifFalse = node.ifFalse; | ||
| if (ifFalse) { | ||
| if (ifTrue.kind == NodeKind.BLOCK) { | ||
| sb.push(" else "); | ||
| } else { | ||
| sb.push("else "); | ||
| } | ||
| this.visitNode(ifFalse); | ||
| } | ||
| } | ||
| visitImportDeclaration(node: ImportDeclaration): void { | ||
| var externalName = node.foreignName; | ||
| var name = node.name; | ||
| this.visitIdentifierExpression(externalName); | ||
| if (externalName.text != name.text) { | ||
| this.sb.push(" as "); | ||
| this.visitIdentifierExpression(name); | ||
| } | ||
| } | ||
| visitImportStatement(node: ImportStatement): void { | ||
| var sb = this.sb; | ||
| sb.push("import "); | ||
| var declarations = node.declarations; | ||
| var namespaceName = node.namespaceName; | ||
| if (declarations) { | ||
| let numDeclarations = declarations.length; | ||
| if (numDeclarations) { | ||
| sb.push("{\n"); | ||
| let indentLevel = ++this.indentLevel; | ||
| indent(sb, indentLevel); | ||
| this.visitImportDeclaration(declarations[0]); | ||
| for (let i = 1; i < numDeclarations; ++i) { | ||
| sb.push(",\n"); | ||
| indent(sb, indentLevel); | ||
| this.visitImportDeclaration(declarations[i]); | ||
| } | ||
| --this.indentLevel; | ||
| sb.push("\n} from "); | ||
| } else { | ||
| sb.push("{} from "); | ||
| } | ||
| } else if (namespaceName) { | ||
| sb.push("* as "); | ||
| this.visitIdentifierExpression(namespaceName); | ||
| sb.push(" from "); | ||
| } | ||
| this.visitStringLiteralExpression(node.path); | ||
| } | ||
| visitIndexSignatureDeclaration(node: IndexSignatureDeclaration): void { | ||
| var sb = this.sb; | ||
| sb.push("[key: "); | ||
| this.visitTypeNode(node.keyType); | ||
| sb.push("]: "); | ||
| this.visitTypeNode(node.valueType); | ||
| } | ||
| visitInterfaceDeclaration( | ||
| node: InterfaceDeclaration, | ||
| isDefault: bool = false | ||
| ): void { | ||
| var decorators = node.decorators; | ||
| if (decorators) { | ||
| for (let i = 0, k = decorators.length; i < k; ++i) { | ||
| this.serializeDecorator(decorators[i]); | ||
| } | ||
| } | ||
| var sb = this.sb; | ||
| if (isDefault) { | ||
| sb.push("export default "); | ||
| } else { | ||
| this.serializeExternalModifiers(node); | ||
| } | ||
| sb.push("interface "); | ||
| this.visitIdentifierExpression(node.name); | ||
| var typeParameters = node.typeParameters; | ||
| if (typeParameters && typeParameters.length) { | ||
| sb.push("<"); | ||
| this.visitTypeParameter(typeParameters[0]); | ||
| for (let i = 1, k = typeParameters.length; i < k; ++i) { | ||
| sb.push(", "); | ||
| this.visitTypeParameter(typeParameters[i]); | ||
| } | ||
| sb.push(">"); | ||
| } | ||
| var extendsType = node.extendsType; | ||
| if (extendsType) { | ||
| sb.push(" extends "); | ||
| this.visitTypeNode(extendsType); | ||
| } | ||
| // must not have implementsTypes | ||
| sb.push(" {\n"); | ||
| var indentLevel = ++this.indentLevel; | ||
| var members = node.members; | ||
| for (let i = 0, k = members.length; i < k; ++i) { | ||
| indent(sb, indentLevel); | ||
| this.visitNodeAndTerminate(members[i]); | ||
| } | ||
| --this.indentLevel; | ||
| sb.push("}"); | ||
| } | ||
| visitMethodDeclaration(node: MethodDeclaration): void { | ||
| var decorators = node.decorators; | ||
| if (decorators) { | ||
| for (let i = 0, k = decorators.length; i < k; ++i) { | ||
| this.serializeDecorator(decorators[i]); | ||
| } | ||
| } | ||
| this.serializeAccessModifiers(node); | ||
| if (node.is(CommonFlags.GET)) { | ||
| this.sb.push("get "); | ||
| } else if (node.is(CommonFlags.SET)) { | ||
| this.sb.push("set "); | ||
| } | ||
| this.visitFunctionCommon(node); | ||
| } | ||
| visitNamespaceDeclaration( | ||
| node: NamespaceDeclaration, | ||
| isDefault: bool = false | ||
| ): void { | ||
| var decorators = node.decorators; | ||
| if (decorators) { | ||
| for (let i = 0, k = decorators.length; i < k; ++i) { | ||
| this.serializeDecorator(decorators[i]); | ||
| } | ||
| } | ||
| var sb = this.sb; | ||
| if (isDefault) { | ||
| sb.push("export default "); | ||
| } else { | ||
| this.serializeExternalModifiers(node); | ||
| } | ||
| sb.push("namespace "); | ||
| this.visitIdentifierExpression(node.name); | ||
| var members = node.members; | ||
| var numMembers = members.length; | ||
| if (numMembers) { | ||
| sb.push(" {\n"); | ||
| let indentLevel = ++this.indentLevel; | ||
| for (let i = 0, k = members.length; i < k; ++i) { | ||
| indent(sb, indentLevel); | ||
| this.visitNodeAndTerminate(members[i]); | ||
| } | ||
| indent(sb, --this.indentLevel); | ||
| sb.push("}"); | ||
| } else { | ||
| sb.push(" {}"); | ||
| } | ||
| } | ||
| visitReturnStatement(node: ReturnStatement): void { | ||
| var value = node.value; | ||
| if (value) { | ||
| this.sb.push("return "); | ||
| this.visitNode(value); | ||
| } else { | ||
| this.sb.push("return"); | ||
| } | ||
| } | ||
| visitSwitchCase(node: SwitchCase): void { | ||
| var sb = this.sb; | ||
| var label = node.label; | ||
| if (label) { | ||
| sb.push("case "); | ||
| this.visitNode(label); | ||
| sb.push(":\n"); | ||
| } else { | ||
| sb.push("default:\n"); | ||
| } | ||
| var statements = node.statements; | ||
| var numStatements = statements.length; | ||
| if (numStatements) { | ||
| let indentLevel = ++this.indentLevel; | ||
| indent(sb, indentLevel); | ||
| this.visitNodeAndTerminate(statements[0]); | ||
| for (let i = 1; i < numStatements; ++i) { | ||
| indent(sb, indentLevel); | ||
| this.visitNodeAndTerminate(statements[i]); | ||
| } | ||
| --this.indentLevel; | ||
| } | ||
| } | ||
| visitSwitchStatement(node: SwitchStatement): void { | ||
| var sb = this.sb; | ||
| sb.push("switch ("); | ||
| this.visitNode(node.condition); | ||
| sb.push(") {\n"); | ||
| var indentLevel = ++this.indentLevel; | ||
| var cases = node.cases; | ||
| for (let i = 0, k = cases.length; i < k; ++i) { | ||
| indent(sb, indentLevel); | ||
| this.visitSwitchCase(cases[i]); | ||
| sb.push("\n"); | ||
| } | ||
| --this.indentLevel; | ||
| sb.push("}"); | ||
| } | ||
| visitThrowStatement(node: ThrowStatement): void { | ||
| this.sb.push("throw "); | ||
| this.visitNode(node.value); | ||
| } | ||
| visitTryStatement(node: TryStatement): void { | ||
| var sb = this.sb; | ||
| sb.push("try {\n"); | ||
| var indentLevel = ++this.indentLevel; | ||
| var statements = node.statements; | ||
| for (let i = 0, k = statements.length; i < k; ++i) { | ||
| indent(sb, indentLevel); | ||
| this.visitNodeAndTerminate(statements[i]); | ||
| } | ||
| var catchVariable = node.catchVariable; | ||
| if (catchVariable) { | ||
| indent(sb, indentLevel - 1); | ||
| sb.push("} catch ("); | ||
| this.visitIdentifierExpression(catchVariable); | ||
| sb.push(") {\n"); | ||
| let catchStatements = node.catchStatements; | ||
| if (catchStatements) { | ||
| for (let i = 0, k = catchStatements.length; i < k; ++i) { | ||
| indent(sb, indentLevel); | ||
| this.visitNodeAndTerminate(catchStatements[i]); | ||
| } | ||
| } | ||
| } | ||
| var finallyStatements = node.finallyStatements; | ||
| if (finallyStatements) { | ||
| indent(sb, indentLevel - 1); | ||
| sb.push("} finally {\n"); | ||
| for (let i = 0, k = finallyStatements.length; i < k; ++i) { | ||
| indent(sb, indentLevel); | ||
| this.visitNodeAndTerminate(finallyStatements[i]); | ||
| } | ||
| } | ||
| indent(sb, indentLevel - 1); | ||
| sb.push("}"); | ||
| } | ||
| visitTypeDeclaration(node: TypeDeclaration): void { | ||
| var decorators = node.decorators; | ||
| if (decorators) { | ||
| for (let i = 0, k = decorators.length; i < k; ++i) { | ||
| this.serializeDecorator(decorators[i]); | ||
| } | ||
| } | ||
| var sb = this.sb; | ||
| this.serializeExternalModifiers(node); | ||
| sb.push("type "); | ||
| this.visitIdentifierExpression(node.name); | ||
| var typeParameters = node.typeParameters; | ||
| if (typeParameters) { | ||
| let numTypeParameters = typeParameters.length; | ||
| if (numTypeParameters) { | ||
| sb.push("<"); | ||
| for (let i = 0; i < numTypeParameters; ++i) { | ||
| this.visitTypeParameter(typeParameters[i]); | ||
| } | ||
| sb.push(">"); | ||
| } | ||
| } | ||
| sb.push(" = "); | ||
| this.visitTypeNode(node.type); | ||
| } | ||
| visitVariableDeclaration(node: VariableDeclaration): void { | ||
| this.visitIdentifierExpression(node.name); | ||
| var type = node.type; | ||
| var sb = this.sb; | ||
| if (node.flags & CommonFlags.DEFINITE_ASSIGNMENT) { | ||
| sb.push("!"); | ||
| } | ||
| if (type) { | ||
| sb.push(": "); | ||
| this.visitTypeNode(type); | ||
| } | ||
| var initializer = node.initializer; | ||
| if (initializer) { | ||
| sb.push(" = "); | ||
| this.visitNode(initializer); | ||
| } | ||
| } | ||
| visitVariableStatement(node: VariableStatement): void { | ||
| var decorators = node.decorators; | ||
| if (decorators) { | ||
| for (let i = 0, k = decorators.length; i < k; ++i) { | ||
| this.serializeDecorator(decorators[i]); | ||
| } | ||
| } | ||
| var sb = this.sb; | ||
| var declarations = node.declarations; | ||
| var numDeclarations = assert(declarations.length); | ||
| var firstDeclaration = declarations[0]; | ||
| this.serializeExternalModifiers(firstDeclaration); | ||
| sb.push( | ||
| firstDeclaration.is(CommonFlags.CONST) | ||
| ? "const " | ||
| : firstDeclaration.is(CommonFlags.LET) | ||
| ? "let " | ||
| : "var " | ||
| ); | ||
| this.visitVariableDeclaration(node.declarations[0]); | ||
| for (let i = 1; i < numDeclarations; ++i) { | ||
| sb.push(", "); | ||
| this.visitVariableDeclaration(node.declarations[i]); | ||
| } | ||
| } | ||
| visitWhileStatement(node: WhileStatement): void { | ||
| var sb = this.sb; | ||
| sb.push("while ("); | ||
| this.visitNode(node.condition); | ||
| var statement = node.statement; | ||
| if (statement.kind == NodeKind.EMPTY) { | ||
| sb.push(")"); | ||
| } else { | ||
| sb.push(") "); | ||
| this.visitNode(node.statement); | ||
| } | ||
| } | ||
| // other | ||
| serializeDecorator(node: DecoratorNode): void { | ||
| var sb = this.sb; | ||
| sb.push("@"); | ||
| this.visitNode(node.name); | ||
| var args = node.arguments; | ||
| if (args) { | ||
| sb.push("("); | ||
| let numArgs = args.length; | ||
| if (numArgs) { | ||
| this.visitNode(args[0]); | ||
| for (let i = 1; i < numArgs; ++i) { | ||
| sb.push(", "); | ||
| this.visitNode(args[i]); | ||
| } | ||
| } | ||
| sb.push(")\n"); | ||
| } else { | ||
| sb.push("\n"); | ||
| } | ||
| indent(sb, this.indentLevel); | ||
| } | ||
| serializeParameter(node: ParameterNode): void { | ||
| var sb = this.sb; | ||
| var kind = node.parameterKind; | ||
| var implicitFieldDeclaration = node.implicitFieldDeclaration; | ||
| if (implicitFieldDeclaration) { | ||
| this.serializeAccessModifiers(implicitFieldDeclaration); | ||
| } | ||
| if (kind == ParameterKind.REST) { | ||
| sb.push("..."); | ||
| } | ||
| this.visitIdentifierExpression(node.name); | ||
| var type = node.type; | ||
| var initializer = node.initializer; | ||
| if (type) { | ||
| if (kind == ParameterKind.OPTIONAL && !initializer) sb.push("?"); | ||
| if (!isTypeOmitted(type)) { | ||
| sb.push(": "); | ||
| this.visitTypeNode(type); | ||
| } | ||
| } | ||
| if (initializer) { | ||
| sb.push(" = "); | ||
| this.visitNode(initializer); | ||
| } | ||
| } | ||
| serializeExternalModifiers(node: DeclarationStatement): void { | ||
| var sb = this.sb; | ||
| if (node.is(CommonFlags.EXPORT)) { | ||
| sb.push("export "); | ||
| } else if (node.is(CommonFlags.IMPORT)) { | ||
| sb.push("import "); | ||
| } else if (node.is(CommonFlags.DECLARE)) { | ||
| sb.push("declare "); | ||
| } | ||
| } | ||
| serializeAccessModifiers(node: DeclarationStatement): void { | ||
| var sb = this.sb; | ||
| if (node.is(CommonFlags.PUBLIC)) { | ||
| sb.push("public "); | ||
| } else if (node.is(CommonFlags.PRIVATE)) { | ||
| sb.push("private "); | ||
| } else if (node.is(CommonFlags.PROTECTED)) { | ||
| sb.push("protected "); | ||
| } | ||
| if (node.is(CommonFlags.STATIC)) { | ||
| sb.push("static "); | ||
| } else if (node.is(CommonFlags.ABSTRACT)) { | ||
| sb.push("abstract "); | ||
| } | ||
| if (node.is(CommonFlags.READONLY)) { | ||
| sb.push("readonly "); | ||
| } | ||
| } | ||
| finish(): string { | ||
| var ret = this.sb.join(""); | ||
| this.sb = []; | ||
| return ret; | ||
| } | ||
| } |
-756
| import { | ||
| Node, | ||
| NodeKind, | ||
| Source, | ||
| NamedTypeNode, | ||
| FunctionTypeNode, | ||
| TypeName, | ||
| TypeParameterNode, | ||
| IdentifierExpression, | ||
| AssertionExpression, | ||
| BinaryExpression, | ||
| CallExpression, | ||
| ClassExpression, | ||
| CommaExpression, | ||
| ElementAccessExpression, | ||
| FunctionExpression, | ||
| InstanceOfExpression, | ||
| LiteralExpression, | ||
| NewExpression, | ||
| ParenthesizedExpression, | ||
| PropertyAccessExpression, | ||
| TernaryExpression, | ||
| UnaryPostfixExpression, | ||
| UnaryPrefixExpression, | ||
| BlockStatement, | ||
| BreakStatement, | ||
| ContinueStatement, | ||
| DoStatement, | ||
| EmptyStatement, | ||
| ExportStatement, | ||
| ExportDefaultStatement, | ||
| ExportImportStatement, | ||
| ExpressionStatement, | ||
| ForStatement, | ||
| IfStatement, | ||
| ImportStatement, | ||
| ReturnStatement, | ||
| SwitchStatement, | ||
| ThrowStatement, | ||
| TryStatement, | ||
| VariableStatement, | ||
| WhileStatement, | ||
| ClassDeclaration, | ||
| EnumDeclaration, | ||
| EnumValueDeclaration, | ||
| FieldDeclaration, | ||
| FunctionDeclaration, | ||
| ImportDeclaration, | ||
| IndexSignatureDeclaration, | ||
| InterfaceDeclaration, | ||
| MethodDeclaration, | ||
| NamespaceDeclaration, | ||
| TypeDeclaration, | ||
| VariableDeclaration, | ||
| DecoratorNode, | ||
| ExportMember, | ||
| ParameterNode, | ||
| SwitchCase, | ||
| TypeNode, | ||
| ArrayLiteralExpression, | ||
| Expression, | ||
| ObjectLiteralExpression, | ||
| FloatLiteralExpression, | ||
| IntegerLiteralExpression, | ||
| StringLiteralExpression, | ||
| RegexpLiteralExpression, | ||
| UnaryExpression, | ||
| SuperExpression, | ||
| FalseExpression, | ||
| TrueExpression, | ||
| ThisExpression, | ||
| NullExpression, | ||
| ConstructorExpression, | ||
| Statement, | ||
| VoidStatement, | ||
| LiteralKind, | ||
| CommentNode, | ||
| } from "../as"; | ||
| import { AbstractVisitor } from "./visitor"; | ||
| export class BaseVisitor extends AbstractVisitor<Node> { | ||
| depth: number = 0; | ||
| _visit(node: Node): void { | ||
| switch (node.kind) { | ||
| case NodeKind.SOURCE: { | ||
| this.visitSource(<Source>node); | ||
| break; | ||
| } | ||
| // types | ||
| case NodeKind.NAMEDTYPE: { | ||
| this.visitNamedTypeNode(<NamedTypeNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTIONTYPE: { | ||
| this.visitFunctionTypeNode(<FunctionTypeNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.TYPENAME: { | ||
| this.visitTypeName(<TypeName>node); | ||
| } | ||
| case NodeKind.TYPEPARAMETER: { | ||
| this.visitTypeParameter(<TypeParameterNode>node); | ||
| break; | ||
| } | ||
| // expressions | ||
| case NodeKind.FALSE: | ||
| case NodeKind.NULL: | ||
| case NodeKind.SUPER: | ||
| case NodeKind.THIS: | ||
| case NodeKind.TRUE: | ||
| case NodeKind.CONSTRUCTOR: | ||
| case NodeKind.IDENTIFIER: { | ||
| this.visitIdentifierExpression(<IdentifierExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.ASSERTION: { | ||
| this.visitAssertionExpression(<AssertionExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.BINARY: { | ||
| this.visitBinaryExpression(<BinaryExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.CALL: { | ||
| this.visitCallExpression(<CallExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.CLASS: { | ||
| this.visitClassExpression(<ClassExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.COMMA: { | ||
| this.visitCommaExpression(<CommaExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.ELEMENTACCESS: { | ||
| this.visitElementAccessExpression(<ElementAccessExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTION: { | ||
| this.visitFunctionExpression(<FunctionExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.INSTANCEOF: { | ||
| this.visitInstanceOfExpression(<InstanceOfExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.LITERAL: { | ||
| this.visitLiteralExpression(<LiteralExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.NEW: { | ||
| this.visitNewExpression(<NewExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.PARENTHESIZED: { | ||
| this.visitParenthesizedExpression(<ParenthesizedExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.PROPERTYACCESS: { | ||
| this.visitPropertyAccessExpression(<PropertyAccessExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.TERNARY: { | ||
| this.visitTernaryExpression(<TernaryExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.UNARYPOSTFIX: { | ||
| this.visitUnaryPostfixExpression(<UnaryPostfixExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.UNARYPREFIX: { | ||
| this.visitUnaryPrefixExpression(<UnaryPrefixExpression>node); | ||
| break; | ||
| } | ||
| // statements | ||
| case NodeKind.BLOCK: { | ||
| this.visitBlockStatement(<BlockStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.BREAK: { | ||
| this.visitBreakStatement(<BreakStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.CONTINUE: { | ||
| this.visitContinueStatement(<ContinueStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.DO: { | ||
| this.visitDoStatement(<DoStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EMPTY: { | ||
| this.visitEmptyStatement(<EmptyStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORT: { | ||
| this.visitExportStatement(<ExportStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORTDEFAULT: { | ||
| this.visitExportDefaultStatement(<ExportDefaultStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORTIMPORT: { | ||
| this.visitExportImportStatement(<ExportImportStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPRESSION: { | ||
| this.visitExpressionStatement(<ExpressionStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.FOR: { | ||
| this.visitForStatement(<ForStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.IF: { | ||
| this.visitIfStatement(<IfStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.IMPORT: { | ||
| this.visitImportStatement(<ImportStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.RETURN: { | ||
| this.visitReturnStatement(<ReturnStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.SWITCH: { | ||
| this.visitSwitchStatement(<SwitchStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.THROW: { | ||
| this.visitThrowStatement(<ThrowStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.TRY: { | ||
| this.visitTryStatement(<TryStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.VARIABLE: { | ||
| this.visitVariableStatement(<VariableStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.WHILE: { | ||
| this.visitWhileStatement(<WhileStatement>node); | ||
| break; | ||
| } | ||
| // declaration statements | ||
| case NodeKind.CLASSDECLARATION: { | ||
| this.visitClassDeclaration(<ClassDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.ENUMDECLARATION: { | ||
| this.visitEnumDeclaration(<EnumDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.ENUMVALUEDECLARATION: { | ||
| this.visitEnumValueDeclaration(<EnumValueDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.FIELDDECLARATION: { | ||
| this.visitFieldDeclaration(<FieldDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTIONDECLARATION: { | ||
| this.visitFunctionDeclaration(<FunctionDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.IMPORTDECLARATION: { | ||
| this.visitImportDeclaration(<ImportDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.INDEXSIGNATUREDECLARATION: { | ||
| this.visitIndexSignatureDeclaration(<IndexSignatureDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.INTERFACEDECLARATION: { | ||
| this.visitInterfaceDeclaration(<InterfaceDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.METHODDECLARATION: { | ||
| this.visitMethodDeclaration(<MethodDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.NAMESPACEDECLARATION: { | ||
| this.visitNamespaceDeclaration(<NamespaceDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.TYPEDECLARATION: { | ||
| this.visitTypeDeclaration(<TypeDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.VARIABLEDECLARATION: { | ||
| this.visitVariableDeclaration(<VariableDeclaration>node); | ||
| break; | ||
| } | ||
| // other | ||
| case NodeKind.DECORATOR: { | ||
| this.visitDecoratorNode(<DecoratorNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORTMEMBER: { | ||
| this.visitExportMember(<ExportMember>node); | ||
| break; | ||
| } | ||
| case NodeKind.PARAMETER: { | ||
| this.visitParameter(<ParameterNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.SWITCHCASE: { | ||
| this.visitSwitchCase(<SwitchCase>node); | ||
| break; | ||
| } | ||
| default: | ||
| assert(false); | ||
| } | ||
| } | ||
| visitSource(node: Source): void { | ||
| for (const stmt of node.statements) { | ||
| this.depth++; | ||
| this.visit(stmt); | ||
| this.depth--; | ||
| } | ||
| } | ||
| visitTypeNode(node: TypeNode): void {} | ||
| visitTypeName(node: TypeName): void { | ||
| this.visit(node.identifier); | ||
| if (node.next) { | ||
| this.visit(node.next); | ||
| } | ||
| } | ||
| visitNamedTypeNode(node: NamedTypeNode): void { | ||
| this.visit(node.name); | ||
| this.visit(node.typeArguments); | ||
| } | ||
| visitFunctionTypeNode(node: FunctionTypeNode): void { | ||
| for (let param of node.parameters) { | ||
| this.visitParameter(param); | ||
| } | ||
| this.visit(node.returnType); | ||
| } | ||
| visitTypeParameter(node: TypeParameterNode): void { | ||
| this.visit(node.name); | ||
| if (node.extendsType) this.visit(node.extendsType); | ||
| if (node.defaultType) this.visit(node.defaultType); | ||
| } | ||
| visitIdentifierExpression(node: IdentifierExpression): void {} | ||
| visitArrayLiteralExpression(node: ArrayLiteralExpression): void { | ||
| node.elementExpressions.map((e: Expression) => { | ||
| if (e) this.visit(e); | ||
| }); | ||
| } | ||
| visitObjectLiteralExpression(node: ObjectLiteralExpression): void { | ||
| if (node.values && node.names) { | ||
| assert(node.values.length == node.names.length); | ||
| for (let i = 0; i < node.values.length; i++) { | ||
| this.visit(node.names[i]); | ||
| this.visit(node.values[i]); | ||
| } | ||
| } | ||
| } | ||
| visitAssertionExpression(node: AssertionExpression): void { | ||
| if (node.toType) this.visit(node.toType); | ||
| this.visit(node.expression); | ||
| } | ||
| visitBinaryExpression(node: BinaryExpression): void { | ||
| this.visit(node.left); | ||
| this.visit(node.right); | ||
| } | ||
| visitCallExpression(node: CallExpression): void { | ||
| this.visit(node.expression); | ||
| this.visit(node.typeArguments); | ||
| this.visit(node.arguments); | ||
| } | ||
| visitClassExpression(node: ClassExpression): void { | ||
| this.visit(node.declaration); | ||
| } | ||
| visitCommaExpression(node: CommaExpression): void { | ||
| this.visit(node.expressions); | ||
| } | ||
| visitElementAccessExpression(node: ElementAccessExpression): void { | ||
| this.visit(node.elementExpression); | ||
| this.visit(node.expression); | ||
| } | ||
| visitFunctionExpression(node: FunctionExpression): void { | ||
| this.visit(node.declaration); | ||
| } | ||
| visitLiteralExpression(node: LiteralExpression): void { | ||
| switch (node.literalKind) { | ||
| case LiteralKind.ARRAY: { | ||
| this.visitArrayLiteralExpression(<ArrayLiteralExpression>node); | ||
| break; | ||
| } | ||
| case LiteralKind.FLOAT: { | ||
| this.visitFloatLiteralExpression(<FloatLiteralExpression>node); | ||
| break; | ||
| } | ||
| case LiteralKind.INTEGER: { | ||
| this.visitIntegerLiteralExpression(<IntegerLiteralExpression>node); | ||
| break; | ||
| } | ||
| case LiteralKind.OBJECT: { | ||
| this.visitObjectLiteralExpression(<ObjectLiteralExpression>node); | ||
| break; | ||
| } | ||
| case LiteralKind.REGEXP: { | ||
| this.visitRegexpLiteralExpression(<RegexpLiteralExpression>node); | ||
| break; | ||
| } | ||
| case LiteralKind.STRING: { | ||
| this.visitStringLiteralExpression(<StringLiteralExpression>node); | ||
| break; | ||
| } | ||
| default: | ||
| throw new Error("Invalid LiteralKind: " + node.literalKind); | ||
| } | ||
| } | ||
| visitFloatLiteralExpression(node: FloatLiteralExpression): void {} | ||
| visitInstanceOfExpression(node: InstanceOfExpression): void { | ||
| this.visit(node.expression); | ||
| this.visit(node.isType); | ||
| } | ||
| visitIntegerLiteralExpression(node: IntegerLiteralExpression): void {} | ||
| visitStringLiteral(str: string, singleQuoted?: boolean): void {} | ||
| visitStringLiteralExpression(node: StringLiteralExpression): void {} | ||
| visitRegexpLiteralExpression(node: RegexpLiteralExpression): void {} | ||
| visitNewExpression(node: NewExpression): void { | ||
| this.visit(node.typeArguments); | ||
| this.visit(node.arguments); | ||
| } | ||
| visitParenthesizedExpression(node: ParenthesizedExpression): void { | ||
| this.visit(node.expression); | ||
| } | ||
| visitPropertyAccessExpression(node: PropertyAccessExpression): void { | ||
| this.visit(node.property); | ||
| this.visit(node.expression); | ||
| } | ||
| visitTernaryExpression(node: TernaryExpression): void { | ||
| this.visit(node.condition); | ||
| this.visit(node.ifThen); | ||
| this.visit(node.ifElse); | ||
| } | ||
| visitUnaryExpression(node: UnaryExpression): void { | ||
| this.visit(node.operand); | ||
| } | ||
| visitUnaryPostfixExpression(node: UnaryPostfixExpression): void { | ||
| this.visit(node.operand); | ||
| } | ||
| visitUnaryPrefixExpression(node: UnaryPrefixExpression): void { | ||
| this.visit(node.operand); | ||
| } | ||
| visitSuperExpression(node: SuperExpression): void {} | ||
| visitFalseExpression(node: FalseExpression): void {} | ||
| visitTrueExpression(node: TrueExpression): void {} | ||
| visitThisExpression(node: ThisExpression): void {} | ||
| visitNullExperssion(node: NullExpression): void {} | ||
| visitConstructorExpression(node: ConstructorExpression): void {} | ||
| visitNodeAndTerminate(statement: Statement): void {} | ||
| visitBlockStatement(node: BlockStatement): void { | ||
| this.depth++; | ||
| this.visit(node.statements); | ||
| this.depth--; | ||
| } | ||
| visitBreakStatement(node: BreakStatement): void { | ||
| if (node.label) { | ||
| this.visit(node.label); | ||
| } | ||
| } | ||
| visitContinueStatement(node: ContinueStatement): void { | ||
| if (node.label) { | ||
| this.visit(node.label); | ||
| } | ||
| } | ||
| visitClassDeclaration(node: ClassDeclaration, isDefault?: boolean): void { | ||
| this.visit(node.name); | ||
| this.depth++; | ||
| this.visit(node.decorators); | ||
| assert( | ||
| node.isGeneric ? node.typeParameters != null : node.typeParameters == null | ||
| ); | ||
| if (node.isGeneric) { | ||
| this.visit(node.typeParameters); | ||
| } | ||
| if (node.extendsType) { | ||
| this.visit(node.extendsType); | ||
| } | ||
| this.visit(node.implementsTypes); | ||
| this.visit(node.members); | ||
| this.depth--; | ||
| } | ||
| visitDoStatement(node: DoStatement): void { | ||
| this.visit(node.condition); | ||
| this.visit(node.statement); | ||
| } | ||
| visitEmptyStatement(node: EmptyStatement): void {} | ||
| visitEnumDeclaration(node: EnumDeclaration, isDefault?: boolean): void { | ||
| this.visit(node.name); | ||
| this.visit(node.decorators); | ||
| this.visit(node.values); | ||
| } | ||
| visitEnumValueDeclaration(node: EnumValueDeclaration): void { | ||
| this.visit(node.name); | ||
| if (node.initializer) { | ||
| this.visit(node.initializer); | ||
| } | ||
| } | ||
| visitExportImportStatement(node: ExportImportStatement): void { | ||
| this.visit(node.name); | ||
| this.visit(node.externalName); | ||
| } | ||
| visitExportMember(node: ExportMember): void { | ||
| this.visit(node.localName); | ||
| this.visit(node.exportedName); | ||
| } | ||
| visitExportStatement(node: ExportStatement): void { | ||
| if (node.path) { | ||
| this.visit(node.path); | ||
| } | ||
| this.visit(node.members); | ||
| } | ||
| visitExportDefaultStatement(node: ExportDefaultStatement): void { | ||
| this.visit(node.declaration); | ||
| } | ||
| visitExpressionStatement(node: ExpressionStatement): void { | ||
| this.visit(node.expression); | ||
| } | ||
| visitFieldDeclaration(node: FieldDeclaration): void { | ||
| this.visit(node.name); | ||
| if (node.type) { | ||
| this.visit(node.type); | ||
| } | ||
| if (node.initializer) { | ||
| this.visit(node.initializer); | ||
| } | ||
| this.visit(node.decorators); | ||
| } | ||
| visitForStatement(node: ForStatement): void { | ||
| if (node.initializer) this.visit(node.initializer); | ||
| if (node.condition) this.visit(node.condition); | ||
| if (node.incrementor) this.visit(node.incrementor); | ||
| this.visit(node.statement); | ||
| } | ||
| visitFunctionDeclaration( | ||
| node: FunctionDeclaration, | ||
| isDefault?: boolean | ||
| ): void { | ||
| this.visit(node.name); | ||
| this.visit(node.decorators); | ||
| if (node.isGeneric) { | ||
| this.visit(node.typeParameters); | ||
| } | ||
| this.visit(node.signature); | ||
| this.depth++; | ||
| if (node.body) this.visit(node.body); | ||
| this.depth--; | ||
| } | ||
| visitFunctionCommon(node: FunctionDeclaration): void { | ||
| // this.visit(node.name) | ||
| } | ||
| visitIfStatement(node: IfStatement): void { | ||
| this.visit(node.condition); | ||
| this.visit(node.ifTrue); | ||
| if (node.ifFalse) this.visit(node.ifFalse); | ||
| } | ||
| visitImportDeclaration(node: ImportDeclaration): void { | ||
| this.visit(node.foreignName); | ||
| this.visit(node.name); | ||
| this.visit(node.decorators); | ||
| } | ||
| visitImportStatement(node: ImportStatement): void { | ||
| if (node.namespaceName) this.visit(node.namespaceName); | ||
| this.visit(node.declarations); | ||
| } | ||
| visitIndexSignatureDeclaration(node: IndexSignatureDeclaration): void { | ||
| // this.visit(node.name); | ||
| // this.visit(node.keyType); | ||
| // this.visit(node.valueType); | ||
| } | ||
| visitInterfaceDeclaration( | ||
| node: InterfaceDeclaration, | ||
| isDefault?: boolean | ||
| ): void { | ||
| this.visit(node.name); | ||
| if (node.isGeneric) { | ||
| this.visit(node.typeParameters); | ||
| } | ||
| this.visit(node.implementsTypes); | ||
| if (node.extendsType) this.visit(node.extendsType); | ||
| this.depth++; | ||
| this.visit(node.members); | ||
| this.depth--; | ||
| } | ||
| visitMethodDeclaration(node: MethodDeclaration): void { | ||
| this.visit(node.name); | ||
| if (node.isGeneric) { | ||
| this.visit(node.typeParameters); | ||
| } | ||
| this.visit(node.signature); | ||
| this.visit(node.decorators); | ||
| this.depth++; | ||
| if (node.body) this.visit(node.body); | ||
| this.depth--; | ||
| } | ||
| visitNamespaceDeclaration( | ||
| node: NamespaceDeclaration, | ||
| isDefault?: boolean | ||
| ): void { | ||
| this.visit(node.name); | ||
| this.visit(node.decorators); | ||
| this.visit(node.members); | ||
| } | ||
| visitReturnStatement(node: ReturnStatement): void { | ||
| if (node.value) this.visit(node.value); | ||
| } | ||
| visitSwitchCase(node: SwitchCase): void { | ||
| if (node.label) this.visit(node.label); | ||
| this.visit(node.statements); | ||
| } | ||
| visitSwitchStatement(node: SwitchStatement): void { | ||
| this.visit(node.condition); | ||
| this.depth++; | ||
| this.visit(node.cases); | ||
| this.depth--; | ||
| } | ||
| visitThrowStatement(node: ThrowStatement): void { | ||
| this.visit(node.value); | ||
| } | ||
| visitTryStatement(node: TryStatement): void { | ||
| this.visit(node.statements); | ||
| if (node.catchVariable) this.visit(node.catchVariable); | ||
| this.visit(node.catchStatements); | ||
| this.visit(node.finallyStatements); | ||
| } | ||
| visitTypeDeclaration(node: TypeDeclaration): void { | ||
| this.visit(node.name); | ||
| this.visit(node.decorators); | ||
| this.visit(node.type); | ||
| this.visit(node.typeParameters); | ||
| } | ||
| visitVariableDeclaration(node: VariableDeclaration): void { | ||
| this.visit(node.name); | ||
| if (node.type) this.visit(node.type); | ||
| if (node.initializer) this.visit(node.initializer); | ||
| } | ||
| visitVariableStatement(node: VariableStatement): void { | ||
| this.visit(node.decorators); | ||
| this.visit(node.declarations); | ||
| } | ||
| visitWhileStatement(node: WhileStatement): void { | ||
| this.visit(node.condition); | ||
| this.depth++; | ||
| this.visit(node.statement); | ||
| this.depth--; | ||
| } | ||
| visitVoidStatement(node: VoidStatement): void {} | ||
| visitComment(node: CommentNode): void {} | ||
| visitDecoratorNode(node: DecoratorNode): void { | ||
| this.visit(node.name); | ||
| this.visit(node.arguments); | ||
| } | ||
| visitParameter(node: ParameterNode): void { | ||
| this.visit(node.name); | ||
| if (node.implicitFieldDeclaration) { | ||
| this.visit(node.implicitFieldDeclaration); | ||
| } | ||
| if (node.initializer) this.visit(node.initializer); | ||
| this.visit(node.type); | ||
| } | ||
| } |
| import { PathTransformVisitor, mergeTransformer } from "./transformer"; | ||
| import { | ||
| ClassDeclaration, | ||
| FieldDeclaration, | ||
| MethodDeclaration, | ||
| Parser, | ||
| DeclarationStatement, | ||
| VariableDeclaration, | ||
| FunctionDeclaration, | ||
| Source, | ||
| Transform, | ||
| Node, | ||
| DecoratorNode, | ||
| } from "../as"; | ||
| import { decorates, not, isLibrary } from "./utils"; | ||
| export function registerDecorator(decorator: DecoratorVisitor) { | ||
| TopLevelDecorator.registerVisitor(decorator); | ||
| return TopLevelDecorator; | ||
| } | ||
| interface DecoratorVisitor extends PathTransformVisitor { | ||
| name: string; | ||
| sourceFilter: (s: Source) => bool; | ||
| } | ||
| export class TopLevelDecorator extends PathTransformVisitor { | ||
| private static _visitor: DecoratorVisitor; | ||
| static registerVisitor(visitor: DecoratorVisitor): void { | ||
| TopLevelDecorator._visitor = visitor; | ||
| } | ||
| private get visitor(): DecoratorVisitor { | ||
| return TopLevelDecorator._visitor; | ||
| } | ||
| visitDecoratorNode(node: DecoratorNode) { | ||
| if (decorates(node, this.visitor.name)) { | ||
| this.visitor.currentPath = this.cuerrentParentPath; | ||
| this.visitor.visit(this.currentParent); | ||
| } | ||
| } | ||
| afterParse(_: Parser): void { | ||
| mergeTransformer(this, this.visitor); | ||
| this.visit(this.program.sources.filter(this.visitor.sourceFilter)); | ||
| } | ||
| } | ||
| export abstract class Decorator extends PathTransformVisitor { | ||
| /** | ||
| * Default filter that | ||
| */ | ||
| get sourceFilter(): (s: Source) => bool { | ||
| return not(isLibrary); | ||
| } | ||
| abstract get name(): string; | ||
| } | ||
| export abstract class ClassDecorator extends Decorator { | ||
| abstract visitFieldDeclaration(node: FieldDeclaration): void; | ||
| abstract visitMethodDeclaration(node: MethodDeclaration): void; | ||
| abstract visitClassDeclaration(node: ClassDeclaration): void; | ||
| } | ||
| export abstract class FunctionDecorator extends Decorator { | ||
| abstract visitFunctionDeclaration(node: FunctionDeclaration): void; | ||
| } | ||
| export abstract class VariableDecorator extends Decorator { | ||
| abstract visitVariableDeclaration(node: VariableDeclaration): void; | ||
| } |
| import { cloneNode } from "../utils"; | ||
| import { VariableDecorator, registerDecorator } from "../decorator"; | ||
| import { StringLiteralExpression, VariableDeclaration } from "../../as"; | ||
| class CapitalizeVisitor extends VariableDecorator { | ||
| visitVariableDeclaration(node: VariableDeclaration): void { | ||
| this.visit(node.initializer); | ||
| } | ||
| get name(): string { | ||
| return "capitalize"; | ||
| } | ||
| visitStringLiteralExpression(node: StringLiteralExpression): void { | ||
| const newNode = cloneNode(node); | ||
| newNode.value = node.value.toUpperCase(); | ||
| this.replaceCurrentNode(newNode); | ||
| this.stdout.write(node.value + " -> " + newNode.value + "\n"); | ||
| } | ||
| } | ||
| export = registerDecorator(new CapitalizeVisitor()); |
| import { | ||
| ClassDeclaration, | ||
| FieldDeclaration, | ||
| MethodDeclaration, | ||
| } from "../../as"; | ||
| import { ClassDecorator, registerDecorator } from "../decorator"; | ||
| import { toString } from "../utils"; | ||
| class ListMembers extends ClassDecorator { | ||
| visitFieldDeclaration(node: FieldDeclaration): void { | ||
| if (!node.name) console.log(toString(node) + "\n"); | ||
| const name = toString(node.name); | ||
| const _type = toString(node.type!); | ||
| this.stdout.write(name + ": " + _type + "\n"); | ||
| } | ||
| visitMethodDeclaration(node: MethodDeclaration): void { | ||
| const name = toString(node.name); | ||
| if (name == "constructor") { | ||
| return; | ||
| } | ||
| const sig = toString(node.signature); | ||
| this.stdout.write(name + ": " + sig + "\n"); | ||
| } | ||
| visitClassDeclaration(node: ClassDeclaration): void { | ||
| this.visit(node.members); | ||
| } | ||
| get name(): string { | ||
| return "list"; | ||
| } | ||
| } | ||
| export = registerDecorator(new ListMembers()); |
-10
| export * from "./base"; | ||
| export * from "./transformer"; | ||
| export * from "./visitor"; | ||
| export * from "./astBuilder"; | ||
| export * from "./decorator"; | ||
| export * from "./path"; | ||
| import * as utils from "./utils"; | ||
| export { utils }; |
-368
| import { | ||
| Node, | ||
| NodeKind, | ||
| Source, | ||
| NamedTypeNode, | ||
| FunctionTypeNode, | ||
| TypeName, | ||
| TypeParameterNode, | ||
| IdentifierExpression, | ||
| AssertionExpression, | ||
| BinaryExpression, | ||
| CallExpression, | ||
| ClassExpression, | ||
| CommaExpression, | ||
| ElementAccessExpression, | ||
| FunctionExpression, | ||
| InstanceOfExpression, | ||
| LiteralExpression, | ||
| NewExpression, | ||
| ParenthesizedExpression, | ||
| PropertyAccessExpression, | ||
| TernaryExpression, | ||
| UnaryPostfixExpression, | ||
| UnaryPrefixExpression, | ||
| BlockStatement, | ||
| BreakStatement, | ||
| ContinueStatement, | ||
| DoStatement, | ||
| EmptyStatement, | ||
| ExportStatement, | ||
| ExportDefaultStatement, | ||
| ExportImportStatement, | ||
| ExpressionStatement, | ||
| ForStatement, | ||
| IfStatement, | ||
| ImportStatement, | ||
| ReturnStatement, | ||
| SwitchStatement, | ||
| ThrowStatement, | ||
| TryStatement, | ||
| VariableStatement, | ||
| WhileStatement, | ||
| ClassDeclaration, | ||
| EnumDeclaration, | ||
| EnumValueDeclaration, | ||
| FieldDeclaration, | ||
| FunctionDeclaration, | ||
| ImportDeclaration, | ||
| IndexSignatureDeclaration, | ||
| InterfaceDeclaration, | ||
| MethodDeclaration, | ||
| NamespaceDeclaration, | ||
| TypeDeclaration, | ||
| VariableDeclaration, | ||
| DecoratorNode, | ||
| ExportMember, | ||
| ParameterNode, | ||
| SwitchCase, | ||
| TypeNode, | ||
| ArrayLiteralExpression, | ||
| Expression, | ||
| ObjectLiteralExpression, | ||
| FloatLiteralExpression, | ||
| IntegerLiteralExpression, | ||
| StringLiteralExpression, | ||
| RegexpLiteralExpression, | ||
| UnaryExpression, | ||
| SuperExpression, | ||
| FalseExpression, | ||
| TrueExpression, | ||
| ThisExpression, | ||
| NullExpression, | ||
| ConstructorExpression, | ||
| Statement, | ||
| VoidStatement, | ||
| LiteralKind, | ||
| CommentNode, | ||
| } from "../as"; | ||
| import { BaseVisitor } from "./base"; | ||
| import { utils } from "."; | ||
| export class PathVisitor extends BaseVisitor { | ||
| currentPath: Node[] = []; | ||
| _visit(node: Node): void { | ||
| this.currentPath.push(node); | ||
| switch (node.kind) { | ||
| case NodeKind.SOURCE: { | ||
| this.visitSource(<Source>node); | ||
| break; | ||
| } | ||
| // types | ||
| case NodeKind.NAMEDTYPE: { | ||
| this.visitNamedTypeNode(<NamedTypeNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTIONTYPE: { | ||
| this.visitFunctionTypeNode(<FunctionTypeNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.TYPENAME: { | ||
| this.visitTypeName(<TypeName>node); | ||
| } | ||
| case NodeKind.TYPEPARAMETER: { | ||
| this.visitTypeParameter(<TypeParameterNode>node); | ||
| break; | ||
| } | ||
| // expressions | ||
| case NodeKind.FALSE: | ||
| case NodeKind.NULL: | ||
| case NodeKind.SUPER: | ||
| case NodeKind.THIS: | ||
| case NodeKind.TRUE: | ||
| case NodeKind.CONSTRUCTOR: | ||
| case NodeKind.IDENTIFIER: { | ||
| this.visitIdentifierExpression(<IdentifierExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.ASSERTION: { | ||
| this.visitAssertionExpression(<AssertionExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.BINARY: { | ||
| this.visitBinaryExpression(<BinaryExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.CALL: { | ||
| this.visitCallExpression(<CallExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.CLASS: { | ||
| this.visitClassExpression(<ClassExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.COMMA: { | ||
| this.visitCommaExpression(<CommaExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.ELEMENTACCESS: { | ||
| this.visitElementAccessExpression(<ElementAccessExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTION: { | ||
| this.visitFunctionExpression(<FunctionExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.INSTANCEOF: { | ||
| this.visitInstanceOfExpression(<InstanceOfExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.LITERAL: { | ||
| this.visitLiteralExpression(<LiteralExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.NEW: { | ||
| this.visitNewExpression(<NewExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.PARENTHESIZED: { | ||
| this.visitParenthesizedExpression(<ParenthesizedExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.PROPERTYACCESS: { | ||
| this.visitPropertyAccessExpression(<PropertyAccessExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.TERNARY: { | ||
| this.visitTernaryExpression(<TernaryExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.UNARYPOSTFIX: { | ||
| this.visitUnaryPostfixExpression(<UnaryPostfixExpression>node); | ||
| break; | ||
| } | ||
| case NodeKind.UNARYPREFIX: { | ||
| this.visitUnaryPrefixExpression(<UnaryPrefixExpression>node); | ||
| break; | ||
| } | ||
| // statements | ||
| case NodeKind.BLOCK: { | ||
| this.visitBlockStatement(<BlockStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.BREAK: { | ||
| this.visitBreakStatement(<BreakStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.CONTINUE: { | ||
| this.visitContinueStatement(<ContinueStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.DO: { | ||
| this.visitDoStatement(<DoStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EMPTY: { | ||
| this.visitEmptyStatement(<EmptyStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORT: { | ||
| this.visitExportStatement(<ExportStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORTDEFAULT: { | ||
| this.visitExportDefaultStatement(<ExportDefaultStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORTIMPORT: { | ||
| this.visitExportImportStatement(<ExportImportStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPRESSION: { | ||
| this.visitExpressionStatement(<ExpressionStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.FOR: { | ||
| this.visitForStatement(<ForStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.IF: { | ||
| this.visitIfStatement(<IfStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.IMPORT: { | ||
| this.visitImportStatement(<ImportStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.RETURN: { | ||
| this.visitReturnStatement(<ReturnStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.SWITCH: { | ||
| this.visitSwitchStatement(<SwitchStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.THROW: { | ||
| this.visitThrowStatement(<ThrowStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.TRY: { | ||
| this.visitTryStatement(<TryStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.VARIABLE: { | ||
| this.visitVariableStatement(<VariableStatement>node); | ||
| break; | ||
| } | ||
| case NodeKind.WHILE: { | ||
| this.visitWhileStatement(<WhileStatement>node); | ||
| break; | ||
| } | ||
| // declaration statements | ||
| case NodeKind.CLASSDECLARATION: { | ||
| this.visitClassDeclaration(<ClassDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.ENUMDECLARATION: { | ||
| this.visitEnumDeclaration(<EnumDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.ENUMVALUEDECLARATION: { | ||
| this.visitEnumValueDeclaration(<EnumValueDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.FIELDDECLARATION: { | ||
| this.visitFieldDeclaration(<FieldDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.FUNCTIONDECLARATION: { | ||
| this.visitFunctionDeclaration(<FunctionDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.IMPORTDECLARATION: { | ||
| this.visitImportDeclaration(<ImportDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.INDEXSIGNATUREDECLARATION: { | ||
| this.visitIndexSignatureDeclaration(<IndexSignatureDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.INTERFACEDECLARATION: { | ||
| this.visitInterfaceDeclaration(<InterfaceDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.METHODDECLARATION: { | ||
| this.visitMethodDeclaration(<MethodDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.NAMESPACEDECLARATION: { | ||
| this.visitNamespaceDeclaration(<NamespaceDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.TYPEDECLARATION: { | ||
| this.visitTypeDeclaration(<TypeDeclaration>node); | ||
| break; | ||
| } | ||
| case NodeKind.VARIABLEDECLARATION: { | ||
| this.visitVariableDeclaration(<VariableDeclaration>node); | ||
| break; | ||
| } | ||
| // other | ||
| case NodeKind.DECORATOR: { | ||
| this.visitDecoratorNode(<DecoratorNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.EXPORTMEMBER: { | ||
| this.visitExportMember(<ExportMember>node); | ||
| break; | ||
| } | ||
| case NodeKind.PARAMETER: { | ||
| this.visitParameter(<ParameterNode>node); | ||
| break; | ||
| } | ||
| case NodeKind.SWITCHCASE: { | ||
| this.visitSwitchCase(<SwitchCase>node); | ||
| break; | ||
| } | ||
| default: | ||
| assert(false); | ||
| } | ||
| this.currentPath.pop(); | ||
| } | ||
| get currentNode(): Node { | ||
| return this.currentPath[this.currentPath.length - 1]; | ||
| } | ||
| get currentParent(): Node { | ||
| if (this.currentPath.length == 1) return this.currentNode; | ||
| return this.currentPath[this.currentPath.length - 2]; | ||
| } | ||
| get cuerrentParentPath(): Node[] { | ||
| return this.currentPath.slice(0, this.currentPath.length - 1); | ||
| } | ||
| get currentGrandParentPath(): Node[] { | ||
| return this.currentPath.length < 3 | ||
| ? [] | ||
| : this.currentPath.slice(0, this.currentPath.length - 2); | ||
| } | ||
| cloneCurrentNode(): Node { | ||
| return utils.cloneNode(this.currentNode); | ||
| } | ||
| replaceCurrentNode(node: Node): void { | ||
| Object.getOwnPropertyNames(this.currentParent).forEach((name) => { | ||
| //@ts-ignore | ||
| const prop = this.currentParent[name]; | ||
| if (prop == this.currentNode) { | ||
| //@ts-ignore | ||
| this.currentParent[name] = node; | ||
| } | ||
| }); | ||
| } | ||
| } |
| /// <reference types="assemblyscript/std/portable" /> |
| import { BaseVisitor } from "./base"; | ||
| import { Transform as _Transform } from "../as"; | ||
| import { ASTBuilder } from "./astBuilder"; | ||
| import { PathVisitor } from "./path"; | ||
| import { Mixin } from "ts-mixer"; | ||
| class Transform extends _Transform {} | ||
| export class ASTTransformVisitor extends Mixin(BaseVisitor, Transform) {} | ||
| export class ASTBuilderVisitor extends Mixin(ASTBuilder, Transform) {} | ||
| export class PathTransformVisitor extends Mixin(PathVisitor, Transform) {} | ||
| export function mergeTransformer(from: Transform, to: Transform): void { | ||
| //@ts-ignore | ||
| to.program = from.program; | ||
| //@ts-ignore | ||
| to.baseDir = from.baseDir; | ||
| //@ts-ignore | ||
| to.stdout = from.stdout; | ||
| //@ts-ignore | ||
| to.stderr = from.stderr; | ||
| //@ts-ignore | ||
| to.log = from.log; | ||
| to.writeFile = from.writeFile; | ||
| to.readFile = from.readFile; | ||
| to.listFiles = from.listFiles; | ||
| } |
-42
| import { | ||
| DecoratorNode, | ||
| IdentifierExpression, | ||
| DeclarationStatement, | ||
| Source, | ||
| Node, | ||
| } from "../as"; | ||
| import { ASTBuilder } from "./astBuilder"; | ||
| const cloneDeep: <T>(t: T) => T = require("lodash.clonedeep"); | ||
| export function decorates(node: DecoratorNode, name: string): boolean { | ||
| return (<IdentifierExpression>node.name).text === name; | ||
| } | ||
| export function isDecorator(name: string): (node: DecoratorNode) => boolean { | ||
| return (node) => decorates(node, name); | ||
| } | ||
| export function hasDecorator( | ||
| node: DeclarationStatement, | ||
| name: string | ||
| ): boolean { | ||
| // because it could be undefined | ||
| return node.decorators?.some(isDecorator(name)) == true; | ||
| } | ||
| export function isLibrary(node: Source): boolean { | ||
| return node.isLibrary || node.internalPath.startsWith("~lib/rt/"); | ||
| } | ||
| export function not<T>(fn: (t: T) => boolean): (t: T) => boolean { | ||
| return (t: T) => !fn(t); | ||
| } | ||
| export function toString(node: Node): string { | ||
| return ASTBuilder.build(node); | ||
| } | ||
| export function cloneNode<T extends Node>(node: T): T { | ||
| return cloneDeep(node); | ||
| } |
| export type Collection<T extends object> = | ||
| | T | ||
| | T[] | ||
| | Map<string, T | T[] | Iterable<T>> | ||
| | Iterable<T>; | ||
| function isIterable<T>(object: T): boolean { | ||
| //@ts-ignore | ||
| return object != null && typeof object[Symbol.iterator] === "function"; | ||
| } | ||
| /** | ||
| * Top level visitor that will expect an implemented _visit function to visit | ||
| * a single node and then provides a generic function for collections of nodes | ||
| * and will visit each member of the collection. | ||
| */ | ||
| export abstract class AbstractVisitor<T extends object> { | ||
| visit(node: Collection<T> | null): void { | ||
| if (node == null) return; | ||
| if (node instanceof Array) { | ||
| node.map((node) => this.visit(node)); | ||
| } else if (node instanceof Map) { | ||
| for (let _node of node.values()) { | ||
| this.visit(_node); | ||
| } | ||
| } else if (isIterable(node)) { | ||
| //TODO: Find better way to test if iterable | ||
| // @ts-ignore is iterable | ||
| for (let _node of node) { | ||
| this.visit(_node); | ||
| } | ||
| } else { | ||
| ///@ts-ignore Node is not iterable. | ||
| this._visit(node); | ||
| } | ||
| } | ||
| protected abstract _visit(node: T): void; | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
70
16.67%5
-44.44%0
-100%311137
-26.14%10
11.11%29
-30.95%2783
-52.81%