@@ -610,6 +610,17 @@ public void visit(MethodDeclaration n, Void arg) {
610610 .annotations (annotations )
611611 .isLambda (false ).filePath (filePath ).build ());
612612
613+ int pIndex = 0 ;
614+ for (com .github .javaparser .ast .body .Parameter p : n .getParameters ()) {
615+ String paramName = p .getNameAsString ();
616+ String paramType = stripGenerics (p .getTypeAsString ());
617+ String paramId = fqn + ".param" + pIndex ;
618+ context .parameters .put (paramId , ParameterNode .builder ()
619+ .id (paramId ).methodFqn (fqn )
620+ .name (paramName ).typeFqn (paramType ).index (pIndex ).build ());
621+ pIndex ++;
622+ }
623+
613624 if (currentClassFqn != null ) {
614625 boolean hasAutowired = annotations .stream ().anyMatch (a -> a .name .equals ("Autowired" ) || a .name .equals ("Inject" ));
615626 if (hasAutowired && n .getParameters ().isNonEmpty ()) {
@@ -649,6 +660,17 @@ public void visit(ConstructorDeclaration n, Void arg) {
649660 .annotations (annotations )
650661 .isLambda (false ).filePath (filePath ).build ());
651662
663+ int pIndex = 0 ;
664+ for (com .github .javaparser .ast .body .Parameter p : n .getParameters ()) {
665+ String paramName = p .getNameAsString ();
666+ String paramType = stripGenerics (p .getTypeAsString ());
667+ String paramId = fqn + ".param" + pIndex ;
668+ context .parameters .put (paramId , ParameterNode .builder ()
669+ .id (paramId ).methodFqn (fqn )
670+ .name (paramName ).typeFqn (paramType ).index (pIndex ).build ());
671+ pIndex ++;
672+ }
673+
652674 if (currentClassFqn != null ) {
653675 boolean hasAutowired = annotations .stream ().anyMatch (a -> a .name .equals ("Autowired" ) || a .name .equals ("Inject" ));
654676 boolean isImplicit = false ;
@@ -699,6 +721,47 @@ public void visit(InitializerDeclaration n, Void arg) {
699721 currentMethodFqn = prev ;
700722 }
701723
724+ @ Override
725+ public void visit (VariableDeclarator n , Void arg ) {
726+ if (currentMethodFqn != null ) {
727+ String varName = n .getNameAsString ();
728+ String varType = stripGenerics (n .getTypeAsString ());
729+ String varId = currentMethodFqn + "." + varName ;
730+ context .variables .put (varId , VariableNode .builder ()
731+ .id (varId ).methodFqn (currentMethodFqn )
732+ .name (varName ).typeFqn (varType ).build ());
733+ }
734+ super .visit (n , arg );
735+ }
736+
737+ @ Override
738+ public void visit (AssignExpr n , Void arg ) {
739+ if (currentMethodFqn != null ) {
740+ String targetId = null ;
741+ if (n .getTarget ().isFieldAccessExpr ()) {
742+ targetId = currentClassFqn + "." + n .getTarget ().asFieldAccessExpr ().getNameAsString ();
743+ } else if (n .getTarget ().isNameExpr ()) {
744+ String name = n .getTarget ().asNameExpr ().getNameAsString ();
745+ if (searchClassForField (currentClassFqn , name ) != null ) {
746+ targetId = currentClassFqn + "." + name ;
747+ }
748+ }
749+
750+ if (targetId != null ) {
751+ String sourceName = null ;
752+ if (n .getValue ().isNameExpr ()) {
753+ sourceName = currentMethodFqn + "." + n .getValue ().asNameExpr ().getNameAsString ();
754+ } else if (n .getValue ().isFieldAccessExpr ()) {
755+ sourceName = currentClassFqn + "." + n .getValue ().asFieldAccessExpr ().getNameAsString ();
756+ }
757+ if (sourceName != null ) {
758+ context .dataFlowEdges .add (new DataFlowEdge (sourceName , targetId , "MUTATES" ));
759+ }
760+ }
761+ }
762+ super .visit (n , arg );
763+ }
764+
702765 @ Override
703766 public void visit (FieldDeclaration n , Void arg ) {
704767 if (currentClassFqn != null ) {
@@ -810,8 +873,8 @@ public void visit(LambdaExpr n, Void arg) {
810873
811874 @ Override
812875 public void visit (MethodCallExpr n , Void arg ) {
876+ String calledFqn = null ;
813877 if (currentMethodFqn != null ) {
814- String calledFqn = null ;
815878 boolean resolvedViaSolver = false ;
816879 if (!config .isFastResolve ()) {
817880 try {
@@ -833,6 +896,22 @@ public void visit(MethodCallExpr n, Void arg) {
833896 if (!resolvedViaSolver )
834897 calledFqn = deduceFqnManually (n );
835898 addCall (calledFqn );
899+
900+ int argIndex = 0 ;
901+ for (Expression argExpr : n .getArguments ()) {
902+ if (argExpr .isNameExpr ()) {
903+ String argName = argExpr .asNameExpr ().getNameAsString ();
904+ String sourceId = currentMethodFqn + "." + argName ;
905+ String targetId = calledFqn + ".param" + argIndex ;
906+ context .dataFlowEdges .add (new DataFlowEdge (sourceId , targetId , "PASSED_TO" ));
907+ } else if (argExpr .isFieldAccessExpr ()) {
908+ String argName = argExpr .asFieldAccessExpr ().getNameAsString ();
909+ String sourceId = currentClassFqn + "." + argName ;
910+ String targetId = calledFqn + ".param" + argIndex ;
911+ context .dataFlowEdges .add (new DataFlowEdge (sourceId , targetId , "PASSED_TO" ));
912+ }
913+ argIndex ++;
914+ }
836915 }
837916 super .visit (n , arg );
838917 }
0 commit comments