|
Packit |
1c1d7e |
#// objective: test for completeness and correctness of references/referencedby relations
|
|
Packit |
1c1d7e |
#// check: 057__caller__graphs_8tcl.xml
|
|
Packit |
1c1d7e |
#// check: __057__caller__graphs_8tcl.xml
|
|
Packit |
1c1d7e |
#// check: namespacebar.xml
|
|
Packit |
1c1d7e |
#// check: namespacefoo.xml
|
|
Packit |
1c1d7e |
#// check: namespace1.xml
|
|
Packit |
1c1d7e |
#// check: namespace1_1_11.xml
|
|
Packit |
1c1d7e |
#// check: namespace1_1_11_1_11.xml
|
|
Packit |
1c1d7e |
#// check: namespace2.xml
|
|
Packit |
1c1d7e |
#// check: namespace2_1_12.xml
|
|
Packit |
1c1d7e |
#// check: namespace2_1_12_1_12.xml
|
|
Packit |
1c1d7e |
#// check: namespace2_1_12_1_12_1_12.xml
|
|
Packit |
1c1d7e |
#// check: namespace2_1_12_1_12_1_12_1_12.xml
|
|
Packit |
1c1d7e |
#// config: EXTRACT_ALL = yes
|
|
Packit |
1c1d7e |
#// config: INLINE_SOURCES = no
|
|
Packit |
1c1d7e |
#// config: REFERENCED_BY_RELATION = yes
|
|
Packit |
1c1d7e |
#// config: REFERENCES_RELATION = yes
|
|
Packit |
1c1d7e |
#// config: INPUT = $INPUTDIR/057_caller_graphs.tcl $INPUTDIR/_057_caller_graphs.tcl
|
|
Packit |
1c1d7e |
# config: HAVE_DOT = yes
|
|
Packit |
1c1d7e |
# config: CALLER_GRAPH = yes
|
|
Packit |
1c1d7e |
# config: CALL_GRAPH = yes
|
|
Packit |
1c1d7e |
# config: GENERATE_HTML = yes
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
# This is a stripped down example from my code.
|
|
Packit |
1c1d7e |
# Doxygen 1.8.7 generates the correct relations (xml)
|
|
Packit |
1c1d7e |
# but caller graphs will be incomplete.
|
|
Packit |
1c1d7e |
# It does not generate any relations at all if INLINE_SOURCES = no.
|
|
Packit |
1c1d7e |
namespace eval bar {}
|
|
Packit |
1c1d7e |
proc bar::slave { } {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
if {1} then {
|
|
Packit |
1c1d7e |
bar::baz
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc bar::baz {} {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
bar::bazbaz
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc bar::bazbaz {} {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
namespace eval foo {}
|
|
Packit |
1c1d7e |
proc foo::master { } {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline $info(proc)
|
|
Packit |
1c1d7e |
bar::slave
|
|
Packit |
1c1d7e |
return
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#
|
|
Packit |
1c1d7e |
# now we check tcl's rules: from the help
|
|
Packit |
1c1d7e |
# NAME RESOLUTION
|
|
Packit |
1c1d7e |
#... Command names are also always resolved by looking in the current
|
|
Packit |
1c1d7e |
#namespace first. If not found there, they are searched for in every namespace on
|
|
Packit |
1c1d7e |
#the current namespace's command path (which is empty by default). If not found
|
|
Packit |
1c1d7e |
#there, command names are looked up in the global namespace (or, failing that,
|
|
Packit |
1c1d7e |
#are processed by the unknown command.) ...
|
|
Packit |
1c1d7e |
#
|
|
Packit |
1c1d7e |
namespace eval ::1::1::1 {}
|
|
Packit |
1c1d7e |
proc ::baz args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::1::baz args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::bar args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::1::bar args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::1::1::bar args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::1::1::1::bar args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::1::test1 args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline $info(proc)
|
|
Packit |
1c1d7e |
baz
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::1::test2 args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline $info(proc)
|
|
Packit |
1c1d7e |
bar
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::1::test3 args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline $info(proc)
|
|
Packit |
1c1d7e |
::bar
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::1::test4 args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline $info(proc)
|
|
Packit |
1c1d7e |
1::bar
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::1::test5 args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline $info(proc)
|
|
Packit |
1c1d7e |
1::baz
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#
|
|
Packit |
1c1d7e |
# funny example, do you see the infinite loop?
|
|
Packit |
1c1d7e |
# we stop before the interpreter crashes
|
|
Packit |
1c1d7e |
set ::countdown 10
|
|
Packit |
1c1d7e |
namespace eval ::2::2::2::2::2 {}
|
|
Packit |
1c1d7e |
proc ::next args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts $info(proc)
|
|
Packit |
1c1d7e |
2::next
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::2::next args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts $info(proc)
|
|
Packit |
1c1d7e |
incr ::countdown -1
|
|
Packit |
1c1d7e |
if {$::countdown>0} then {
|
|
Packit |
1c1d7e |
2::next
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
puts "stop after 10 rounds."
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::2::2::next args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts $info(proc)
|
|
Packit |
1c1d7e |
2::next
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::2::2::2::next args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts $info(proc)
|
|
Packit |
1c1d7e |
2::next
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::2::2::2::2::next args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts $info(proc)
|
|
Packit |
1c1d7e |
2::next
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc ::2::2::2::2::2::next args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts $info(proc)
|
|
Packit |
1c1d7e |
2::next
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#
|
|
Packit |
1c1d7e |
# cross check with two files
|
|
Packit |
1c1d7e |
# If doxygen did not do two passes, then xrefs would depend on file order
|
|
Packit |
1c1d7e |
# and would be incomplete.
|
|
Packit |
1c1d7e |
source _057_caller_graphs.tcl
|
|
Packit |
1c1d7e |
proc master args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
inFileB
|
|
Packit |
1c1d7e |
return
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
proc inFileA args {
|
|
Packit |
1c1d7e |
array set info [info frame 0]; puts -nonewline ->$info(proc)
|
|
Packit |
1c1d7e |
return
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
# now, check with tcl what is called
|
|
Packit |
1c1d7e |
foo::master
|
|
Packit |
1c1d7e |
puts ""
|
|
Packit |
1c1d7e |
foreach proc [lsort [info procs ::1::test?]] {
|
|
Packit |
1c1d7e |
$proc
|
|
Packit |
1c1d7e |
puts ""
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
::next
|
|
Packit |
1c1d7e |
master
|
|
Packit |
1c1d7e |
exit
|
|
Packit |
1c1d7e |
|