@@ -146,26 +146,31 @@ class ServiceInstanceFromCdsServe extends ServiceInstance {
146146 * const Service1 = cds.connect.to("service-2");
147147 * ```
148148 */
149- class ServiceInstanceFromCdsConnectTo extends ServiceInstance , SourceNode {
149+ class ServiceInstanceFromCdsConnectTo extends ServiceInstance , SourceNode instanceof PropRead {
150+ string serviceDesignator ;
150151 string serviceName ;
151152
152- ServiceInstanceFromCdsConnectTo ( ) { this = serviceInstanceFromCdsConnectTo ( serviceName ) }
153+ ServiceInstanceFromCdsConnectTo ( ) {
154+ this = serviceInstanceFromCdsConnectTo ( serviceDesignator ) .getAPropertyRead ( serviceName )
155+ }
153156
154157 override UserDefinedApplicationService getDefinition ( ) {
155158 /* 1. The service */
156159 exists ( RequiredService serviceDecl |
157- serviceDecl .getName ( ) = serviceName and
160+ serviceDecl .getName ( ) = [ serviceName , serviceDesignator ] and
158161 result .hasLocationInfo ( serviceDecl .getImplementationFile ( ) .getAbsolutePath ( ) , _, _, _, _)
159162 )
160163 or
161- result .getUnqualifiedName ( ) = serviceName
164+ result .getUnqualifiedName ( ) = serviceDesignator
162165 }
163166
167+ string getServiceDesignator ( ) { result = serviceDesignator }
168+
164169 string getServiceName ( ) { result = serviceName }
165170}
166171
167172class DBServiceInstanceFromCdsConnectTo extends ServiceInstanceFromCdsConnectTo {
168- DBServiceInstanceFromCdsConnectTo ( ) { serviceName = "db" }
173+ DBServiceInstanceFromCdsConnectTo ( ) { serviceDesignator = "db" }
169174}
170175
171176/**
@@ -639,15 +644,15 @@ abstract class EntityReference extends CdsReference {
639644 */
640645class EntityReferenceFromEntities extends EntityReference instanceof PropRead {
641646 /**
642- * Property or call to entities
647+ * A read from property `entities` or a method call to ` entities`.
643648 */
644649 DataFlow:: SourceNode entitiesAccess ;
645650 /**
646- * Receiver of the entities call or the base of propread
651+ * The receiver of the call to `entities` or the base of the read from `entities`.
647652 */
648653 DataFlow:: Node receiver ;
649654 /**
650- * Name of the (unqualified) entity being accessed
655+ * The unqualified name of the entity being accessed.
651656 */
652657 string entityName ;
653658
@@ -748,14 +753,16 @@ class EntityReferenceFromCqlClause extends EntityReference, ExprNode {
748753}
749754
750755/**
751- * The `"data"` property of the handler's parameter that represents the request or message passed to this handler.
752- * This property carries the user-provided payload provided to the CAP application. e.g.
756+ * The `"data"` property of the handler's parameter that represents the request or message
757+ * passed to this handler. This property carries the user-provided payload provided to the
758+ * CAP application. e.g.
753759 * ``` javascript
754760 * srv.on("send", async (msg) => {
755761 * const { payload } = msg.data;
756762 * })
757763 * ```
758- * The `payload` carries the data that is sent to this application on the action or event named `send`.
764+ * The `payload` carries the data that is sent to this application on the action or event
765+ * named `send`.
759766 */
760767class HandlerParameterData instanceof PropRead {
761768 HandlerParameter handlerParameter ;
@@ -807,7 +814,7 @@ abstract class CqlQueryRunnerCall extends MethodCallNode {
807814 string methodName ;
808815
809816 CqlQueryRunnerCall ( ) {
810- this = base .getAMemberCall ( methodName ) and
817+ this = base .getAMemberInvocation ( methodName ) and
811818 (
812819 /*
813820 * 1. Method call on the CDS facade or the base database service,
@@ -820,28 +827,87 @@ abstract class CqlQueryRunnerCall extends MethodCallNode {
820827 exists ( ServiceInstance srv | base = srv )
821828 )
822829 }
830+
831+ /**
832+ * Gets an argument to this runner call, including the subsequent builder functions
833+ * called in a chained manner on this one.
834+ */
835+ abstract DataFlow:: Node getAQueryParameter ( ) ;
823836}
824837
825838class CqlRunMethodCall extends CqlQueryRunnerCall {
826839 CqlRunMethodCall ( ) { this .getMethodName ( ) = "run" }
840+
841+ override DataFlow:: Node getAQueryParameter ( ) { result = this .getArgument ( 0 ) }
827842}
828843
829- class CqlReadMethodCall extends CqlQueryRunnerCall {
844+ class CqlShortcutMethodCall extends CqlQueryRunnerCall {
845+ CqlShortcutMethodCall ( ) {
846+ this .getMethodName ( ) = [ "read" , "create" , "update" , "delete" , "insert" , "upsert" ]
847+ }
848+
849+ abstract override DataFlow:: Node getAQueryParameter ( ) ;
850+ }
851+
852+ class CqlReadMethodCall extends CqlShortcutMethodCall {
830853 CqlReadMethodCall ( ) { this .getMethodName ( ) = "read" }
854+
855+ override DataFlow:: Node getAQueryParameter ( ) {
856+ result = this .getAChainedMethodCall ( _) .getAnArgument ( )
857+ }
831858}
832859
833- class CqlCreateMethodCall extends CqlQueryRunnerCall {
860+ class CqlCreateMethodCall extends CqlShortcutMethodCall {
834861 CqlCreateMethodCall ( ) { this .getMethodName ( ) = "create" }
862+
863+ override DataFlow:: Node getAQueryParameter ( ) {
864+ exists ( DataFlow:: CallNode chainedMethodCall |
865+ chainedMethodCall = this .getAChainedMethodCall ( _)
866+ |
867+ result = chainedMethodCall .getAnArgument ( ) or
868+ result = chainedMethodCall .getAnArgument ( ) .( SourceNode ) .getAPropertyWrite ( ) .getRhs ( )
869+ )
870+ }
835871}
836872
837- class CqlUpdateMethodCall extends CqlQueryRunnerCall {
873+ class CqlUpdateMethodCall extends CqlShortcutMethodCall {
838874 CqlUpdateMethodCall ( ) { this .getMethodName ( ) = "update" }
875+
876+ override DataFlow:: Node getAQueryParameter ( ) {
877+ result = this .getAChainedMethodCall ( _) .getAnArgument ( )
878+ }
839879}
840880
841- class CqlDeleteMethodCall extends CqlQueryRunnerCall {
881+ class CqlDeleteMethodCall extends CqlShortcutMethodCall {
842882 CqlDeleteMethodCall ( ) { this .getMethodName ( ) = "delete" }
883+
884+ override DataFlow:: Node getAQueryParameter ( ) {
885+ result = this .getAChainedMethodCall ( _) .getAnArgument ( )
886+ }
843887}
844888
845- class CqlInsertMethodCall extends CqlQueryRunnerCall {
889+ class CqlInsertMethodCall extends CqlShortcutMethodCall {
846890 CqlInsertMethodCall ( ) { this .getMethodName ( ) = "insert" }
891+
892+ override DataFlow:: Node getAQueryParameter ( ) {
893+ exists ( DataFlow:: CallNode chainedMethodCall |
894+ chainedMethodCall = this .getAChainedMethodCall ( _)
895+ |
896+ result = chainedMethodCall .getAnArgument ( ) or
897+ result = chainedMethodCall .getAnArgument ( ) .( SourceNode ) .getAPropertyWrite ( ) .getRhs ( )
898+ )
899+ }
900+ }
901+
902+ class CqlUpsertMethodCall extends CqlShortcutMethodCall {
903+ CqlUpsertMethodCall ( ) { this .getMethodName ( ) = "upsert" }
904+
905+ override DataFlow:: Node getAQueryParameter ( ) {
906+ exists ( DataFlow:: CallNode chainedMethodCall |
907+ chainedMethodCall = this .getAChainedMethodCall ( _)
908+ |
909+ result = chainedMethodCall .getAnArgument ( ) or
910+ result = chainedMethodCall .getAnArgument ( ) .( SourceNode ) .getAPropertyWrite ( ) .getRhs ( )
911+ )
912+ }
847913}
0 commit comments