@@ -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
@@ -701,7 +826,6 @@ module Emit =
701826 | " Date" -> " Date"
702827 | " DOMHighResTimeStamp" -> " number"
703828 | " DOMString" -> " string"
704- | " DOMTimeStamp" -> " number"
705829 | " EndOfStreamError" -> " number"
706830 | " EventListener" -> " EventListenerOrEventListenerObject"
707831 | " double" | " float" -> " number"
@@ -721,7 +845,8 @@ module Emit =
721845 if allInterfacesMap.ContainsKey objDomType ||
722846 allCallbackFuncs.ContainsKey objDomType ||
723847 allDictionariesMap.ContainsKey objDomType ||
724- allEnumsMap.ContainsKey objDomType then
848+ allEnumsMap.ContainsKey objDomType ||
849+ InputIdlJson.hasType objDomType then
725850 objDomType
726851 // Name of a type alias. Just return itself
727852 elif typeDefSet.Contains objDomType then objDomType
@@ -880,7 +1005,12 @@ module Emit =
8801005 getAddedItems ItemKind.Callback flavor
8811006 |> Array.iter emitCallbackFunctionsFromJson
8821007
883- GetCallbackFuncsByFlavor flavor |> Array.iter emitCallBackFunction
1008+ let map = GetCallbackFuncsByFlavor flavor |> Array.map( fun i -> ( i.Name, i)) |> dict |> Dictionary
1009+ InputIdlJson.inputIdl.CallbackFunctions
1010+ |> Array.filter ( fun i -> flavor <> Worker || knownWorkerInterfaces.Contains i.Name)
1011+ |> Array.iter ( InputIdlJson.Compat.convertCallbackFunction >> ( fun i -> map.[ i.Name] <- i))
1012+
1013+ map.Values |> Array.ofSeq |> Array.iter emitCallBackFunction
8841014
8851015 let EmitEnums flavor =
8861016 let emitEnum ( e : Browser.Enum ) =
@@ -1376,7 +1506,7 @@ module Emit =
13761506 if hasNonStaticMember then emitStaticInterfaceWithNonStaticMembers() else emitPureStaticInterface()
13771507
13781508 let EmitNonCallbackInterfaces flavor =
1379- for i in GetNonCallbackInterfacesByFlavor flavor do
1509+ let emitNonCallbackInterface ( i : Browser.Interface ) =
13801510 // If the static attribute has a value, it means the type doesn't have a constructor
13811511 if i.Static.IsSome then
13821512 EmitStaticInterface flavor i
@@ -1386,6 +1516,13 @@ module Emit =
13861516 EmitInterface flavor i
13871517 EmitConstructor flavor i
13881518
1519+ let map = GetNonCallbackInterfacesByFlavor flavor |> Array.map( fun i -> ( i.Name, i)) |> dict |> Dictionary
1520+ InputIdlJson.inputIdl.Interfaces
1521+ |> Array.filter ( fun i -> flavor <> Worker || i.Exposed |> Array.contains " Worker" )
1522+ |> Array.iter ( InputIdlJson.Compat.convertInterface >> ( fun i -> map.[ i.Name] <- i))
1523+
1524+ map.Values |> Array.ofSeq |> Array.iter emitNonCallbackInterface
1525+
13891526 let EmitDictionaries flavor =
13901527 let emitDictionary ( dict : Browser.Dictionary ) =
13911528 match dict.Extends with
@@ -1424,12 +1561,19 @@ module Emit =
14241561 Pt.Printl " }"
14251562 Pt.Printl " "
14261563
1427- browser.Dictionaries
1428- |> Array.filter ( fun dict -> flavor <> Worker || knownWorkerInterfaces.Contains dict.Name)
1429- |> Array.iter emitDictionary
1564+ let map =
1565+ browser.Dictionaries
1566+ |> Array.filter ( fun dict -> flavor <> Worker || knownWorkerInterfaces.Contains dict.Name)
1567+ |> Array.map( fun i -> ( i.Name, i)) |> dict |> Dictionary
14301568
14311569 if flavor = Worker then
1432- worker.Dictionaries |> Array.iter emitDictionary
1570+ worker.Dictionaries |> Array.iter ( fun dict -> map.[ dict.Name] <- dict)
1571+
1572+ InputIdlJson.inputIdl.Dictionaries
1573+ |> Array.filter ( fun dict -> flavor <> Worker || knownWorkerInterfaces.Contains dict.Name)
1574+ |> Array.iter ( InputIdlJson.Compat.convertDictionary >> ( fun i -> map.[ i.Name] <- i))
1575+
1576+ map.Values |> Array.ofSeq |> Array.iter emitDictionary
14331577
14341578 let EmitAddedInterface ( ai : InputJsonType.Root ) =
14351579 match ai.Extends with
@@ -1475,15 +1619,14 @@ module Emit =
14751619 let emitTypeDefFromJson ( typeDef : InputJsonType.Root ) =
14761620 Pt.Printl " type %s = %s ;" typeDef.Name.Value typeDef.Type.Value
14771621
1478- match flavor with
1479- | Flavor.Worker ->
1480- browser.Typedefs
1481- |> Array.filter ( fun typedef -> knownWorkerInterfaces.Contains typedef.NewType)
1482- |> Array.iter emitTypeDef
1483- | _ ->
1484- browser.Typedefs
1485- |> Array.filter ( fun typedef -> getRemovedItemByName typedef.NewType ItemKind.TypeDef " " |> Option.isNone)
1486- |> Array.iter emitTypeDef
1622+ let mutable map = browser.Typedefs |> Array.map( fun i -> ( i.NewType, i)) |> Map.ofArray
1623+ InputIdlJson.inputIdl.Typedefs
1624+ |> Array.iter ( InputIdlJson.Compat.convertTypedef >> ( fun i -> map <- map.Add( i.NewType, i)))
1625+
1626+ map |> Map.toArray |> Array.map snd
1627+ |> Array.filter ( fun typedef -> getRemovedItemByName typedef.NewType ItemKind.TypeDef " " |> Option.isNone)
1628+ |> Array.filter ( fun i -> ( flavor <> Flavor.Worker || knownWorkerInterfaces.Contains i.NewType))
1629+ |> Array.iter emitTypeDef
14871630
14881631 InputJson.getAddedItems ItemKind.TypeDef flavor
14891632 |> Array.iter emitTypeDefFromJson
0 commit comments