api_call_graph_snippet (private)
api_call_graph_snippet -proc_name proc_name [ -dpi dpi ] \ [ -format format ] [ -maxnodes maxnodes ] \ [ -textpointsize textpointsize ]
Defined in packages/acs-api-browser/tcl/acs-api-documentation-procs.tcl
Return a source code for dot showing a local call graph snippet, showing direct callers and directly called functions
- Switches:
- -proc_name (required)
- -dpi (optional, defaults to
"72"
)- -format (optional, defaults to
"svg"
)- -maxnodes (optional, defaults to
"5"
)- -textpointsize (optional, defaults to
"12.0"
)- Author:
- Gustaf Neumann
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
Source code: set dot_code "" # # Include calls from test cases # set doc [nsv_get api_proc_doc $proc_name] if {[dict exists $doc testcase]} { set nodes "" set edges "" foreach testcase_pair [lrange [lsort [dict get $doc testcase]] 0 $maxnodes-1] { lassign $testcase_pair testcase_id package_key set testcase_node test_$testcase_id set url [api_test_case_url $testcase_pair] set props "" append props [subst {URL="$url", margin=".2,0", shape=none, tooltip="Testcase $testcase_id of package $package_key", }] [subst {label=<<FONT POINT-SIZE="$textpointsize">$testcase_id<BR/><I>(test $package_key)</I></FONT>>}] append nodes [subst -nocommands {"$testcase_node" [$props];\n}] append edges [subst {"$testcase_node" -> "$proc_name";}] \n } append dot_code "subgraph \{\nrank=\"source\";" $nodes "\}\n" $edges } # # Include calls from calledby information. Might come from a file # (e.g. a *-init.tcl file) or from a proc. # set callers {} if {[dict exists $doc calledby]} { set edges "" set nodes "" # # Filter from the list the recursive calls, since these mess # up the graph layout. # set caller_procs {} foreach c [dict get $doc calledby] { if { $c ne $proc_name } { lappend caller_procs $c } } foreach caller [lrange [lsort $caller_procs] 0 $maxnodes-1] { # # When the "caller" starts with "packages/", we assume, # this is a file. # if {[regexp {^(packages/[^/]+/)(.*)} $caller . line1 line2]} { set url [export_vars -base /api-doc/content-page-view {{path $caller} {source_p 1}}] set props "" append props [subst {URL="$url", margin=".2,0" shape=rectangle, tooltip="Script calling $proc_name", }] [subst {label=<<FONT POINT-SIZE="$textpointsize">${line1}<BR/>${line2}</FONT>>}] } else { lappend callers $caller set url [api_proc_doc_url -proc_name $caller] set hints [api_proc_pretty_name -hints_only $caller] if {$hints ne ""} { set hints "<BR/><I>$hints</I>" } set props "" append props [subst {URL="$url", margin=".2,0" tooltip="Function calling $proc_name", }] [subst {label=<<FONT POINT-SIZE="$textpointsize">${caller}$hints</FONT>>}] } append nodes [subst -nocommands {"$caller" [$props];\n}] append edges [subst {"$caller" -> "$proc_name";}] \n } append dot_code "subgraph \{\nrank=\"same\";" $nodes "\}\n" $edges } # # Include information, what other procs this proc calls. Filter # from this list false positives of the call graph # analysis. Exclude es well recursive calls, since these mess up # the graph layout. # set called_procs {} foreach c [api_called_proc_names -proc_name $proc_name] { if {[namespace which $c] eq "::$c" && $c ni $callers && $c ne $proc_name } { lappend called_procs $c } } set edges "" set nodes "" foreach called [lrange $called_procs 0 $maxnodes-1] { set url [api_proc_doc_url -proc_name $called] set hints [api_proc_pretty_name -hints_only $called] if {$hints ne ""} { set hints "<BR/><I>$hints</I>" } set props "" append props [subst {URL="$url", margin=".2,0", tooltip="Function called by $proc_name", }] [subst {label=<<FONT POINT-SIZE="$textpointsize">${called}$hints</FONT>>}] append nodes [subst -nocommands {"$called" [$props];\n}] append edges [subst {"$proc_name" -> "$called";}] \n } if {$nodes ne ""} { append dot_code "subgraph \{\nrank=\"same\";" $nodes "\}\n" $edges } #ns_log notice \n$dot_code append result "digraph \{api = $dpi;" $dot_code "\}"XQL Not present: Generic, PostgreSQL, Oracle