@@ -64,8 +64,10 @@ module EventEmitter {
6464 DataFlow:: SourceNode ref ( ) { result = ref ( DataFlow:: TypeTracker:: end ( ) ) }
6565 }
6666
67- private class NodeJSEventEmitter extends Range {
68- NodeJSEventEmitter ( ) {
67+ abstract class NodeJSEventEmitter extends Range { }
68+
69+ private class ImportedNodeJSEventEmitter extends NodeJSEventEmitter {
70+ ImportedNodeJSEventEmitter ( ) {
6971 exists ( DataFlow:: SourceNode clazz |
7072 clazz = DataFlow:: moduleImport ( "events" ) or
7173 clazz = DataFlow:: moduleMember ( "events" , "EventEmitter" )
@@ -107,35 +109,35 @@ module EventEmitter {
107109 }
108110
109111 module EventRegistration {
110- abstract class Range extends DataFlow:: Node {
112+ abstract class Range extends DataFlow:: CallNode {
111113 EventEmitterRange:: Range emitter ;
112114
113115 final EventEmitter getEmitter ( ) { result = emitter }
114116
115- abstract string getChannel ( ) ;
117+ string getChannel ( ) {
118+ this .getArgument ( 0 ) .mayHaveStringValue ( result )
119+ }
116120
117- abstract DataFlow:: Node getEventHandlerParameter ( int i ) ;
121+ DataFlow:: Node getEventHandlerParameter ( int i ) {
122+ result = this .getABoundCallbackParameter ( 1 , i )
123+ }
118124
119125 DataFlow:: Node getAReturnedValue ( ) { none ( ) }
120126
121127 predicate canReturnTo ( EventDispatch dispatch ) { none ( ) }
122128 }
123129
124130 private class NodeJSEventRegistration extends Range , DataFlow:: MethodCallNode {
125- NodeJSEventRegistration ( ) { this = emitter .ref ( ) .getAMethodCall ( EventEmitter:: on ( ) ) }
126-
127- override string getChannel ( ) { this .getArgument ( 0 ) .mayHaveStringValue ( result ) }
131+ override EventEmitterRange:: NodeJSEventEmitter emitter ;
128132
129- override DataFlow:: Node getEventHandlerParameter ( int i ) {
130- result = this .( DataFlow:: MethodCallNode ) .getABoundCallbackParameter ( 1 , i )
131- }
133+ NodeJSEventRegistration ( ) { this = emitter .ref ( ) .getAMethodCall ( EventEmitter:: on ( ) ) }
132134 }
133135 }
134136
135137 /**
136138 * A dispatch of an event on an EventEmitter.
137139 */
138- final class EventDispatch extends DataFlow:: Node {
140+ final class EventDispatch extends DataFlow:: CallNode {
139141 EventDispatch:: Range range ;
140142
141143 EventDispatch ( ) { this = range }
@@ -157,26 +159,28 @@ module EventEmitter {
157159 }
158160
159161 module EventDispatch {
160- abstract class Range extends DataFlow:: Node {
162+ abstract class Range extends DataFlow:: CallNode {
161163 EventEmitterRange:: Range emitter ;
162164
163165 final EventEmitter getEmitter ( ) { result = emitter }
164166
165- abstract string getChannel ( ) ;
167+ string getChannel ( ) {
168+ this .getArgument ( 0 ) .mayHaveStringValue ( result )
169+ }
166170
167- abstract DataFlow:: Node getDispatchedArgument ( int i ) ;
171+ DataFlow:: Node getDispatchedArgument ( int i ) {
172+ result = this .getArgument ( i + 1 )
173+ }
168174
169175 predicate canSendTo ( EventRegistration destination ) {
170176 this .getEmitter ( ) = destination .getEmitter ( )
171177 }
172178 }
173179
174180 private class NodeJSEventDispatch extends Range , DataFlow:: MethodCallNode {
175- NodeJSEventDispatch ( ) { this = emitter .ref ( ) .getAMethodCall ( "emit" ) }
176-
177- override string getChannel ( ) { this .getArgument ( 0 ) .mayHaveStringValue ( result ) }
181+ override EventEmitterRange:: NodeJSEventEmitter emitter ;
178182
179- override DataFlow :: Node getDispatchedArgument ( int i ) { result = this . getArgument ( i + 1 ) }
183+ NodeJSEventDispatch ( ) { this = emitter . ref ( ) . getAMethodCall ( "emit" ) }
180184 }
181185 }
182186
0 commit comments