Skip to content

Commit 40baf44

Browse files
committed
state machine
1 parent 14ec643 commit 40baf44

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

find-fast.js

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var acorn = require('acorn');
22
var defined = require('defined');
3+
var nanostate = require('nanostate');
34

45
var ST_NONE = 0;
56
var ST_SAW_NAME = 1;
@@ -11,9 +12,26 @@ module.exports = function findFast(src, opts) {
1112
if (typeof src !== 'string') src = String(src);
1213
if (opts.word === undefined) opts.word = 'require';
1314

15+
var machine = nanostate('none', {
16+
none: {
17+
name: 'sawName',
18+
dot: 'memberExpression',
19+
reset: 'none'
20+
},
21+
sawName: {
22+
parenL: 'insideCall',
23+
dot: 'memberExpression',
24+
reset: 'none'
25+
},
26+
insideCall: {
27+
parenR: 'none',
28+
reset: 'none'
29+
},
30+
memberExpression: { reset: 'none' }
31+
});
32+
1433
var tokenizer = acorn.tokenizer(src, opts.parse);
1534
var token;
16-
var state = ST_NONE;
1735

1836
var opener;
1937
var args = [];
@@ -22,15 +40,15 @@ module.exports = function findFast(src, opts) {
2240
if (opts.nodes) modules.nodes = [];
2341

2442
while ((token = tokenizer.getToken()) && token.type !== acorn.tokTypes.eof) {
25-
if (state !== ST_INSIDE_CALL && token.type === acorn.tokTypes.dot) {
26-
state = ST_MEMBER_EXPRESSION;
27-
} else if (state === ST_NONE && token.type === acorn.tokTypes.name && mayBeRequire(token)) {
28-
state = ST_SAW_NAME;
43+
if (machine.state !== 'insideCall' && token.type === acorn.tokTypes.dot) {
44+
machine.emit('dot')
45+
} else if (machine.state === 'none' && token.type === acorn.tokTypes.name && mayBeRequire(token)) {
2946
opener = token;
30-
} else if (state === ST_SAW_NAME && token.type === acorn.tokTypes.parenL) {
31-
state = ST_INSIDE_CALL;
47+
machine.emit('name')
48+
} else if (machine.state === 'sawName' && token.type === acorn.tokTypes.parenL) {
3249
args = [];
33-
} else if (state === ST_INSIDE_CALL) {
50+
machine.emit('parenL')
51+
} else if (machine.state === 'insideCall') {
3452
if (token.type === acorn.tokTypes.parenR) { // End of fn() call
3553
if (args.length === 1 && args[0].type === acorn.tokTypes.string) {
3654
modules.strings.push(args[0].value);
@@ -46,12 +64,12 @@ module.exports = function findFast(src, opts) {
4664
modules.nodes.push(node);
4765
}
4866

49-
state = ST_NONE;
67+
machine.emit('parenR')
5068
} else {
5169
args.push(token);
5270
}
5371
} else {
54-
state = ST_NONE;
72+
machine.emit('reset');
5573
}
5674
}
5775
return modules;

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"dependencies": {
2020
"acorn": "^4.0.3",
2121
"defined": "^1.0.0",
22+
"nanostate": "^1.0.3",
2223
"shallow-copy": "0.0.1"
2324
},
2425
"devDependencies": {

0 commit comments

Comments
 (0)