From 7fba690f5293dd2fe0e6095b5f184d60d697cae3 Mon Sep 17 00:00:00 2001 From: Brian Donovan Date: Mon, 21 Dec 2015 15:26:27 -0800 Subject: [PATCH] Ensure `delete` operations at the top level are preserved. Fixes #352. --- src/Statement.js | 4 ++-- src/ast/modifierNodes.js | 19 +++++++++++++++++-- src/utils/run.js | 4 ++-- test/function/delete/_config.js | 3 +++ test/function/delete/main.js | 4 ++++ 5 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 test/function/delete/_config.js create mode 100644 test/function/delete/main.js diff --git a/src/Statement.js b/src/Statement.js index a9efc49..4852167 100644 --- a/src/Statement.js +++ b/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; diff --git a/src/ast/modifierNodes.js b/src/ast/modifierNodes.js index 2ea3f5d..3696fd1 100644 --- a/src/ast/modifierNodes.js +++ b/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; +} diff --git a/src/utils/run.js b/src/utils/run.js index ac303f1..aa9306a 100644 --- a/src/utils/run.js +++ b/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; diff --git a/test/function/delete/_config.js b/test/function/delete/_config.js new file mode 100644 index 0000000..4a5902c --- /dev/null +++ b/test/function/delete/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: '`delete` operator at the top level is preserved' +}; diff --git a/test/function/delete/main.js b/test/function/delete/main.js new file mode 100644 index 0000000..ff7a468 --- /dev/null +++ b/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);