@@ -382,6 +382,12 @@ private class DictionarySubscriptNode extends NodeImpl, TDictionarySubscriptNode
382382 SubscriptExpr getExpr ( ) { result = expr }
383383}
384384
385+ private class ClosureSelfReferenceNode extends ExprNodeImpl {
386+ override ClosureExpr expr ;
387+
388+ ClosureExpr getClosure ( ) { result = expr }
389+ }
390+
385391private module ParameterNodes {
386392 abstract class ParameterNodeImpl extends NodeImpl {
387393 predicate isParameterOf ( DataFlowCallable c , ParameterPosition pos ) { none ( ) }
@@ -412,6 +418,13 @@ private module ParameterNodes {
412418 override ParamDecl getParameter ( ) { result = param }
413419 }
414420
421+ class ClosureSelfParameterNode extends ParameterNodeImpl , ClosureSelfReferenceNode {
422+ override predicate isParameterOf ( DataFlowCallable c , ParameterPosition pos ) {
423+ c .asSourceCallable ( ) = this .getClosure ( ) and
424+ pos instanceof ClosureSelfParameter
425+ }
426+ }
427+
415428 class SummaryParameterNode extends ParameterNodeImpl , FlowSummaryNode {
416429 SummaryParameterNode ( ) {
417430 FlowSummaryImpl:: Private:: summaryParameterNode ( this .getSummaryNode ( ) , _)
@@ -626,6 +639,18 @@ private module ArgumentNodes {
626639 pos = TPositionalArgument ( 0 )
627640 }
628641 }
642+
643+ class SelfClosureArgumentNode extends ExprNode , ArgumentNode {
644+ ApplyExprCfgNode apply ;
645+
646+ SelfClosureArgumentNode ( ) { n = apply .getFunction ( ) }
647+
648+ override predicate argumentOf ( DataFlowCall call , ArgumentPosition pos ) {
649+ apply = call .asCall ( ) and
650+ not exists ( apply .getStaticTarget ( ) ) and
651+ pos instanceof ClosureSelfArgument
652+ }
653+ }
629654}
630655
631656import ArgumentNodes
@@ -878,8 +903,8 @@ private module CaptureInput implements VariableCapture::InputSig {
878903 source = a .getSource ( )
879904 )
880905 or
881- exists ( S:: PatternBindingDecl pbd , S :: NamedPattern np | this = pbd and pbd . getAPattern ( ) = np |
882- np .getVarDecl ( ) = variable and
906+ exists ( S:: NamedPattern np | this = np |
907+ variable = np .getVarDecl ( ) and
883908 source = np .getMatchingExpr ( )
884909 )
885910 // TODO: support multiple variables in LHS of =, in both of above cases.
@@ -918,13 +943,23 @@ class CapturedParameter = CaptureInput::CapturedParameter;
918943module CaptureFlow = VariableCapture:: Flow< CaptureInput > ;
919944
920945private CaptureFlow:: ClosureNode asClosureNode ( Node n ) {
921- result = n .( CaptureNode ) .getSynthesizedCaptureNode ( ) or
922- result .( CaptureFlow:: ExprNode ) .getExpr ( ) = n .asExpr ( ) or
946+ result = n .( CaptureNode ) .getSynthesizedCaptureNode ( )
947+ or
948+ result .( CaptureFlow:: ExprNode ) .getExpr ( ) = n .asExpr ( )
949+ or
923950 result .( CaptureFlow:: ExprPostUpdateNode ) .getExpr ( ) =
924- n .( PostUpdateNode ) .getPreUpdateNode ( ) .asExpr ( ) or
925- result .( CaptureFlow:: ParameterNode ) .getParameter ( ) = n .getParameter ( ) or
926- result .( CaptureFlow:: ThisParameterNode ) .getCallable ( ) .getSelfParam ( ) = n .getParameter ( ) or
951+ n .( PostUpdateNode ) .getPreUpdateNode ( ) .asExpr ( )
952+ or
953+ result .( CaptureFlow:: ParameterNode ) .getParameter ( ) = n .getParameter ( )
954+ or
955+ result .( CaptureFlow:: ThisParameterNode ) .getCallable ( ) = n .( ClosureSelfParameterNode ) .getClosure ( )
956+ or
927957 result .( CaptureFlow:: MallocNode ) .getClosureExpr ( ) = n .getCfgNode ( ) .getNode ( ) .asAstNode ( ) // TODO: figure out why the java version had PostUpdateNode logic here
958+ or
959+ exists ( CaptureInput:: VariableWrite write |
960+ result .( CaptureFlow:: VariableWriteSourceNode ) .getVariableWrite ( ) = write and
961+ n .asExpr ( ) = write .getSource ( )
962+ )
928963}
929964
930965private predicate captureStoreStep ( Node node1 , Content:: CapturedVariableContent c , Node node2 ) {
0 commit comments