55import csharp
66private import semmle.code.csharp.dataflow.internal.DelegateDataFlow
77private import semmle.code.csharp.dispatch.Dispatch
8- private import dotnet
98
109// Internal representation of call contexts
1110cached
1211private newtype TCallContext =
1312 TEmptyCallContext ( ) or
14- TArgNonDelegateCallContext ( DispatchCall dc , int i ) { exists ( dc .getArgument ( i ) ) } or
13+ TArgNonDelegateCallContext ( Expr arg ) { exists ( DispatchCall dc | arg = dc .getArgument ( _ ) ) } or
1514 TArgDelegateCallContext ( DelegateCall dc , int i ) { exists ( dc .getArgument ( i ) ) } or
1615 TDelegateToLibraryCallableArgCallContext ( DelegateArgumentToLibraryCallable arg , int i ) {
1716 exists ( arg .getDelegateType ( ) .getParameter ( i ) )
@@ -46,25 +45,22 @@ abstract class ArgumentCallContext extends CallContext {
4645 * Holds if this call context represents the argument at position `i` of the
4746 * call expression `call`.
4847 */
49- abstract predicate isArgument ( DotNet :: Expr call , int i ) ;
48+ abstract predicate isArgument ( Expr call , int i ) ;
5049}
5150
5251/** An argument of a non-delegate call. */
5352class NonDelegateCallArgumentCallContext extends ArgumentCallContext , TArgNonDelegateCallContext {
54- DispatchCall dc ;
53+ Expr arg ;
5554
56- int arg ;
57-
58- NonDelegateCallArgumentCallContext ( ) { this = TArgNonDelegateCallContext ( dc , arg ) }
55+ NonDelegateCallArgumentCallContext ( ) { this = TArgNonDelegateCallContext ( arg ) }
5956
60- override predicate isArgument ( DotNet:: Expr call , int i ) {
61- call = dc .getCall ( ) and
62- i = arg
57+ override predicate isArgument ( Expr call , int i ) {
58+ exists ( DispatchCall dc | arg = dc .getArgument ( i ) | call = dc .getCall ( ) )
6359 }
6460
65- override string toString ( ) { result = dc . getArgument ( arg ) .toString ( ) }
61+ override string toString ( ) { result = arg .toString ( ) }
6662
67- override Location getLocation ( ) { result = dc . getArgument ( arg ) .getLocation ( ) }
63+ override Location getLocation ( ) { result = arg .getLocation ( ) }
6864}
6965
7066/** An argument of a delegate call. */
@@ -75,7 +71,7 @@ class DelegateCallArgumentCallContext extends ArgumentCallContext, TArgDelegateC
7571
7672 DelegateCallArgumentCallContext ( ) { this = TArgDelegateCallContext ( dc , arg ) }
7773
78- override predicate isArgument ( DotNet :: Expr call , int i ) {
74+ override predicate isArgument ( Expr call , int i ) {
7975 call = dc and
8076 i = arg
8177 }
@@ -96,15 +92,15 @@ class DelegateCallArgumentCallContext extends ArgumentCallContext, TArgDelegateC
9692 */
9793class DelegateArgumentToLibraryCallableArgumentContext extends ArgumentCallContext ,
9894 TDelegateToLibraryCallableArgCallContext {
99- DotNet :: Expr delegate ;
95+ Expr delegate ;
10096
10197 int arg ;
10298
10399 DelegateArgumentToLibraryCallableArgumentContext ( ) {
104100 this = TDelegateToLibraryCallableArgCallContext ( delegate , arg )
105101 }
106102
107- override predicate isArgument ( DotNet :: Expr call , int i ) {
103+ override predicate isArgument ( Expr call , int i ) {
108104 call = delegate and
109105 i = arg
110106 }
0 commit comments