Big News: Socket Selected for OpenAI's Cybersecurity Grant Program.Details
Socket
Book a DemoSign in
Socket

visitor-as

Package Overview
Dependencies
Maintainers
1
Versions
26
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

visitor-as - npm Package Compare versions

Comparing version
0.1.0
to
0.2.0-0
+7
dist/simpleParser.d.ts
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=
+5
-4
/// <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;

@@ -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

@@ -7,3 +7,4 @@ export * from "./base";

export * from "./path";
export * from "./simpleParser";
import * as utils from "./utils";
export { utils };

@@ -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
"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=
{
"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",

@@ -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/"],
};
// 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;
}
}
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());
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 };
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;
}
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