Browse Source

fix double var declaration bug (#716)

rewrite
Rich-Harris 9 years ago
parent
commit
2e32f23777
  1. 2
      src/ast/nodes/VariableDeclarator.js
  2. 11
      src/ast/scopes/Scope.js
  3. 1
      test/form/duplicated-var-declarations/_config.js
  4. 17
      test/form/duplicated-var-declarations/_expected/amd.js
  5. 15
      test/form/duplicated-var-declarations/_expected/cjs.js
  6. 13
      test/form/duplicated-var-declarations/_expected/es.js
  7. 18
      test/form/duplicated-var-declarations/_expected/iife.js
  8. 21
      test/form/duplicated-var-declarations/_expected/umd.js

2
src/ast/nodes/VariableDeclarator.js

@ -11,12 +11,14 @@ class DeclaratorProxy {
this.isReassigned = false;
this.exportName = null;
this.duplicates = [];
this.possibleValues = new Set( init ? [ init ] : null );
}
activate () {
this.activated = true;
this.declarator.activate();
this.duplicates.forEach( dupe => dupe.activate() );
}
addReference () {

11
src/ast/scopes/Scope.js

@ -1,3 +1,5 @@
import getLocation from '../../utils/getLocation.js';
import error from '../../utils/error.js';
import { blank, keys } from '../../utils/object.js';
import { UNKNOWN } from '../values.js';
@ -49,7 +51,14 @@ export default class Scope {
if ( isVar && this.isBlockScope ) {
this.parent.addDeclaration( name, declaration, isVar, isParam );
} else {
this.declarations[ name ] = isParam ? new Parameter( name ) : declaration;
const existingDeclaration = this.declarations[ name ];
if ( existingDeclaration && existingDeclaration.duplicates ) {
// TODO warn/throw on duplicates?
existingDeclaration.duplicates.push( declaration );
} else {
this.declarations[ name ] = isParam ? new Parameter( name ) : declaration;
}
}
}

1
test/form/duplicated-var-declarations/_config.js

@ -1,4 +1,3 @@
module.exports = {
skip: true,
description: 'does not remove duplicated var declarations (#716)'
};

17
test/form/duplicated-var-declarations/_expected/amd.js

@ -0,0 +1,17 @@
define(function () { 'use strict';
var a = 1;
var b = 2;
assert.equal( a, 1 );
assert.equal( b, 2 );
var a = 3;
var b = 4;
var c = 5;
assert.equal( a, 3 );
assert.equal( b, 4 );
assert.equal( c, 5 );
});

15
test/form/duplicated-var-declarations/_expected/cjs.js

@ -0,0 +1,15 @@
'use strict';
var a = 1;
var b = 2;
assert.equal( a, 1 );
assert.equal( b, 2 );
var a = 3;
var b = 4;
var c = 5;
assert.equal( a, 3 );
assert.equal( b, 4 );
assert.equal( c, 5 );

13
test/form/duplicated-var-declarations/_expected/es.js

@ -0,0 +1,13 @@
var a = 1;
var b = 2;
assert.equal( a, 1 );
assert.equal( b, 2 );
var a = 3;
var b = 4;
var c = 5;
assert.equal( a, 3 );
assert.equal( b, 4 );
assert.equal( c, 5 );

18
test/form/duplicated-var-declarations/_expected/iife.js

@ -0,0 +1,18 @@
(function () {
'use strict';
var a = 1;
var b = 2;
assert.equal( a, 1 );
assert.equal( b, 2 );
var a = 3;
var b = 4;
var c = 5;
assert.equal( a, 3 );
assert.equal( b, 4 );
assert.equal( c, 5 );
}());

21
test/form/duplicated-var-declarations/_expected/umd.js

@ -0,0 +1,21 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
typeof define === 'function' && define.amd ? define(factory) :
(factory());
}(this, (function () { 'use strict';
var a = 1;
var b = 2;
assert.equal( a, 1 );
assert.equal( b, 2 );
var a = 3;
var b = 4;
var c = 5;
assert.equal( a, 3 );
assert.equal( b, 4 );
assert.equal( c, 5 );
})));
Loading…
Cancel
Save