Skip to content

Commit a15fdf1

Browse files
committed
add browser.webidl.json
1 parent 59f63d0 commit a15fdf1

File tree

8 files changed

+739
-58
lines changed

8 files changed

+739
-58
lines changed

TS.fsx

Lines changed: 165 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
135265
module 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

Comments
 (0)