5
5
import javascript
6
6
7
7
module Closure {
8
+ /** A call to `goog.require` */
9
+ class RequireCallExpr extends CallExpr {
10
+ RequireCallExpr ( ) { this .getCallee ( ) .( PropAccess ) .getQualifiedName ( ) = "goog.require" }
11
+
12
+ /** Gets the imported namespace name. */
13
+ string getClosureNamespace ( ) { result = this .getArgument ( 0 ) .getStringValue ( ) }
14
+ }
15
+
16
+ /** A call to `goog.module` or `goog.declareModuleId`. */
17
+ private class ModuleDeclarationCall extends CallExpr {
18
+ private string kind ;
19
+
20
+ ModuleDeclarationCall ( ) {
21
+ this .getCallee ( ) .( PropAccess ) .getQualifiedName ( ) = kind and
22
+ kind = [ "goog.module" , "goog.declareModuleId" ]
23
+ }
24
+
25
+ /** Gets the declared namespace. */
26
+ string getClosureNamespace ( ) { result = this .getArgument ( 0 ) .getStringValue ( ) }
27
+
28
+ /** Gets the string `goog.module` or `goog.declareModuleId` depending on which method is being called. */
29
+ string getModuleKind ( ) { result = kind }
30
+ }
31
+
8
32
/**
9
33
* A reference to a Closure namespace.
10
34
*/
@@ -109,38 +133,26 @@ module Closure {
109
133
class ClosureModuleDeclaration extends ClosureNamespaceRef , DataFlow:: MethodCallNode instanceof DefaultClosureModuleDeclaration
110
134
{ }
111
135
112
- private GlobalVariable googVariable ( ) { variables ( result , "goog" , any ( GlobalScope sc ) ) }
113
-
114
- pragma [ nomagic]
115
- private MethodCallExpr googModuleDeclExpr ( ) {
116
- result .getReceiver ( ) = googVariable ( ) .getAnAccess ( ) and
117
- result .getMethodName ( ) = [ "module" , "declareModuleId" ]
118
- }
119
-
120
- pragma [ nomagic]
121
- private MethodCallExpr googModuleDeclExprInContainer ( StmtContainer container ) {
122
- result = googModuleDeclExpr ( ) and
123
- container = result .getContainer ( )
124
- }
125
-
126
136
pragma [ noinline]
127
- private ClosureRequireCall getARequireInTopLevel ( ClosureModule m ) { result .getTopLevel ( ) = m }
137
+ private RequireCallExpr getARequireInTopLevel ( ClosureModule m ) { result .getTopLevel ( ) = m }
128
138
129
139
/**
130
140
* A module using the Closure module system, declared using `goog.module()` or `goog.declareModuleId()`.
131
141
*/
132
142
class ClosureModule extends Module {
133
- ClosureModule ( ) { exists ( googModuleDeclExprInContainer ( this ) ) }
143
+ private ModuleDeclarationCall decl ;
144
+
145
+ ClosureModule ( ) { decl .getTopLevel ( ) = this }
134
146
135
147
/**
136
148
* Gets the call to `goog.module` or `goog.declareModuleId` in this module.
137
149
*/
138
- ClosureModuleDeclaration getModuleDeclaration ( ) { result .getTopLevel ( ) = this }
150
+ deprecated ClosureModuleDeclaration getModuleDeclaration ( ) { result .getTopLevel ( ) = this }
139
151
140
152
/**
141
153
* Gets the namespace of this module.
142
154
*/
143
- string getClosureNamespace ( ) { result = this . getModuleDeclaration ( ) .getClosureNamespace ( ) }
155
+ string getClosureNamespace ( ) { result = decl .getClosureNamespace ( ) }
144
156
145
157
override Module getAnImportedModule ( ) {
146
158
result .( ClosureModule ) .getClosureNamespace ( ) =
@@ -156,7 +168,7 @@ module Closure {
156
168
* Has no result for ES6 modules using `goog.declareModuleId`.
157
169
*/
158
170
Variable getExportsVariable ( ) {
159
- this . getModuleDeclaration ( ) . getMethodName ( ) = "module" and
171
+ decl . getModuleKind ( ) = "goog. module" and
160
172
result = this .getScope ( ) .getVariable ( "exports" )
161
173
}
162
174
0 commit comments