open System
open System.Xml
open System.Xml.XPath
open System.IO
open System.Xml.Linq
open System.Text
open System.Globalization
let load path =
let f = File.OpenText path
let doc = XDocument.Load f
f.Close()
doc
let save path (doc:XDocument) =
let settings = XmlWriterSettings ()
settings.Indent <- true
settings.Encoding <- new UTF8Encoding (false)
settings.OmitXmlDeclaration <- true
settings.NewLineChars <- Environment.NewLine
let output = File.CreateText (path)
let writer = XmlWriter.Create (output, settings)
doc.Save (writer)
writer.Close ()
output.WriteLine ()
output.Close ();
let select (node:XNode) path = node.XPathSelectElement path
let setval (node:XNode) path value = (select node path).Value <- value
let xname s = XName.Get(s)
let processType (doc:XDocument) =
let typeName =
let tnode = doc.XPathSelectElement ("Type")
let attr = tnode.Attribute (xname "Name")
attr.Value
let fillBaseType =
match doc.XPathSelectElement "Type/Members/Member[@MemberName='BaseType']/Docs" with
| null -> ()
| mdoc ->
setval mdoc "summary" "Urho's type system base type."
setval mdoc "value" "StringHash representing the base type for this Urho type."
setval mdoc "remarks" "This returns the Urho type system base type and is surfaced for low-level Urho code."
let fillType =
match doc.XPathSelectElement "Type/Members/Member[@MemberName='Type']/Docs" with
| null -> ()
| mdoc ->
setval mdoc "summary" "Urho's type system type."
try
setval mdoc "value" "StringHash representing the type for this C# type."
with
| ex -> ()
setval mdoc "remarks" "This returns the Urho's type and is surfaced for low-level Urho code."
let fillTypeName =
match doc.XPathSelectElement "Type/Members/Member[@MemberName='TypeName']/Docs" with
| null -> ()
| mdoc ->
setval mdoc "summary" "Urho's low-level type name."
setval mdoc "value" "Stringified low-level type name."
setval mdoc "remarks" ""
let fillTypeNameStatic =
match doc.XPathSelectElement "Type/Members/Member[@MemberName='TypeNameStatic']/Docs" with
| null -> ()
| mdoc ->
setval mdoc "summary" "Urho's low-level type name, accessible as a static method."
setval mdoc "value" "Stringified low-level type name."
setval mdoc "remarks" ""
let fillTypeCtor =
for x in doc.XPathSelectElements "Type/Members/Member[@MemberName='.ctor']" do
match x with
| null -> ()
| mem ->
match mem.XPathSelectElement "Parameters/Parameter[@Name='handle']" with
| null -> ()
| hmember ->
let mdoc = mem.XPathSelectElement "Docs"
setval mdoc "param[@name='handle']" "Pointer to the raw unmanaged Urho object."
setval mdoc "summary" <| (sprintf "Constructs a new instance of %s, given a raw pointer to an unmanaged object" typeName)
let remarks = select mdoc "remarks"
remarks.RemoveAll ()
XElement.Parse ("This creates a new managed wrapper for the type using the raw pointer to an unmanaged object.") |> remarks.Add
XElement.Parse ("Objects that are created in this fashion get registered with the UrhoSharp runtime.") |> remarks.Add
XElement.Parse ("This is intended to be used by the UrhoSharp runtime, and is not intended to be used by users.") |> remarks.Add
let fillTypeEmpty =
for x in doc.XPathSelectElements "Type/Members/Member[@MemberName='.ctor']" do
match x with
| null -> ()
| mem ->
match mem.XPathSelectElement "Parameters/Parameter[@Name='emptyFlag']" with
| null -> ()
| hmember ->
let mdoc = mem.XPathSelectElement "Docs"
setval mdoc "param[@name='emptyFlag']" "Pass UrhoObjectFlag.Empty."
setval mdoc "summary" "Empty constructor, chain to this constructor when you provide your own constructor that sets the handle field."
let remarks = select mdoc "remarks"
remarks.RemoveAll ()
XElement.Parse ("This constructor should be invoked by your code if you provide your own constructor that sets the handle field.") |> remarks.Add
XElement.Parse ("This essentially circumvents the default path that creates a new object and sets the handle and does not call RegisterObject on the target, you must do this on your own constructor.") |> remarks.Add
XElement.Parse ("You would typically chain to this constructor from your own, and then set the handle to the unmanaged object from your code, and then register your object.") |> remarks.Add
let fillTypeContext =
for x in doc.XPathSelectElements "Type/Members/Member[@MemberName='.ctor']" do
match x with
| null -> ()
| mem ->
match mem.XPathSelectElement "Parameters/Parameter[@Name='context']" with
| null -> ()
| hmember ->
if mem.XPathSelectElements "Parameters" |> Seq.length = 1 then
let mdoc = mem.XPathSelectElement "Docs"
setval mdoc "param[@name='context']" "The context that this object will be attached to."
setval mdoc "summary" <| (sprintf "Creates an instance of %s that is attached to an execution context." typeName)
let remarks = select mdoc "remarks"
remarks.RemoveAll ()
sprintf "This creates an instance of %s attached to the specified execution context." typeName |> XElement.Parse |> remarks.Add
()
fillBaseType
fillType
fillTypeName
fillTypeNameStatic
fillTypeCtor
doc
let processPath path =
let xml path = load path
match load path with
| null ->
printfn "Problem loading %A" path
()
| doc -> processType doc |> save path
for xmlDoc in Directory.GetFiles ("Urho", "*xml") do
processPath xmlDoc