@@ -522,6 +522,15 @@ define(['./esprimaAdapter', 'lang'], function (esprima, lang) {
522
522
node . left . property && node . left . property . name === 'amd' ;
523
523
} ;
524
524
525
+ //define.amd reference, as in: if (define.amd)
526
+ parse . refsDefineAmd = function ( node ) {
527
+ return node && node . type === 'MemberExpression' &&
528
+ node . object && node . object . name === 'define' &&
529
+ node . object . type === 'Identifier' &&
530
+ node . property && node . property . name === 'amd' &&
531
+ node . property . type === 'Identifier' ;
532
+ } ;
533
+
525
534
//require(), requirejs(), require.config() and requirejs.config()
526
535
parse . hasRequire = function ( node ) {
527
536
var callName ,
@@ -699,7 +708,7 @@ define(['./esprimaAdapter', 'lang'], function (esprima, lang) {
699
708
* Otherwise null.
700
709
*/
701
710
parse . parseNode = function ( node , onMatch ) {
702
- var name , deps , cjsDeps , arg , factory ,
711
+ var name , deps , cjsDeps , arg , factory , exp , refsDefine , bodyNode ,
703
712
args = node && node [ argPropName ] ,
704
713
callName = parse . hasRequire ( node ) ;
705
714
@@ -772,6 +781,36 @@ define(['./esprimaAdapter', 'lang'], function (esprima, lang) {
772
781
}
773
782
774
783
return onMatch ( "define" , null , name , deps , node ) ;
784
+ } else if ( node . type === 'CallExpression' && node . callee &&
785
+ node . callee . type === 'FunctionExpression' &&
786
+ node . callee . body && node . callee . body . body &&
787
+ node . callee . body . body . length === 1 &&
788
+ node . callee . body . body [ 0 ] . type === 'IfStatement' ) {
789
+ bodyNode = node . callee . body . body [ 0 ] ;
790
+ //Look for a define(Identifier) case, but only if inside an
791
+ //if that has a define.amd test
792
+ if ( bodyNode . consequent && bodyNode . consequent . body ) {
793
+ exp = bodyNode . consequent . body [ 0 ] ;
794
+ if ( exp . type === 'ExpressionStatement' && exp . expression &&
795
+ parse . hasDefine ( exp . expression ) &&
796
+ exp . expression . arguments &&
797
+ exp . expression . arguments . length === 1 &&
798
+ exp . expression . arguments [ 0 ] . type === 'Identifier' ) {
799
+
800
+ //Calls define(Identifier) as first statement in body.
801
+ //Confirm the if test references define.amd
802
+ traverse ( bodyNode . test , function ( node ) {
803
+ if ( parse . refsDefineAmd ( node ) ) {
804
+ refsDefine = true ;
805
+ return false ;
806
+ }
807
+ } ) ;
808
+
809
+ if ( refsDefine ) {
810
+ return onMatch ( "define" , null , null , null , exp . expression ) ;
811
+ }
812
+ }
813
+ }
775
814
}
776
815
} ;
777
816
0 commit comments