Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
* Use enum for node types
* Take care all nodes implement the ExpressionEntity interface to simplify
  things
  • Loading branch information
lukastaegert committed Jan 9, 2018
1 parent 181b016 commit 0f98a30
Show file tree
Hide file tree
Showing 69 changed files with 359 additions and 245 deletions.
15 changes: 8 additions & 7 deletions src/Module.ts
Expand Up @@ -36,6 +36,7 @@ import ExternalModule from './ExternalModule';
import Import from './ast/nodes/Import';
import TemplateLiteral from './ast/nodes/TemplateLiteral';
import Literal from './ast/nodes/Literal';
import { NodeType } from './ast/nodes/index';

const setModuleDynamicImportsReturnBinding = wrapDynamicImportPlugin(acorn);

Expand Down Expand Up @@ -244,7 +245,7 @@ export default class Module {
if (source) {
if (!~this.sources.indexOf(source)) this.sources.push(source);

if (node.type === 'ExportAllDeclaration') {
if (node.type === NodeType.ExportAllDeclaration) {
// Store `export * from '...'` statements in an array of delegates.
// When an unknown import is encountered, we see if one of them can satisfy it.
this.exportAllSources.push(source);
Expand All @@ -270,7 +271,7 @@ export default class Module {
};
});
}
} else if (node.type === 'ExportDefaultDeclaration') {
} else if (node.type === NodeType.ExportDefaultDeclaration) {
// export default function foo () {}
// export default foo;
// export default 42;
Expand Down Expand Up @@ -299,7 +300,7 @@ export default class Module {
// export function foo () {}
const declaration = (<ExportNamedDeclaration>node).declaration;

if (declaration.type === 'VariableDeclaration') {
if (declaration.type === NodeType.VariableDeclaration) {
declaration.declarations.forEach((decl: VariableDeclarator) => {
extractNames(decl.id).forEach(localName => {
this.exports[localName] = { localName };
Expand Down Expand Up @@ -349,8 +350,8 @@ export default class Module {
);
}

const isDefault = specifier.type === 'ImportDefaultSpecifier';
const isNamespace = specifier.type === 'ImportNamespaceSpecifier';
const isDefault = specifier.type === NodeType.ImportDefaultSpecifier;
const isNamespace = specifier.type === NodeType.ImportNamespaceSpecifier;

const name = isDefault
? 'default'
Expand Down Expand Up @@ -516,11 +517,11 @@ export default class Module {
return Promise.all(this.dynamicImports.map(node => {
const importArgument = node.parent.arguments[0];
let dynamicImportSpecifier: string | Node;
if (importArgument.type === 'TemplateLiteral') {
if (importArgument.type === NodeType.TemplateLiteral) {
if ((<TemplateLiteral>importArgument).expressions.length === 0 && (<TemplateLiteral>importArgument).quasis.length === 1) {
dynamicImportSpecifier = (<TemplateLiteral>importArgument).quasis[0].value.cooked;
}
} else if (importArgument.type === 'Literal') {
} else if (importArgument.type === NodeType.Literal) {
if (typeof (<Literal>importArgument).value === 'string') {
dynamicImportSpecifier = <string>(<Literal>importArgument).value;
}
Expand Down
7 changes: 4 additions & 3 deletions src/ast/nodes/ArrayExpression.ts
@@ -1,9 +1,10 @@
import SpreadElement from './SpreadElement';
import { ObjectPath } from '../variables/VariableReassignmentTracker';
import { ExpressionBase, ExpressionNode } from './shared/Expression';
import { ExpressionNode, NodeBase } from './shared/Node';
import { NodeType } from './index';

export default class ArrayExpression extends ExpressionBase {
type: 'ArrayExpression';
export default class ArrayExpression extends NodeBase {
type: NodeType.ArrayExpression;
elements: (ExpressionNode | SpreadElement | null)[];

hasEffectsWhenAccessedAtPath (path: ObjectPath) {
Expand Down
8 changes: 5 additions & 3 deletions src/ast/nodes/ArrayPattern.ts
Expand Up @@ -2,11 +2,13 @@ import { UNKNOWN_EXPRESSION } from '../values';
import Scope from '../scopes/Scope';
import ExecutionPathOptions from '../ExecutionPathOptions';
import { ObjectPath } from '../variables/VariableReassignmentTracker';
import { PatternBase, PatternNode } from './shared/Pattern';
import { PatternNode } from './shared/Pattern';
import { ExpressionEntity } from './shared/Expression';
import { NodeBase } from './shared/Node';
import { NodeType } from './index';

export default class ArrayPattern extends PatternBase {
type: 'ArrayPattern';
export default class ArrayPattern extends NodeBase implements PatternNode {
type: NodeType.ArrayPattern;
elements: (PatternNode | null)[];

reassignPath (path: ObjectPath, options: ExecutionPathOptions) {
Expand Down
8 changes: 5 additions & 3 deletions src/ast/nodes/ArrowFunctionExpression.ts
Expand Up @@ -4,11 +4,13 @@ import BlockStatement, { isBlockStatement } from './BlockStatement';
import CallOptions from '../CallOptions';
import ExecutionPathOptions from '../ExecutionPathOptions';
import { ObjectPath } from '../variables/VariableReassignmentTracker';
import { ExpressionBase, ExpressionNode, ForEachReturnExpressionCallback, SomeReturnExpressionCallback } from './shared/Expression';
import { ForEachReturnExpressionCallback, SomeReturnExpressionCallback } from './shared/Expression';
import { PatternNode } from './shared/Pattern';
import { NodeType } from './index';
import { ExpressionNode, NodeBase } from './shared/Node';

export default class ArrowFunctionExpression extends ExpressionBase {
type: 'ArrowFunctionExpression';
export default class ArrowFunctionExpression extends NodeBase {
type: NodeType.ArrowFunctionExpression;
body: BlockStatement | ExpressionNode;
params: PatternNode[];
scope: ReturnValueScope;
Expand Down
7 changes: 4 additions & 3 deletions src/ast/nodes/AssignmentExpression.ts
@@ -1,10 +1,11 @@
import ExecutionPathOptions from '../ExecutionPathOptions';
import { ObjectPath } from '../variables/VariableReassignmentTracker';
import { ExpressionBase, ExpressionNode } from './shared/Expression';
import { PatternNode } from './shared/Pattern';
import { ExpressionNode, NodeBase } from './shared/Node';
import { NodeType } from './index';

export default class AssignmentExpression extends ExpressionBase {
type: 'AssignmentExpression';
export default class AssignmentExpression extends NodeBase {
type: NodeType.AssignmentExpression;
left: PatternNode | ExpressionNode;
right: ExpressionNode;

Expand Down
10 changes: 6 additions & 4 deletions src/ast/nodes/AssignmentPattern.ts
@@ -1,11 +1,13 @@
import ExecutionPathOptions from '../ExecutionPathOptions';
import Scope from '../scopes/Scope';
import { ObjectPath } from '../variables/VariableReassignmentTracker';
import { PatternBase, PatternNode } from './shared/Pattern';
import { ExpressionEntity, ExpressionNode } from './shared/Expression';
import { PatternNode } from './shared/Pattern';
import { ExpressionEntity } from './shared/Expression';
import { ExpressionNode, NodeBase } from './shared/Node';
import { NodeType } from './index';

export default class AssignmentPattern extends PatternBase {
type: 'AssignmentPattern';
export default class AssignmentPattern extends NodeBase implements PatternNode {
type: NodeType.AssignmentPattern;
left: PatternNode;
right: ExpressionNode;

Expand Down
5 changes: 3 additions & 2 deletions src/ast/nodes/AssignmentProperty.ts
@@ -1,8 +1,9 @@
import { PatternNode } from './shared/Pattern';
import { ExpressionNode } from './shared/Expression';
import { ExpressionNode } from './shared/Node';
import { NodeType } from './index';

export default interface AssignmentProperty extends PatternNode {
type: 'Property';
type: NodeType.Property;
value: PatternNode;
key: ExpressionNode,
kind: 'init';
Expand Down
7 changes: 4 additions & 3 deletions src/ast/nodes/AwaitExpression.ts
@@ -1,8 +1,9 @@
import ExecutionPathOptions from '../ExecutionPathOptions';
import { ExpressionBase, ExpressionNode } from './shared/Expression';
import { NodeType } from './index';
import { ExpressionNode, NodeBase } from './shared/Node';

export default class AwaitExpression extends ExpressionBase {
type: 'AwaitExpression';
export default class AwaitExpression extends NodeBase {
type: NodeType.AwaitExpression;
argument: ExpressionNode;

hasEffects (options: ExecutionPathOptions) {
Expand Down
7 changes: 4 additions & 3 deletions src/ast/nodes/BinaryExpression.ts
@@ -1,7 +1,8 @@
import { UNKNOWN_VALUE } from '../values';
import ExecutionPathOptions from '../ExecutionPathOptions';
import { ObjectPath } from '../variables/VariableReassignmentTracker';
import { ExpressionBase, ExpressionNode } from './shared/Expression';
import { NodeType } from './index';
import { ExpressionNode, NodeBase } from './shared/Node';

export type BinaryOperator =
'=='
Expand Down Expand Up @@ -54,8 +55,8 @@ const operators: {
instanceof: (left: any, right: any) => left instanceof right
};

export default class BinaryExpression extends ExpressionBase {
type: 'BinaryExpression';
export default class BinaryExpression extends NodeBase {
type: NodeType.BinaryExpression;
left: ExpressionNode;
right: ExpressionNode;
operator: BinaryOperator;
Expand Down
7 changes: 4 additions & 3 deletions src/ast/nodes/BlockStatement.ts
Expand Up @@ -5,19 +5,20 @@ import Scope from '../scopes/Scope';
import MagicString from 'magic-string';
import { Node } from './shared/Node';
import { StatementBase, StatementNode } from './shared/Statement';
import { NodeType } from './index';

export function isBlockStatement (node: Node): node is BlockStatement {
return node.type === 'BlockStatement';
return node.type === NodeType.BlockStatement;
}

export default class BlockStatement extends StatementBase {
type: 'BlockStatement';
type: NodeType.BlockStatement;
scope: Scope;
body: StatementNode[];

bindImplicitReturnExpressionToScope () {
const lastStatement = this.body[this.body.length - 1];
if (!lastStatement || lastStatement.type !== 'ReturnStatement') {
if (!lastStatement || lastStatement.type !== NodeType.ReturnStatement) {
this.scope.addReturnExpression(UNKNOWN_EXPRESSION);
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/ast/nodes/BreakStatement.ts
@@ -1,9 +1,10 @@
import ExecutionPathOptions from '../ExecutionPathOptions';
import Identifier from './Identifier';
import { StatementBase } from './shared/Statement';
import { NodeType } from './index';

export default class BreakStatement extends StatementBase {
type: 'BreakStatement';
type: NodeType.BreakStatement;
label: Identifier | null;

hasEffects (options: ExecutionPathOptions) {
Expand Down
8 changes: 5 additions & 3 deletions src/ast/nodes/CallExpression.ts
Expand Up @@ -4,11 +4,13 @@ import SpreadElement from './SpreadElement';
import { isGlobalVariable } from '../variables/GlobalVariable';
import { ObjectPath } from '../variables/VariableReassignmentTracker';
import { isIdentifier } from './Identifier';
import { ExpressionBase, ExpressionNode, ForEachReturnExpressionCallback, SomeReturnExpressionCallback } from './shared/Expression';
import { ForEachReturnExpressionCallback, SomeReturnExpressionCallback } from './shared/Expression';
import { isNamespaceVariable } from '../variables/NamespaceVariable';
import { NodeType } from './index';
import { ExpressionNode, NodeBase } from './shared/Node';

export default class CallExpression extends ExpressionBase {
type: 'CallExpression';
export default class CallExpression extends NodeBase {
type: NodeType.CallExpression;
callee: ExpressionNode;
arguments: (ExpressionNode | SpreadElement)[];

Expand Down
3 changes: 2 additions & 1 deletion src/ast/nodes/CatchClause.ts
Expand Up @@ -3,9 +3,10 @@ import CatchScope from '../scopes/CatchScope';
import BlockStatement from './BlockStatement';
import Scope from '../scopes/Scope';
import { PatternNode } from './shared/Pattern';
import { NodeType } from './index';

export default class CatchClause extends NodeBase {
type: 'CatchClause';
type: NodeType.CatchClause;
param: PatternNode;
body: BlockStatement;
scope: CatchScope;
Expand Down
3 changes: 2 additions & 1 deletion src/ast/nodes/ClassBody.ts
Expand Up @@ -3,9 +3,10 @@ import ExecutionPathOptions from '../ExecutionPathOptions';
import CallOptions from '../CallOptions';
import MethodDefinition from './MethodDefinition';
import { ObjectPath } from '../variables/VariableReassignmentTracker';
import { NodeType } from './index';

export default class ClassBody extends NodeBase {
type: 'ClassBody';
type: NodeType.ClassBody;
body: MethodDefinition[];
classConstructor: MethodDefinition | null;

Expand Down
3 changes: 2 additions & 1 deletion src/ast/nodes/ClassDeclaration.ts
Expand Up @@ -2,9 +2,10 @@ import ClassNode from './shared/ClassNode';
import Scope from '../scopes/Scope';
import Identifier from './Identifier';
import MagicString from 'magic-string';
import { NodeType } from './index';

export default class ClassDeclaration extends ClassNode {
type: 'ClassDeclaration';
type: NodeType.ClassDeclaration;
id: Identifier;

initialiseChildren (parentScope: Scope) {
Expand Down
3 changes: 2 additions & 1 deletion src/ast/nodes/ClassExpression.ts
Expand Up @@ -2,9 +2,10 @@ import ClassNode from './shared/ClassNode';
import Scope from '../scopes/Scope';
import { ObjectPath } from '../variables/VariableReassignmentTracker';
import ExecutionPathOptions from '../ExecutionPathOptions';
import { NodeType } from './index';

export default class ClassExpression extends ClassNode {
type: 'ClassExpression';
type: NodeType.ClassExpression;

initialiseChildren (parentScope: Scope) {
this.id && this.id.initialiseAndDeclare(this.scope, 'class', this);
Expand Down
10 changes: 6 additions & 4 deletions src/ast/nodes/ConditionalExpression.ts
Expand Up @@ -4,10 +4,12 @@ import CallOptions from '../CallOptions';
import Scope from '../scopes/Scope';
import MagicString from 'magic-string';
import { ObjectPath } from '../variables/VariableReassignmentTracker';
import { ExpressionBase, ExpressionNode, ForEachReturnExpressionCallback, SomeReturnExpressionCallback } from './shared/Expression';
import { ForEachReturnExpressionCallback, SomeReturnExpressionCallback } from './shared/Expression';
import { NodeType } from './index';
import { ExpressionNode, NodeBase } from './shared/Node';

export default class ConditionalExpression extends ExpressionBase {
type: 'ConditionalExpression';
export default class ConditionalExpression extends NodeBase {
type: NodeType.ConditionalExpression;
test: ExpressionNode;
alternate: ExpressionNode;
consequent: ExpressionNode;
Expand Down Expand Up @@ -101,7 +103,7 @@ export default class ConditionalExpression extends ExpressionBase {

code.remove(this.start, branchToRetain.start);
code.remove(branchToRetain.end, this.end);
if (branchToRetain.type === 'SequenceExpression') {
if (branchToRetain.type === NodeType.SequenceExpression) {
code.prependLeft(branchToRetain.start, '(');
code.appendRight(branchToRetain.end, ')');
}
Expand Down
5 changes: 3 additions & 2 deletions src/ast/nodes/DoWhileStatement.ts
@@ -1,9 +1,10 @@
import ExecutionPathOptions from '../ExecutionPathOptions';
import { StatementBase, StatementNode } from './shared/Statement';
import { ExpressionNode } from './shared/Expression';
import { ExpressionNode } from './shared/Node';
import { NodeType } from './index';

export default class DoWhileStatement extends StatementBase {
type: 'DoWhileStatement';
type: NodeType.DoWhileStatement;
body: StatementNode;
test: ExpressionNode;

Expand Down
7 changes: 4 additions & 3 deletions src/ast/nodes/EmptyStatement.ts
@@ -1,13 +1,14 @@
import MagicString from 'magic-string';
import { StatementBase } from './shared/Statement';
import { NodeType } from './index';

export default class EmptyStatement extends StatementBase {
type: 'EmptyStatement';
type: NodeType.EmptyStatement;

render (code: MagicString, _es: boolean) {
if (
this.parent.type === 'BlockStatement' ||
this.parent.type === 'Program'
this.parent.type === NodeType.BlockStatement ||
this.parent.type === NodeType.Program
) {
code.remove(this.start, this.end);
}
Expand Down
3 changes: 2 additions & 1 deletion src/ast/nodes/ExportAllDeclaration.ts
@@ -1,9 +1,10 @@
import { NodeBase } from './shared/Node';
import Literal from './Literal';
import MagicString from 'magic-string';
import { NodeType } from './index';

export default class ExportAllDeclaration extends NodeBase {
type: 'ExportAllDeclaration';
type: NodeType.ExportAllDeclaration;
source: Literal<string>;
isExportDeclaration: true;

Expand Down
6 changes: 3 additions & 3 deletions src/ast/nodes/ExportDefaultDeclaration.ts
@@ -1,11 +1,11 @@
import { NodeBase } from './shared/Node';
import { ExpressionNode, NodeBase } from './shared/Node';
import ExecutionPathOptions from '../ExecutionPathOptions';
import ExportDefaultVariable from '../variables/ExportDefaultVariable';
import ClassDeclaration from './ClassDeclaration';
import FunctionDeclaration from './FunctionDeclaration';
import Identifier from './Identifier';
import MagicString from 'magic-string';
import { ExpressionNode } from './shared/Expression';
import { NodeType } from './index';

const functionOrClassDeclaration = /^(?:Function|Class)Declaration/;

Expand All @@ -29,7 +29,7 @@ const sourceRE = {
};

export default class ExportDefaultDeclaration extends NodeBase {
type: 'ExportDefaultDeclaration';
type: NodeType.ExportDefaultDeclaration;
declaration: FunctionDeclaration | ClassDeclaration | ExpressionNode;

private _declarationName: string;
Expand Down
3 changes: 2 additions & 1 deletion src/ast/nodes/ExportNamedDeclaration.ts
Expand Up @@ -6,9 +6,10 @@ import ExportSpecifier from './ExportSpecifier';
import FunctionDeclaration from './FunctionDeclaration';
import ClassDeclaration from './ClassDeclaration';
import VariableDeclaration from './VariableDeclaration';
import { NodeType } from './index';

export default class ExportNamedDeclaration extends NodeBase {
type: 'ExportNamedDeclaration';
type: NodeType.ExportNamedDeclaration;
declaration: FunctionDeclaration | ClassDeclaration | VariableDeclaration | null;
specifiers: ExportSpecifier[];
source: Literal<string> | null;
Expand Down

0 comments on commit 0f98a30

Please sign in to comment.