Skip to content

Commit

Permalink
* Fix some missing options
Browse files Browse the repository at this point in the history
* Replace UndefinedIdentifier -> UNKNOWN_ASSIGNMENT to keep assignment
  sets smaller
  • Loading branch information
lukastaegert committed Nov 8, 2017
1 parent 52f4684 commit 5132d3b
Show file tree
Hide file tree
Showing 10 changed files with 22 additions and 48 deletions.
4 changes: 2 additions & 2 deletions src/ast/nodes/BlockStatement.js
@@ -1,12 +1,12 @@
import Statement from './shared/Statement.js';
import BlockScope from '../scopes/BlockScope';
import UndefinedIdentifier from './shared/UndefinedIdentifier';
import { UNKNOWN_ASSIGNMENT } from '../values';

export default class BlockStatement extends Statement {
bindImplicitReturnExpressionToScope () {
const lastStatement = this.body[ this.body.length - 1 ];
if ( !lastStatement || lastStatement.type !== 'ReturnStatement' ) {
this.scope.addReturnExpression( new UndefinedIdentifier() );
this.scope.addReturnExpression( UNKNOWN_ASSIGNMENT );
}
}

Expand Down
5 changes: 2 additions & 3 deletions src/ast/nodes/UnaryExpression.js
@@ -1,6 +1,5 @@
import Node from '../Node.js';
import { UNKNOWN_VALUE } from '../values';
import UndefinedIdentifier from './shared/UndefinedIdentifier';
import { UNKNOWN_ASSIGNMENT, UNKNOWN_VALUE } from '../values';
import ExecutionPathOptions from '../ExecutionPathOptions';

const operators = {
Expand All @@ -16,7 +15,7 @@ const operators = {
export default class UnaryExpression extends Node {
bindNode () {
if ( this.operator === 'delete' ) {
this.argument.bindAssignmentAtPath( [], new UndefinedIdentifier(), ExecutionPathOptions.create() );
this.argument.bindAssignmentAtPath( [], UNKNOWN_ASSIGNMENT, ExecutionPathOptions.create() );
}
}

Expand Down
5 changes: 5 additions & 0 deletions src/ast/nodes/shared/FunctionNode.js
Expand Up @@ -51,6 +51,11 @@ export default class FunctionNode extends Node {
|| this.body.hasEffects( innerOptions );
}

includeInBundle () {
this.scope.variables.arguments.includeVariable();
return super.includeInBundle();
}

initialiseNode () {
this.prototypeObject = new VirtualObjectExpression();
}
Expand Down
19 changes: 0 additions & 19 deletions src/ast/nodes/shared/UndefinedIdentifier.js

This file was deleted.

4 changes: 2 additions & 2 deletions src/ast/scopes/ModuleScope.js
Expand Up @@ -2,7 +2,7 @@ import { forOwn } from '../../utils/object.js';
import relativeId from '../../utils/relativeId.js';
import Scope from './Scope.js';
import LocalVariable from '../variables/LocalVariable';
import UndefinedIdentifier from '../nodes/shared/UndefinedIdentifier';
import { UNKNOWN_ASSIGNMENT } from '../values';

export default class ModuleScope extends Scope {
constructor ( module ) {
Expand All @@ -12,7 +12,7 @@ export default class ModuleScope extends Scope {
} );

this.module = module;
this.variables.this = new LocalVariable( 'this', null, new UndefinedIdentifier() );
this.variables.this = new LocalVariable( 'this', null, UNKNOWN_ASSIGNMENT );
}

deshadow ( names ) {
Expand Down
4 changes: 2 additions & 2 deletions src/ast/scopes/Scope.js
@@ -1,7 +1,7 @@
import { blank, keys } from '../../utils/object.js';
import LocalVariable from '../variables/LocalVariable';
import ExportDefaultVariable from '../variables/ExportDefaultVariable';
import UndefinedIdentifier from '../nodes/shared/UndefinedIdentifier';
import { UNKNOWN_ASSIGNMENT } from '../values';

export default class Scope {
constructor ( options = {} ) {
Expand All @@ -28,7 +28,7 @@ export default class Scope {
variable.addDeclaration( identifier );
options.init && variable.bindAssignmentAtPath( [], options.init );
} else {
this.variables[ name ] = new LocalVariable( identifier.name, identifier, options.init || new UndefinedIdentifier() );
this.variables[ name ] = new LocalVariable( identifier.name, identifier, options.init || UNKNOWN_ASSIGNMENT );
}
return this.variables[ name ];
}
Expand Down
3 changes: 2 additions & 1 deletion src/ast/values.js
Expand Up @@ -4,8 +4,9 @@ export const UNKNOWN_ASSIGNMENT = {
type: 'UNKNOWN',
bindAssignmentAtPath: () => {},
bindCallAtPath: () => {},
forEachReturnExpressionWhenCalledAtPath: () => {},
hasEffectsWhenAccessedAtPath: path => path.length > 0,
hasEffectsWhenAssignedAtPath: () => true,
hasEffectsWhenAssignedAtPath: path => path.length > 0,
hasEffectsWhenCalledAtPath: () => true,
someReturnExpressionWhenCalledAtPath: () => true,
toString: () => '[[UNKNOWN]]'
Expand Down
9 changes: 4 additions & 5 deletions src/ast/variables/ArgumentsVariable.js
Expand Up @@ -26,11 +26,10 @@ export default class ArgumentsVariable extends LocalVariable {
}

hasEffectsWhenAssignedAtPath ( path, options ) {
if ( path.length === 0 ) {
return true;
}
return getParameterVariable( path, options )
.hasEffectsWhenAssignedAtPath( path.slice( 1 ), options );
return path.length === 0
|| this.included
|| getParameterVariable( path, options )
.hasEffectsWhenAssignedAtPath( path.slice( 1 ), options );
}

hasEffectsWhenCalledAtPath ( path, callOptions, options ) {
Expand Down
@@ -1,5 +1,6 @@
import StructuredAssignmentTracker from './StructuredAssignmentTracker';
import LocalVariable from './LocalVariable';
import ExecutionPathOptions from '../ExecutionPathOptions';

export default class ReplaceableInitStructuredAssignmentTracker extends StructuredAssignmentTracker {
constructor () {
Expand All @@ -9,13 +10,13 @@ export default class ReplaceableInitStructuredAssignmentTracker extends Structur

addAtPath ( path, assignment ) {
if ( path.length > 0 ) {
this._init.bindAssignmentAtPath( path, assignment );
this._init.bindAssignmentAtPath( path, assignment, ExecutionPathOptions.create() );
}
super.addAtPath( path, assignment );
}

addInit ( assignment ) {
this._init.bindAssignmentAtPath( [], assignment );
this._init.bindAssignmentAtPath( [], assignment, ExecutionPathOptions.create() );
}

forEachAtPath ( path, callback ) {
Expand Down
12 changes: 0 additions & 12 deletions src/ast/variables/StructuredAssignmentTracker.js
Expand Up @@ -69,18 +69,6 @@ export default class StructuredAssignmentTracker {
}
}

hasEqualAtPath ( path, equalAssignment ) {
if ( path.length === 0 ) {
return Array.from( this._assignments.get( SET_KEY ) ).find( assignment => equalAssignment.equals( assignment ) );
} else {
const [ nextPath, ...remainingPath ] = path;
if ( !this._assignments.has( nextPath ) ) {
return false;
}
return this._assignments.get( nextPath ).hasAtPath( remainingPath, equalAssignment );
}
}

someAtPath ( path, predicateFunction ) {
const [ nextPath, ...remainingPath ] = path;
return Array.from( this._assignments.get( SET_KEY ) ).some( assignment => predicateFunction( path, assignment ) )
Expand Down

0 comments on commit 5132d3b

Please sign in to comment.