@@ -34,6 +34,11 @@ module Helpers =
34
34
match FSharpValue.GetUnionFields( x, typeof< 'a>) with
35
35
| case, _ -> case.Name
36
36
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
+
37
42
module Option =
38
43
let runIfSome f x =
39
44
match x with
@@ -132,6 +137,131 @@ module Types =
132
137
133
138
type ExtendConflict = { BaseType: string ; ExtendType: string list ; MemberNames: string list }
134
139
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
+
135
265
module InputJson =
136
266
open Helpers
137
267
open Types
@@ -301,11 +431,6 @@ module Data =
301
431
let allInterfaces =
302
432
Array.concat [| allWebInterfaces; allWorkerAdditionalInterfaces |]
303
433
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
-
309
434
let allInterfacesMap =
310
435
allInterfaces |> toNameMap
311
436
@@ -699,7 +824,6 @@ module Emit =
699
824
| " CanvasPixelArray" -> " number[]"
700
825
| " DOMHighResTimeStamp" -> " number"
701
826
| " DOMString" -> " string"
702
- | " DOMTimeStamp" -> " number"
703
827
| " EndOfStreamError" -> " number"
704
828
| " EventListener" -> " EventListenerOrEventListenerObject"
705
829
| " double" | " float" -> " number"
@@ -717,7 +841,8 @@ module Emit =
717
841
if allInterfacesMap.ContainsKey objDomType ||
718
842
allCallbackFuncs.ContainsKey objDomType ||
719
843
allDictionariesMap.ContainsKey objDomType ||
720
- allEnumsMap.ContainsKey objDomType then
844
+ allEnumsMap.ContainsKey objDomType ||
845
+ InputIdlJson.hasType objDomType then
721
846
objDomType
722
847
// Name of a type alias. Just return itself
723
848
elif typeDefSet.Contains objDomType then objDomType
@@ -882,7 +1007,12 @@ module Emit =
882
1007
getAddedItems ItemKind.Callback flavor
883
1008
|> Array.iter emitCallbackFunctionsFromJson
884
1009
885
- GetCallbackFuncsByFlavor flavor |> Array.iter emitCallBackFunction
1010
+ let map = GetCallbackFuncsByFlavor flavor |> Array.map( fun i -> ( i.Name, i)) |> dict |> Dictionary
1011
+ InputIdlJson.inputIdl.CallbackFunctions
1012
+ |> Array.filter ( fun i -> flavor <> Worker || knownWorkerInterfaces.Contains i.Name)
1013
+ |> Array.iter ( InputIdlJson.Compat.convertCallbackFunction >> ( fun i -> map.[ i.Name] <- i))
1014
+
1015
+ map.Values |> Array.ofSeq |> Array.iter emitCallBackFunction
886
1016
887
1017
let EmitEnums flavor =
888
1018
let emitEnum ( e : Browser.Enum ) =
@@ -1378,7 +1508,7 @@ module Emit =
1378
1508
if hasNonStaticMember then emitStaticInterfaceWithNonStaticMembers() else emitPureStaticInterface()
1379
1509
1380
1510
let EmitNonCallbackInterfaces flavor =
1381
- for i in GetNonCallbackInterfacesByFlavor flavor do
1511
+ let emitNonCallbackInterface ( i : Browser.Interface ) =
1382
1512
// If the static attribute has a value, it means the type doesn't have a constructor
1383
1513
if i.Static.IsSome then
1384
1514
EmitStaticInterface flavor i
@@ -1388,6 +1518,13 @@ module Emit =
1388
1518
EmitInterface flavor i
1389
1519
EmitConstructor flavor i
1390
1520
1521
+ let map = GetNonCallbackInterfacesByFlavor flavor |> Array.map( fun i -> ( i.Name, i)) |> dict |> Dictionary
1522
+ InputIdlJson.inputIdl.Interfaces
1523
+ |> Array.filter ( fun i -> flavor <> Worker || i.Exposed |> Array.contains " Worker" )
1524
+ |> Array.iter ( InputIdlJson.Compat.convertInterface >> ( fun i -> map.[ i.Name] <- i))
1525
+
1526
+ map.Values |> Array.ofSeq |> Array.iter emitNonCallbackInterface
1527
+
1391
1528
let EmitDictionaries flavor =
1392
1529
1393
1530
let emitDictionary ( dict : Browser.Dictionary ) =
@@ -1427,12 +1564,19 @@ module Emit =
1427
1564
Pt.Printl " }"
1428
1565
Pt.Printl " "
1429
1566
1430
- browser.Dictionaries
1431
- |> Array.filter ( fun dict -> flavor <> Worker || knownWorkerInterfaces.Contains dict.Name)
1432
- |> Array.iter emitDictionary
1567
+ let map =
1568
+ browser.Dictionaries
1569
+ |> Array.filter ( fun dict -> flavor <> Worker || knownWorkerInterfaces.Contains dict.Name)
1570
+ |> Array.map( fun i -> ( i.Name, i)) |> dict |> Dictionary
1433
1571
1434
1572
if flavor = Worker then
1435
- worker.Dictionaries |> Array.iter emitDictionary
1573
+ worker.Dictionaries |> Array.iter ( fun dict -> map.[ dict.Name] <- dict)
1574
+
1575
+ InputIdlJson.inputIdl.Dictionaries
1576
+ |> Array.filter ( fun dict -> flavor <> Worker || knownWorkerInterfaces.Contains dict.Name)
1577
+ |> Array.iter ( InputIdlJson.Compat.convertDictionary >> ( fun i -> map.[ i.Name] <- i))
1578
+
1579
+ map.Values |> Array.ofSeq |> Array.iter emitDictionary
1436
1580
1437
1581
let EmitAddedInterface ( ai : InputJsonType.Root ) =
1438
1582
match ai.Extends with
@@ -1478,15 +1622,14 @@ module Emit =
1478
1622
let emitTypeDefFromJson ( typeDef : InputJsonType.Root ) =
1479
1623
Pt.Printl " type %s = %s ;" typeDef.Name.Value typeDef.Type.Value
1480
1624
1481
- match flavor with
1482
- | Flavor.Worker ->
1483
- browser.Typedefs
1484
- |> Array.filter ( fun typedef -> knownWorkerInterfaces.Contains typedef.NewType)
1485
- |> Array.iter emitTypeDef
1486
- | _ ->
1487
- browser.Typedefs
1488
- |> Array.filter ( fun typedef -> getRemovedItemByName typedef.NewType ItemKind.TypeDef " " |> Option.isNone)
1489
- |> Array.iter emitTypeDef
1625
+ let mutable map = browser.Typedefs |> Array.map( fun i -> ( i.NewType, i)) |> Map.ofArray
1626
+ InputIdlJson.inputIdl.Typedefs
1627
+ |> Array.iter ( InputIdlJson.Compat.convertTypedef >> ( fun i -> map <- map.Add( i.NewType, i)))
1628
+
1629
+ map |> Map.toArray |> Array.map snd
1630
+ |> Array.filter ( fun typedef -> getRemovedItemByName typedef.NewType ItemKind.TypeDef " " |> Option.isNone)
1631
+ |> Array.filter ( fun i -> ( flavor <> Flavor.Worker || knownWorkerInterfaces.Contains i.NewType))
1632
+ |> Array.iter emitTypeDef
1490
1633
1491
1634
InputJson.getAddedItems ItemKind.TypeDef flavor
1492
1635
|> Array.iter emitTypeDefFromJson
0 commit comments