From 4d97828443b57a2cb09b7da25a9f7fda3271137d Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Sun, 3 Dec 2017 14:19:05 +0900 Subject: [PATCH 1/4] add WebIDL typedefs by json --- TS.fsx | 57 +++++++++++++++++++-------- baselines/dom.generated.d.ts | 5 ++- baselines/webworker.generated.d.ts | 5 ++- inputfiles/addedTypes.json | 5 --- inputfiles/browser.webidl.json | 57 +++++++++++++++++++++++++++ inputfiles/knownWorkerInterfaces.json | 4 ++ inputfiles/removedTypes.json | 6 ++- inputfiles/sample.webidl.json | 23 +++++++++++ 8 files changed, 136 insertions(+), 26 deletions(-) create mode 100644 inputfiles/browser.webidl.json create mode 100644 inputfiles/sample.webidl.json diff --git a/TS.fsx b/TS.fsx index 7ccb2907a..a96edeb11 100644 --- a/TS.fsx +++ b/TS.fsx @@ -33,6 +33,11 @@ module Helpers = match FSharpValue.GetUnionFields(x, typeof<'a>) with | case, _ -> case.Name + let inline toNameMap< ^a when ^a: (member Name: string) > (data: array< ^a > ) = + data + |> Array.map (fun x -> ((^a: (member Name: string) x), x)) + |> Map.ofArray + module Option = let runIfSome f x = match x with @@ -131,6 +136,32 @@ module Types = type ExtendConflict = { BaseType: string; ExtendType: string list; MemberNames: string list } +module InputIdlJson = + open Helpers + open System.Xml.Linq + + type InputIdlJsonType = JsonProvider<"inputfiles/sample.webidl.json"> + + let inputIdl = + File.ReadAllText(GlobalVars.inputFolder + @"/browser.webidl.json") |> InputIdlJsonType.Parse + + let allTypedefsMap = + inputIdl.Typedefs |> toNameMap + + let hasType itemName = + allTypedefsMap.ContainsKey itemName + + module Compat = + let xNamespace = XNamespace.Get "http://schemas.microsoft.com/ie/webidl-xml" + + let convertTypedef (i: InputIdlJsonType.Typedef) = + let typedef = XElement(xNamespace + "typedef", XAttribute (XName.Get "new-type", i.Name), XAttribute (XName.Get "type", i.Type)) + + if OptionCheckValue true i.Nullable then + typedef.Add(XAttribute(XName.Get "nullable", "1")) + + Types.Browser.Typedef typedef + module InputJson = open Helpers open Types @@ -299,11 +330,6 @@ module Data = let allInterfaces = Array.concat [| allWebInterfaces; allWorkerAdditionalInterfaces |] - let inline toNameMap< ^a when ^a: (member Name: string) > (data: array< ^a > ) = - data - |> Array.map (fun x -> ((^a: (member Name: string) x), x)) - |> Map.ofArray - let allInterfacesMap = allInterfaces |> toNameMap @@ -682,7 +708,6 @@ module Emit = | "CanvasPixelArray" -> "number[]" | "DOMHighResTimeStamp" -> "number" | "DOMString" -> "string" - | "DOMTimeStamp" -> "number" | "EndOfStreamError" -> "number" | "double" | "float" -> "number" | "object" -> "any" @@ -699,7 +724,8 @@ module Emit = if allInterfacesMap.ContainsKey objDomType || allCallbackFuncs.ContainsKey objDomType || allDictionariesMap.ContainsKey objDomType || - allEnumsMap.ContainsKey objDomType then + allEnumsMap.ContainsKey objDomType || + InputIdlJson.hasType objDomType then objDomType // Name of a type alias. Just return itself elif typeDefSet.Contains objDomType then objDomType @@ -1463,15 +1489,14 @@ module Emit = let emitTypeDefFromJson (typeDef: InputJsonType.Root) = Pt.Printl "type %s = %s;" typeDef.Name.Value typeDef.Type.Value - match flavor with - | Flavor.Worker -> - browser.Typedefs - |> Array.filter (fun typedef -> knownWorkerInterfaces.Contains typedef.NewType) - |> Array.iter emitTypeDef - | _ -> - browser.Typedefs - |> Array.filter (fun typedef -> getRemovedItemByName typedef.NewType ItemKind.TypeDef "" |> Option.isNone) - |> Array.iter emitTypeDef + let mutable map = browser.Typedefs |> Array.map(fun i -> (i.NewType, i)) |> Map.ofArray + InputIdlJson.inputIdl.Typedefs + |> Array.iter (InputIdlJson.Compat.convertTypedef >> (fun i -> map <- map.Add(i.NewType, i))) + + map |> Map.toArray |> Array.map snd + |> Array.filter (fun typedef -> getRemovedItemByName typedef.NewType ItemKind.TypeDef "" |> Option.isNone) + |> Array.filter (fun i -> (flavor <> Flavor.Worker || knownWorkerInterfaces.Contains i.NewType)) + |> Array.iter emitTypeDef InputJson.getAddedItems ItemKind.TypeDef flavor |> Array.iter emitTypeDefFromJson diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index 6d679933a..3d1e1c53a 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -9069,7 +9069,7 @@ declare var PopStateEvent: { interface Position { readonly coords: Coordinates; - readonly timestamp: number; + readonly timestamp: DOMTimeStamp; } declare var Position: { @@ -15318,12 +15318,14 @@ declare function removeEventListener(type: string, listener: EventListener, opti type AAGUID = string; type AlgorithmIdentifier = string | Algorithm; type BodyInit = Blob | BufferSource | FormData | string; +type BufferSource = ArrayBufferView | ArrayBuffer; type ByteString = string; type ConstrainBoolean = boolean | ConstrainBooleanParameters; type ConstrainDOMString = string | string[] | ConstrainDOMStringParameters; type ConstrainDouble = number | ConstrainDoubleRange; type ConstrainLong = number | ConstrainLongRange; type CryptoOperationData = ArrayBufferView; +type DOMTimeStamp = number; type GLbitfield = number; type GLboolean = boolean; type GLbyte = number; @@ -15353,7 +15355,6 @@ type payloadtype = number; type ScrollBehavior = "auto" | "instant" | "smooth"; type ScrollLogicalPosition = "start" | "center" | "end" | "nearest"; type IDBValidKey = number | string | Date | IDBArrayKey; -type BufferSource = ArrayBuffer | ArrayBufferView; type MouseWheelEvent = WheelEvent; type ScrollRestoration = "auto" | "manual"; type FormDataEntryValue = string | File; diff --git a/baselines/webworker.generated.d.ts b/baselines/webworker.generated.d.ts index d851dc422..67e4b4748 100644 --- a/baselines/webworker.generated.d.ts +++ b/baselines/webworker.generated.d.ts @@ -846,7 +846,7 @@ declare var PerformanceTiming: { interface Position { readonly coords: Coordinates; - readonly timestamp: number; + readonly timestamp: DOMTimeStamp; } declare var Position: { @@ -1910,11 +1910,12 @@ declare function removeEventListener Date: Sun, 3 Dec 2017 14:29:19 +0900 Subject: [PATCH 2/4] Add some comments --- TS.fsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/TS.fsx b/TS.fsx index a96edeb11..84e47c7a1 100644 --- a/TS.fsx +++ b/TS.fsx @@ -151,6 +151,8 @@ module InputIdlJson = let hasType itemName = allTypedefsMap.ContainsKey itemName + // Converts new JSON types to existing matching XML types + // to reduce code duplication before removing XML support module Compat = let xNamespace = XNamespace.Get "http://schemas.microsoft.com/ie/webidl-xml" @@ -1489,15 +1491,19 @@ module Emit = let emitTypeDefFromJson (typeDef: InputJsonType.Root) = Pt.Printl "type %s = %s;" typeDef.Name.Value typeDef.Type.Value + // Load typedefs from XML input let mutable map = browser.Typedefs |> Array.map(fun i -> (i.NewType, i)) |> Map.ofArray + // Load and merge typedefs from new JSON input InputIdlJson.inputIdl.Typedefs |> Array.iter (InputIdlJson.Compat.convertTypedef >> (fun i -> map <- map.Add(i.NewType, i))) - + + // Filter by removedType.json + knownWorkerInterfaces.json map |> Map.toArray |> Array.map snd |> Array.filter (fun typedef -> getRemovedItemByName typedef.NewType ItemKind.TypeDef "" |> Option.isNone) |> Array.filter (fun i -> (flavor <> Flavor.Worker || knownWorkerInterfaces.Contains i.NewType)) |> Array.iter emitTypeDef + // Load manual additions from addedType.json InputJson.getAddedItems ItemKind.TypeDef flavor |> Array.iter emitTypeDefFromJson From 4a784fde99dd799b8bb7229e528e259d761f0a29 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Tue, 9 Jan 2018 21:24:53 +0900 Subject: [PATCH 3/4] splitted idls + simple merging --- TS.fsx | 10 +++++++++- .../{browser.webidl.json => idls/Web IDL.webidl.json} | 0 2 files changed, 9 insertions(+), 1 deletion(-) rename inputfiles/{browser.webidl.json => idls/Web IDL.webidl.json} (100%) diff --git a/TS.fsx b/TS.fsx index 84e47c7a1..ec878c42f 100644 --- a/TS.fsx +++ b/TS.fsx @@ -143,7 +143,15 @@ module InputIdlJson = type InputIdlJsonType = JsonProvider<"inputfiles/sample.webidl.json"> let inputIdl = - File.ReadAllText(GlobalVars.inputFolder + @"/browser.webidl.json") |> InputIdlJsonType.Parse + let jsons = + DirectoryInfo(GlobalVars.inputFolder + @"/idls").GetFiles() + |> Array.map (fun file -> file.FullName |> File.ReadAllText |> InputIdlJsonType.Parse) + + let inline extractJsonArray f = + jsons |> Array.collect f |> Array.map (fun item -> (^a: (member JsonValue: JsonValue) item)) |> JsonValue.Array; + + let list = [| ("typedefs", extractJsonArray (fun json -> json.Typedefs)) |] + InputIdlJsonType.Root(JsonValue.Record list) let allTypedefsMap = inputIdl.Typedefs |> toNameMap diff --git a/inputfiles/browser.webidl.json b/inputfiles/idls/Web IDL.webidl.json similarity index 100% rename from inputfiles/browser.webidl.json rename to inputfiles/idls/Web IDL.webidl.json From 534a701bec86a1b83103c1fbfe4b6077ae28dc96 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Sun, 21 Jan 2018 20:02:23 +0900 Subject: [PATCH 4/4] open Helpers --- TS.fsx | 1 + 1 file changed, 1 insertion(+) diff --git a/TS.fsx b/TS.fsx index ec878c42f..13720297f 100644 --- a/TS.fsx +++ b/TS.fsx @@ -284,6 +284,7 @@ module CommentJson = | _ -> None module Data = + open Helpers open Types // Used to decide if a member should be emitted given its static property and