@@ -84,7 +84,9 @@ module SsaFlow {
8484 }
8585
8686 predicate localFlowStep ( SsaImpl:: DefinitionExt def , Node nodeFrom , Node nodeTo , boolean isUseStep ) {
87- Impl:: localFlowStep ( def , asNode ( nodeFrom ) , asNode ( nodeTo ) , isUseStep )
87+ Impl:: localFlowStep ( def , asNode ( nodeFrom ) , asNode ( nodeTo ) , isUseStep ) and
88+ // Flow out of property name parameter nodes are covered by `readStep`.
89+ not nodeFrom instanceof PipelineByPropertyNameParameter
8890 }
8991
9092 predicate localMustFlowStep ( SsaImpl:: DefinitionExt def , Node nodeFrom , Node nodeTo ) {
@@ -485,7 +487,7 @@ private module ParameterNodes {
485487 )
486488 )
487489 or
488- parameter .isPipeline ( ) and
490+ ( parameter .isPipeline ( ) or parameter . isPipelineByPropertyName ( ) ) and
489491 pos .isPipeline ( )
490492 )
491493 }
@@ -498,6 +500,12 @@ private module ParameterNodes {
498500
499501 override string toStringImpl ( ) { result = parameter .toString ( ) }
500502 }
503+
504+ class PipelineByPropertyNameParameter extends NormalParameterNode {
505+ PipelineByPropertyNameParameter ( ) { this .getParameter ( ) .isPipelineByPropertyName ( ) }
506+
507+ string getPropretyName ( ) { result = this .getParameter ( ) .getName ( ) }
508+ }
501509}
502510
503511import ParameterNodes
@@ -749,6 +757,13 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
749757 node1 .( ProcessNode ) .getIteratorVariable ( ) = def .getSourceVariable ( ) and
750758 SsaImpl:: firstRead ( def , node2 .asExpr ( ) )
751759 )
760+ or
761+ exists ( Content:: KnownElementContent ec , SsaImpl:: DefinitionExt def |
762+ c .isSingleton ( ec ) and
763+ node1 .( PipelineByPropertyNameParameter ) .getPropretyName ( ) = ec .getIndex ( ) .asString ( ) and
764+ def .getSourceVariable ( ) = node1 .( PipelineByPropertyNameParameter ) .getParameter ( ) and
765+ SsaImpl:: firstRead ( def , node2 .asExpr ( ) )
766+ )
752767}
753768
754769/**
@@ -777,6 +792,11 @@ predicate expectsContent(Node n, ContentSet c) {
777792 or
778793 n instanceof ProcessNode and
779794 c .isAnyElement ( )
795+ or
796+ exists ( Content:: KnownElementContent ec |
797+ ec .getIndex ( ) .asString ( ) = n .( PipelineByPropertyNameParameter ) .getPropretyName ( ) and
798+ c .isSingleton ( ec )
799+ )
780800}
781801
782802class DataFlowType extends TDataFlowType {
0 commit comments