Browse Source

Merge pull request #369 from rollup/delete-statement-support

Ensure `delete` operations at the top level are preserved.
gh-384
Rich Harris 9 years ago
parent
commit
ea32575e7e
  1. 4
      src/Statement.js
  2. 19
      src/ast/modifierNodes.js
  3. 4
      src/utils/run.js
  4. 3
      test/function/delete/_config.js
  5. 4
      test/function/delete/main.js

4
src/Statement.js

@ -1,7 +1,7 @@
import { walk } from 'estree-walker';
import Scope from './ast/Scope.js';
import attachScopes from './ast/attachScopes.js';
import modifierNodes from './ast/modifierNodes.js';
import modifierNodes, { isModifierNode } from './ast/modifierNodes.js';
import isFunctionDeclaration from './ast/isFunctionDeclaration.js';
import isReference from './ast/isReference.js';
import getLocation from './utils/getLocation.js';
@ -95,7 +95,7 @@ export default class Statement {
let isReassignment;
if ( parent && parent.type in modifierNodes ) {
if ( parent && isModifierNode( parent ) ) {
let subject = parent[ modifierNodes[ parent.type ] ];
let depth = 0;

19
src/ast/modifierNodes.js

@ -1,4 +1,19 @@
export default {
const modifierNodes = {
AssignmentExpression: 'left',
UpdateExpression: 'argument'
UpdateExpression: 'argument',
UnaryExpression: 'argument'
};
export default modifierNodes;
export function isModifierNode ( node ) {
if ( !( node.type in modifierNodes ) ) {
return false;
}
if ( node.type === 'UnaryExpression' ) {
return node.operator === 'delete';
}
return true;
}

4
src/utils/run.js

@ -1,5 +1,5 @@
import { walk } from 'estree-walker';
import modifierNodes from '../ast/modifierNodes.js';
import modifierNodes, { isModifierNode } from '../ast/modifierNodes.js';
import isReference from '../ast/isReference.js';
import flatten from '../ast/flatten';
@ -115,7 +115,7 @@ export default function run ( node, scope, statement, strongDependencies, force
}
}
else if ( node.type in modifierNodes ) {
else if ( isModifierNode( node ) ) {
let subject = node[ modifierNodes[ node.type ] ];
while ( subject.type === 'MemberExpression' ) subject = subject.object;

3
test/function/delete/_config.js

@ -0,0 +1,3 @@
module.exports = {
description: '`delete` operator at the top level is preserved'
};

4
test/function/delete/main.js

@ -0,0 +1,4 @@
var a = { b: 1 };
assert.strictEqual(a.b, 1);
delete a.b;
assert.strictEqual(a.b, undefined);
Loading…
Cancel
Save