Skip to content
This repository was archived by the owner on Mar 23, 2024. It is now read-only.

Commit 5c4565e

Browse files
committed
JsFile: fix duplicate ( token in export default statements
Fixes #947 Closes gh-990
1 parent 55178f2 commit 5c4565e

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

lib/js-file.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,19 @@ JsFile.prototype = {
139139
* Builds token index by starting pos for futher navigation.
140140
*/
141141
_buildTokenIndex: function() {
142+
// Temporary fix (i hope) for esprima tokenizer, which results
143+
// in duplicate tokens on `export default function() {}`
144+
// (https://code.google.com/p/esprima/issues/detail?id=631)
145+
if (this.getDialect() === 'es6') {
146+
var lastToken;
147+
this._tree.tokens = this._tree.tokens.filter(function(token, i) {
148+
var prevToken = lastToken;
149+
lastToken = token;
150+
151+
return !prevToken || prevToken.range[0] !== token.range[0] || prevToken.range[1] !== token.range[1];
152+
});
153+
}
154+
142155
var tokens = this._tree.tokens;
143156
var tokenRangeStartIndex = {};
144157
var tokenRangeEndIndex = {};

test/js-file.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ describe('modules/js-file', function() {
1919
return new JsFile(
2020
'example.js',
2121
sources,
22-
harmonyEsprima.parse(sources, {sourceType: 'module', loc: true, range: true, comment: true, tokens: true})
22+
harmonyEsprima.parse(sources, {sourceType: 'module', loc: true, range: true, comment: true, tokens: true}),
23+
{ es6: true }
2324
);
2425
}
2526

@@ -198,6 +199,12 @@ describe('modules/js-file', function() {
198199
createJsFile('test.toString').iterateTokenByValue('(', spy);
199200
assert(!spy.calledOnce);
200201
});
202+
203+
it('should not have duplicate tokens in es6 export default statements', function() {
204+
var spy = sinon.spy();
205+
createHarmonyJsFile('export default function() {}').iterateTokenByValue('(', spy);
206+
assert(spy.calledOnce);
207+
});
201208
});
202209

203210
describe('getNodeByRange', function() {
@@ -245,7 +252,11 @@ describe('modules/js-file', function() {
245252
});
246253

247254
describe('findNextToken', function() {
248-
var file = createJsFile('switch(varName){case"yes":a++;break;}');
255+
var file;
256+
257+
beforeEach(function() {
258+
file = createJsFile('switch(varName){case"yes":a++;break;}');
259+
});
249260

250261
it('should find the first next token when only the type is specified', function() {
251262
var switchToken = file.getTokens()[0];
@@ -325,8 +336,13 @@ describe('modules/js-file', function() {
325336
});
326337

327338
describe('findPrevToken', function() {
328-
var file = createJsFile('switch(varName){case"yes":a++;break;}');
329-
var tokens = file.getTokens();
339+
var file;
340+
var tokens;
341+
342+
beforeEach(function() {
343+
file = createJsFile('switch(varName){case"yes":a++;break;}');
344+
tokens = file.getTokens();
345+
});
330346

331347
it('should find the first previous token when only the type is specified', function() {
332348
var lastToken = tokens[tokens.length - 1];

test/rules/disallow-spaces-inside-parentheses.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ describe('rules/disallow-spaces-inside-parentheses', function() {
7575
it('should not report with no spaces around a regex', function() {
7676
assert(checker.checkString('expect(a).toMatch(/home/);').isEmpty());
7777
});
78+
79+
it('should not report with no spaces in an export default statement', function() {
80+
assert(checker.checkString('export default function() {}').isEmpty());
81+
});
7882
});
7983

8084
describe('"only" option', function() {

0 commit comments

Comments
 (0)