From af90d4c48cda4d2951c41d762c82e4947640d41e Mon Sep 17 00:00:00 2001 From: Phodal Huang Date: Sun, 15 Dec 2019 15:54:20 +0800 Subject: [PATCH] feat: add basic call svg --- .gitignore | 4 +++- cmd/call_graph.go | 10 +++++++++- src/domain/call_graph.go | 13 ++++++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index b48afc8..e90d51d 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 d0c7743..8a3c559 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 edd40a6..4a020df 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 { -- GitLab