diff -r 41300fa6a67c -r f7bc934e204c util/examples/xmlpatterns/xquery/globalVariables/reportGlobals.xq --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/examples/xmlpatterns/xquery/globalVariables/reportGlobals.xq Wed Mar 31 11:06:36 2010 +0300 @@ -0,0 +1,110 @@ +(: + This XQuery loads a GCC-XML file and reports the locations of all + global variables in the original C++ source. To run the query, + use the command line: + + xmlpatterns reportGlobals.xq -param fileToOpen=globals.gccxml -output globals.html + + "fileToOpen=globals.gccxml" binds the file name "globals.gccxml" + to the variable "fileToOpen" declared and used below. +:) + +declare variable $fileToOpen as xs:anyURI external; +declare variable $inDoc as document-node() := doc($fileToOpen); + +(: + This function determines whether the typeId is a complex type, + e.g. QString. We only check whether it's a class. To be strictly + correct, we should check whether the class has a non-synthesized + constructor. We accept both mutable and const types. +:) +declare function local:isComplexType($typeID as xs:string) as xs:boolean +{ + exists($inDoc/GCC_XML/Class[@id = $typeID]) + or + exists($inDoc/GCC_XML/Class[@id = $inDoc/GCC_XML/CvQualifiedType[@id = $typeID]/@type]) +}; + +(: + This function determines whether the typeId is a primitive type. +:) +declare function local:isPrimitive($typeId as xs:string) as xs:boolean +{ + exists($inDoc/GCC_XML/FundamentalType[@id = $typeId]) +}; + +(: + This function constructs a line for the report. The line contains + a variable name, the source file, and the line number. +:) +declare function local:location($block as element()) as xs:string +{ + concat($inDoc/GCC_XML/File[@id = $block/@file]/@name, " at line ", $block/@line) +}; + +(: + This function generates the report. Note that it is called once + in the element of the output. + + It ignores const variables of simple types but reports all others. +:) +declare function local:report() as element()+ +{ + let $complexVariables as element(Variable)* := $inDoc/GCC_XML/Variable[local:isComplexType(@type)] + return if (exists($complexVariables)) + then (

Global variables with complex types:

, +
    + { + (: For each Variable in $complexVariables... :) + $complexVariables/
  1. {string(@name)} in {local:location(.)}
  2. + } +
) + else

No complex global variables found.

+ + , + + let $primitiveVariables as element(Variable)+ := $inDoc/GCC_XML/Variable[local:isPrimitive(@type)] + return if (exists($primitiveVariables)) + then (

Mutable global variables with primitives types:

, +
    + { + (: For each Variable in $complexVariables... :) + $primitiveVariables/
  1. {string(@name)} in {local:location(.)}
  2. + } +
) + else

No mutable primitive global variables found.

+}; + +(: + This is where the report is output. First + there is some style stuff, then the element, + which contains the call to the \c{local:report()} + declared above. +:) + + + Global variables report for {$fileToOpen} + + + + +

Start report: {current-dateTime()}

+ { + local:report() + } +

End report: {current-dateTime()}

+ + +