diff --git a/.gitignore b/.gitignore index b48afc8b3d7a49fb2a8acc17d6499d5c5540321f..e90d51dfaf2903314e346abc5e074e2b9f6b889b 100644 --- a/.gitignore +++ b/.gitignore @@ -56,4 +56,6 @@ web/ bs.json nodeInfos.json apis.json -output.dot \ No newline at end of file +output.dot +call.dot +call.svg \ No newline at end of file diff --git a/cmd/call_graph.go b/cmd/call_graph.go index d0c7743a1e1329c1dd9991ac461c8292db88cab7..8a3c559aae099c748446a4644223fcdcb79e3558 100644 --- a/cmd/call_graph.go +++ b/cmd/call_graph.go @@ -7,6 +7,7 @@ import ( "encoding/json" "github.com/spf13/cobra" "log" + "os/exec" ) @@ -28,7 +29,14 @@ var callGraphCmd *cobra.Command = &cobra.Command{ _ = json.Unmarshal(file, &parsedDeps) - analyser.Analysis(className, *&parsedDeps) + content := analyser.Analysis(className, *&parsedDeps) + WriteToFile("call.dot", content) + + cmd := exec.Command("dot", []string{"-Tsvg", "call.dot", "-o", "call.svg"}...) + _, err := cmd.CombinedOutput() + if err != nil { + log.Fatalf("cmd.Run() failed with %s\n", err) + } } }, } diff --git a/src/domain/call_graph.go b/src/domain/call_graph.go index edd40a6996b2a03be9636940dc904f0159968f51..4a020df9815c3bc6edc7cfa5d00e1b70f9851253 100644 --- a/src/domain/call_graph.go +++ b/src/domain/call_graph.go @@ -2,7 +2,6 @@ package domain import ( "coca/src/adapter/models" - "fmt" ) type CallGraph struct { @@ -12,12 +11,20 @@ func NewCallGraph() CallGraph { return *&CallGraph{} } -func (c CallGraph) Analysis(funcName string, clzs []models.JClassNode) { +func (c CallGraph) Analysis(funcName string, clzs []models.JClassNode) string { methodMap := c.BuildMethodMap(clzs) BuildCallChain(funcName, methodMap) chain := BuildCallChain(funcName, methodMap) - fmt.Println(chain) + dotContent := toGraphviz(chain) + return dotContent +} + +func toGraphviz(chain string) string { + var result = "digraph G { \n" + result = result + chain + result = result + "}\n" + return result } func BuildCallChain(funcName string, methodMap map[string][]string) string {