11var acorn = require ( 'acorn' ) ;
22var defined = require ( 'defined' ) ;
3+ var nanostate = require ( 'nanostate' ) ;
34
45var ST_NONE = 0 ;
56var 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 ;
0 commit comments