@@ -34,6 +34,11 @@ module Helpers =
3434 match FSharpValue.GetUnionFields( x, typeof< 'a>) with
3535 | case, _ -> case.Name
3636
37+ let inline toNameMap < ^a when ^a : ( member Name : string ) > ( data : array < ^a > ) =
38+ data
39+ |> Array.map ( fun x -> (( ^a : ( member Name : string) x), x))
40+ |> Map.ofArray
41+
3742 module Option =
3843 let runIfSome f x =
3944 match x with
@@ -132,6 +137,131 @@ module Types =
132137
133138 type ExtendConflict = { BaseType: string ; ExtendType: string list ; MemberNames: string list }
134139
140+ module InputIdlJson =
141+ open Helpers
142+ open System.Xml .Linq
143+
144+ type InputIdlJsonType = JsonProvider< " inputfiles/sample.webidl.json" >
145+
146+ let inputIdl =
147+ File.ReadAllText( GlobalVars.inputFolder + @" /browser.webidl.json" ) |> InputIdlJsonType.Parse
148+
149+ let allCallbackFunctionsMap =
150+ inputIdl.CallbackFunctions |> toNameMap
151+
152+ let allInterfacesMap =
153+ inputIdl.Interfaces |> toNameMap
154+
155+ let allDictionariesMap =
156+ inputIdl.Dictionaries |> toNameMap
157+
158+ let allTypedefsMap =
159+ inputIdl.Typedefs |> toNameMap
160+
161+ let hasType itemName =
162+ allCallbackFunctionsMap.ContainsKey itemName ||
163+ allInterfacesMap.ContainsKey itemName ||
164+ allDictionariesMap.ContainsKey itemName ||
165+ allTypedefsMap.ContainsKey itemName
166+
167+ module Compat =
168+ let xNamespace = XNamespace.Get " http://schemas.microsoft.com/ie/webidl-xml"
169+ let convertArgument ( i : InputIdlJsonType.Argument ) =
170+ let param = XElement( xNamespace + " param" , XAttribute ( XName.Get " name" , i.Name), XAttribute ( XName.Get " type" , i.Type))
171+ if OptionCheckValue true i.Optional then
172+ param.Add ( XAttribute( XName.Get " optional" , " 1" ))
173+ if OptionCheckValue true i.Nullable then
174+ param.Add ( XAttribute( XName.Get " nullable" , " 1" ))
175+ if OptionCheckValue true i.Variadic then
176+ param.Add ( XAttribute( XName.Get " variadic" , " 1" ))
177+ param
178+
179+ let convertOperation ( i : InputIdlJsonType.Operation ) =
180+ let method = XElement( xNamespace + " method" , XAttribute ( XName.Get " name" , i.Name), XAttribute ( XName.Get " type" , i.Type))
181+
182+ method.Add( i.Arguments |> Array.map convertArgument)
183+ if OptionCheckValue true i.Static then
184+ method.Add( XAttribute( XName.Get " static" , " 1" ))
185+ if OptionCheckValue true i.Nullable then
186+ method.Add( XAttribute( XName.Get " nullable" , " 1" ))
187+
188+ method
189+
190+ let convertConstructor ( i : InputIdlJsonType.Constructor ) =
191+ let constructor = XElement( xNamespace + " constructor" )
192+
193+ if not ( Array.isEmpty i.Arguments) then
194+ constructor.Add( i.Arguments |> Array.map convertArgument)
195+
196+ constructor
197+
198+ let convertAttribute ( i : InputIdlJsonType.Attribute ) =
199+ let property = XElement( xNamespace + " property" , XAttribute ( XName.Get " name" , i.Name), XAttribute ( XName.Get " type" , i.Type))
200+
201+ if OptionCheckValue true i.Readonly then
202+ property.Add( XAttribute( XName.Get " read-only" , " 1" ))
203+ if OptionCheckValue true i.Static then
204+ property.Add( XAttribute( XName.Get " static" , " 1" ))
205+ if OptionCheckValue true i.Stringifier then
206+ property.Add( XAttribute( XName.Get " stringifier" , " 1" ))
207+ if OptionCheckValue true i.Nullable then
208+ property.Add( XAttribute( XName.Get " nullable" , " 1" ))
209+
210+ property
211+
212+ let convertConstant ( i : InputIdlJsonType.Constant ) =
213+ XElement( xNamespace + " constant" , XAttribute ( XName.Get " name" , i.Name), XAttribute ( XName.Get " type" , i.Type), XAttribute ( XName.Get " value" , i.Value))
214+
215+ let convertCallbackFunction ( i : InputIdlJsonType.CallbackFunction ) =
216+ let callbackFunction = XElement( xNamespace + " callback-function" , XAttribute ( XName.Get " name" , i.Name), XAttribute ( XName.Get " type" , i.Type))
217+
218+ callbackFunction.Add( i.Arguments |> Array.map convertArgument)
219+ if OptionCheckValue true i.Nullable then
220+ callbackFunction.Add( XAttribute( XName.Get " nullable" , " 1" ))
221+
222+ Types.Browser.CallbackFunction callbackFunction
223+
224+ let convertInterface ( i : InputIdlJsonType.Interfacis ) =
225+ let interfaceEl = XElement( xNamespace + " interface" , XAttribute ( XName.Get " name" , i.Name))
226+
227+ interfaceEl.Add ( XAttribute ( XName.Get " extends" , if i.Extends.IsSome then i.Extends.Value else " Object" ))
228+ if not ( Array.isEmpty i.Constructors) then
229+ interfaceEl.Add( i.Constructors |> Array.map convertConstructor)
230+ if not ( Array.isEmpty i.Operations) then
231+ interfaceEl.Add( XElement( xNamespace + " methods" , i.Operations |> Array.map convertOperation))
232+ if not ( Array.isEmpty i.Attributes) then
233+ interfaceEl.Add( XElement( xNamespace + " properties" , i.Attributes |> Array.map convertAttribute))
234+ if not ( Array.isEmpty i.Constants) then
235+ interfaceEl.Add( XElement( xNamespace + " constants" , i.Constants |> Array.map convertConstant))
236+
237+ Types.Browser.Interface interfaceEl
238+
239+ let convertDictionary ( i : InputIdlJsonType.Dictionary ) =
240+ let dictionary = XElement( xNamespace + " dictionary" , XAttribute ( XName.Get " name" , i.Name))
241+
242+ dictionary.Add ( XAttribute ( XName.Get " extends" , if i.Extends.IsSome then i.Extends.Value else " Object" ))
243+ let members =
244+ [ for memberDef in i.Members do
245+ let memberEl = XElement( xNamespace + " member" , XAttribute ( XName.Get " name" , memberDef.Name), XAttribute ( XName.Get " type" , memberDef.Type))
246+
247+ if OptionCheckValue true memberDef.Nullable then
248+ memberEl.Add( XAttribute( XName.Get " nullable" , " 1" ))
249+ if OptionCheckValue true memberDef.Required then
250+ memberEl.Add( XAttribute( XName.Get " required" , " 1" ))
251+
252+ yield memberEl ]
253+
254+ dictionary.Add( XElement( xNamespace + " members" , members))
255+ Types.Browser.Dictionary dictionary
256+
257+ let convertTypedef ( i : InputIdlJsonType.Typedef ) =
258+ let typedef = XElement( xNamespace + " typedef" , XAttribute ( XName.Get " new-type" , i.Name), XAttribute ( XName.Get " type" , i.Type))
259+
260+ if OptionCheckValue true i.Nullable then
261+ typedef.Add( XAttribute( XName.Get " nullable" , " 1" ))
262+
263+ Types.Browser.Typedef typedef
264+
135265module InputJson =
136266 open Helpers
137267 open Types
@@ -301,11 +431,6 @@ module Data =
301431 let allInterfaces =
302432 Array.concat [| allWebInterfaces; allWorkerAdditionalInterfaces |]
303433
304- let inline toNameMap < ^a when ^a : ( member Name : string ) > ( data : array < ^a > ) =
305- data
306- |> Array.map ( fun x -> (( ^a : ( member Name : string) x), x))
307- |> Map.ofArray
308-
309434 let allInterfacesMap =
310435 allInterfaces |> toNameMap
311436
@@ -700,7 +825,6 @@ module Emit =
700825 | " Date" -> " Date"
701826 | " DOMHighResTimeStamp" -> " number"
702827 | " DOMString" -> " string"
703- | " DOMTimeStamp" -> " number"
704828 | " EndOfStreamError" -> " number"
705829 | " EventListener" -> " EventListenerOrEventListenerObject"
706830 | " double" | " float" -> " number"
@@ -720,7 +844,8 @@ module Emit =
720844 if allInterfacesMap.ContainsKey objDomType ||
721845 allCallbackFuncs.ContainsKey objDomType ||
722846 allDictionariesMap.ContainsKey objDomType ||
723- allEnumsMap.ContainsKey objDomType then
847+ allEnumsMap.ContainsKey objDomType ||
848+ InputIdlJson.hasType objDomType then
724849 objDomType
725850 // Name of a type alias. Just return itself
726851 elif typeDefSet.Contains objDomType then objDomType
@@ -879,7 +1004,12 @@ module Emit =
8791004 getAddedItems ItemKind.Callback flavor
8801005 |> Array.iter emitCallbackFunctionsFromJson
8811006
882- GetCallbackFuncsByFlavor flavor |> Array.iter emitCallBackFunction
1007+ let map = GetCallbackFuncsByFlavor flavor |> Array.map( fun i -> ( i.Name, i)) |> dict |> Dictionary
1008+ InputIdlJson.inputIdl.CallbackFunctions
1009+ |> Array.filter ( fun i -> flavor <> Worker || knownWorkerInterfaces.Contains i.Name)
1010+ |> Array.iter ( InputIdlJson.Compat.convertCallbackFunction >> ( fun i -> map.[ i.Name] <- i))
1011+
1012+ map.Values |> Array.ofSeq |> Array.iter emitCallBackFunction
8831013
8841014 let EmitEnums flavor =
8851015 let emitEnum ( e : Browser.Enum ) =
@@ -1346,7 +1476,7 @@ module Emit =
13461476 if hasNonStaticMember then emitStaticInterfaceWithNonStaticMembers() else emitPureStaticInterface()
13471477
13481478 let EmitNonCallbackInterfaces flavor =
1349- for i in GetNonCallbackInterfacesByFlavor flavor do
1479+ let emitNonCallbackInterface ( i : Browser.Interface ) =
13501480 // If the static attribute has a value, it means the type doesn't have a constructor
13511481 if i.Static.IsSome then
13521482 EmitStaticInterface flavor i
@@ -1356,6 +1486,13 @@ module Emit =
13561486 EmitInterface flavor i
13571487 EmitConstructor flavor i
13581488
1489+ let map = GetNonCallbackInterfacesByFlavor flavor |> Array.map( fun i -> ( i.Name, i)) |> dict |> Dictionary
1490+ InputIdlJson.inputIdl.Interfaces
1491+ |> Array.filter ( fun i -> flavor <> Worker || i.Exposed |> Array.contains " Worker" )
1492+ |> Array.iter ( InputIdlJson.Compat.convertInterface >> ( fun i -> map.[ i.Name] <- i))
1493+
1494+ map.Values |> Array.ofSeq |> Array.iter emitNonCallbackInterface
1495+
13591496 let EmitDictionaries flavor =
13601497 let emitDictionary ( dict : Browser.Dictionary ) =
13611498 match dict.Extends with
@@ -1390,12 +1527,19 @@ module Emit =
13901527 Pt.Printl " }"
13911528 Pt.Printl " "
13921529
1393- browser.Dictionaries
1394- |> Array.filter ( fun dict -> flavor <> Worker || knownWorkerInterfaces.Contains dict.Name)
1395- |> Array.iter emitDictionary
1530+ let map =
1531+ browser.Dictionaries
1532+ |> Array.filter ( fun dict -> flavor <> Worker || knownWorkerInterfaces.Contains dict.Name)
1533+ |> Array.map( fun i -> ( i.Name, i)) |> dict |> Dictionary
13961534
13971535 if flavor = Worker then
1398- worker.Dictionaries |> Array.iter emitDictionary
1536+ worker.Dictionaries |> Array.iter ( fun dict -> map.[ dict.Name] <- dict)
1537+
1538+ InputIdlJson.inputIdl.Dictionaries
1539+ |> Array.filter ( fun dict -> flavor <> Worker || knownWorkerInterfaces.Contains dict.Name)
1540+ |> Array.iter ( InputIdlJson.Compat.convertDictionary >> ( fun i -> map.[ i.Name] <- i))
1541+
1542+ map.Values |> Array.ofSeq |> Array.iter emitDictionary
13991543
14001544 let EmitAddedInterface ( ai : InputJsonType.Root ) =
14011545 match ai.Extends with
@@ -1441,15 +1585,14 @@ module Emit =
14411585 let emitTypeDefFromJson ( typeDef : InputJsonType.Root ) =
14421586 Pt.Printl " type %s = %s ;" typeDef.Name.Value typeDef.Type.Value
14431587
1444- match flavor with
1445- | Flavor.Worker ->
1446- browser.Typedefs
1447- |> Array.filter ( fun typedef -> knownWorkerInterfaces.Contains typedef.NewType)
1448- |> Array.iter emitTypeDef
1449- | _ ->
1450- browser.Typedefs
1451- |> Array.filter ( fun typedef -> getRemovedItemByName typedef.NewType ItemKind.TypeDef " " |> Option.isNone)
1452- |> Array.iter emitTypeDef
1588+ let mutable map = browser.Typedefs |> Array.map( fun i -> ( i.NewType, i)) |> Map.ofArray
1589+ InputIdlJson.inputIdl.Typedefs
1590+ |> Array.iter ( InputIdlJson.Compat.convertTypedef >> ( fun i -> map <- map.Add( i.NewType, i)))
1591+
1592+ map |> Map.toArray |> Array.map snd
1593+ |> Array.filter ( fun typedef -> getRemovedItemByName typedef.NewType ItemKind.TypeDef " " |> Option.isNone)
1594+ |> Array.filter ( fun i -> ( flavor <> Flavor.Worker || knownWorkerInterfaces.Contains i.NewType))
1595+ |> Array.iter emitTypeDef
14531596
14541597 InputJson.getAddedItems ItemKind.TypeDef flavor
14551598 |> Array.iter emitTypeDefFromJson
0 commit comments