@@ -227,7 +227,9 @@ private module Cached {
227
227
} or
228
228
TSelfParameterNode ( MethodBase m ) or
229
229
TBlockParameterNode ( MethodBase m ) or
230
- TSynthHashSplatParameterNode ( MethodBase m ) { m .getAParameter ( ) instanceof KeywordParameter } or
230
+ TSynthHashSplatParameterNode ( DataFlowCallable c ) {
231
+ isParameterNode ( _, c , any ( ParameterPosition p | p .isKeyword ( _) ) )
232
+ } or
231
233
TExprPostUpdateNode ( CfgNodes:: ExprCfgNode n ) {
232
234
n instanceof Argument or
233
235
n = any ( CfgNodes:: ExprNodes:: InstanceVariableAccessCfgNode v ) .getReceiver ( )
@@ -477,10 +479,13 @@ private module ParameterNodes {
477
479
abstract class ParameterNodeImpl extends NodeImpl {
478
480
abstract Parameter getParameter ( ) ;
479
481
480
- abstract predicate isSourceParameterOf ( Callable c , ParameterPosition pos ) ;
482
+ abstract predicate isParameterOf ( DataFlowCallable c , ParameterPosition pos ) ;
481
483
482
- predicate isParameterOf ( DataFlowCallable c , ParameterPosition pos ) {
483
- this .isSourceParameterOf ( c .asCallable ( ) , pos )
484
+ final predicate isSourceParameterOf ( Callable c , ParameterPosition pos ) {
485
+ exists ( DataFlowCallable callable |
486
+ this .isParameterOf ( callable , pos ) and
487
+ c = callable .asCallable ( )
488
+ )
484
489
}
485
490
}
486
491
@@ -495,21 +500,23 @@ private module ParameterNodes {
495
500
496
501
override Parameter getParameter ( ) { result = parameter }
497
502
498
- override predicate isSourceParameterOf ( Callable c , ParameterPosition pos ) {
499
- exists ( int i | pos .isPositional ( i ) and c .getParameter ( i ) = parameter |
500
- parameter instanceof SimpleParameter
503
+ override predicate isParameterOf ( DataFlowCallable c , ParameterPosition pos ) {
504
+ exists ( Callable callable | callable = c .asCallable ( ) |
505
+ exists ( int i | pos .isPositional ( i ) and callable .getParameter ( i ) = parameter |
506
+ parameter instanceof SimpleParameter
507
+ or
508
+ parameter instanceof OptionalParameter
509
+ )
510
+ or
511
+ parameter =
512
+ any ( KeywordParameter kp |
513
+ callable .getAParameter ( ) = kp and
514
+ pos .isKeyword ( kp .getName ( ) )
515
+ )
501
516
or
502
- parameter instanceof OptionalParameter
517
+ parameter = callable .getAParameter ( ) .( HashSplatParameter ) and
518
+ pos .isHashSplat ( )
503
519
)
504
- or
505
- parameter =
506
- any ( KeywordParameter kp |
507
- c .getAParameter ( ) = kp and
508
- pos .isKeyword ( kp .getName ( ) )
509
- )
510
- or
511
- parameter = c .getAParameter ( ) .( HashSplatParameter ) and
512
- pos .isHashSplat ( )
513
520
}
514
521
515
522
override CfgScope getCfgScope ( ) { result = parameter .getCallable ( ) }
@@ -532,8 +539,8 @@ private module ParameterNodes {
532
539
533
540
override Parameter getParameter ( ) { none ( ) }
534
541
535
- override predicate isSourceParameterOf ( Callable c , ParameterPosition pos ) {
536
- method = c and pos .isSelf ( )
542
+ override predicate isParameterOf ( DataFlowCallable c , ParameterPosition pos ) {
543
+ method = c . asCallable ( ) and pos .isSelf ( )
537
544
}
538
545
539
546
override CfgScope getCfgScope ( ) { result = method }
@@ -558,8 +565,8 @@ private module ParameterNodes {
558
565
result = method .getAParameter ( ) and result instanceof BlockParameter
559
566
}
560
567
561
- override predicate isSourceParameterOf ( Callable c , ParameterPosition pos ) {
562
- c = method and pos .isBlock ( )
568
+ override predicate isParameterOf ( DataFlowCallable c , ParameterPosition pos ) {
569
+ c . asCallable ( ) = method and pos .isBlock ( )
563
570
}
564
571
565
572
override CfgScope getCfgScope ( ) { result = method }
@@ -612,37 +619,36 @@ private module ParameterNodes {
612
619
* collapsed anyway.
613
620
*/
614
621
class SynthHashSplatParameterNode extends ParameterNodeImpl , TSynthHashSplatParameterNode {
615
- private MethodBase method ;
622
+ private DataFlowCallable callable ;
616
623
617
- SynthHashSplatParameterNode ( ) { this = TSynthHashSplatParameterNode ( method ) }
618
-
619
- final Callable getMethod ( ) { result = method }
624
+ SynthHashSplatParameterNode ( ) { this = TSynthHashSplatParameterNode ( callable ) }
620
625
621
626
/**
622
627
* Gets a keyword parameter that will be the result of reading `c` out of this
623
628
* synthesized node.
624
629
*/
625
- NormalParameterNode getAKeywordParameter ( ContentSet c ) {
626
- exists ( KeywordParameter p |
627
- p = result .getParameter ( ) and
628
- p = method .getAParameter ( )
630
+ ParameterNode getAKeywordParameter ( ContentSet c ) {
631
+ exists ( string name |
632
+ isParameterNode ( result , callable , any ( ParameterPosition p | p .isKeyword ( name ) ) )
629
633
|
630
- c = getKeywordContent ( p . getName ( ) ) or
634
+ c = getKeywordContent ( name ) or
631
635
c .isSingleton ( TUnknownElementContent ( ) )
632
636
)
633
637
}
634
638
635
- override Parameter getParameter ( ) { none ( ) }
639
+ final override Parameter getParameter ( ) { none ( ) }
636
640
637
- override predicate isSourceParameterOf ( Callable c , ParameterPosition pos ) {
638
- c = method and pos .isHashSplat ( )
641
+ final override predicate isParameterOf ( DataFlowCallable c , ParameterPosition pos ) {
642
+ c = callable and pos .isHashSplat ( )
639
643
}
640
644
641
- override CfgScope getCfgScope ( ) { result = method }
645
+ final override CfgScope getCfgScope ( ) { result = callable . asCallable ( ) }
642
646
643
- override Location getLocationImpl ( ) { result = method . getLocation ( ) }
647
+ final override DataFlowCallable getEnclosingCallable ( ) { result = callable }
644
648
645
- override string toStringImpl ( ) { result = "**kwargs" }
649
+ final override Location getLocationImpl ( ) { result = callable .getLocation ( ) }
650
+
651
+ final override string toStringImpl ( ) { result = "**kwargs" }
646
652
}
647
653
648
654
/** A parameter for a library callable with a flow summary. */
@@ -654,8 +660,6 @@ private module ParameterNodes {
654
660
655
661
override Parameter getParameter ( ) { none ( ) }
656
662
657
- override predicate isSourceParameterOf ( Callable c , ParameterPosition pos ) { none ( ) }
658
-
659
663
override predicate isParameterOf ( DataFlowCallable c , ParameterPosition pos ) {
660
664
sc = c .asLibraryCallable ( ) and pos = pos_
661
665
}
0 commit comments