Skip to content

Commit 98041d0

Browse files
committed
Move the additional type info to json files to make sending PR easier
1 parent d0bcd75 commit 98041d0

File tree

5 files changed

+275
-121
lines changed

5 files changed

+275
-121
lines changed

Shared.fs

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,47 @@ module GlobalVars =
1414
if not (Directory.Exists(__SOURCE_DIRECTORY__ + @"\generated")) then
1515
Directory.CreateDirectory(__SOURCE_DIRECTORY__ + @"\generated") |> ignore
1616

17-
//let srcFolder = (new DirectoryInfo(__SOURCE_DIRECTORY__)).Parent.Parent.Parent.Parent.FullName
1817
let inputFolder = __SOURCE_DIRECTORY__ + @"\inputfiles"
19-
let jsWebOutput = File.CreateText(__SOURCE_DIRECTORY__ + @"\generated\domWeb.js") :> TextWriter
20-
let jsWinOutput = File.CreateText(__SOURCE_DIRECTORY__ + @"\generated\domWindows.js") :> TextWriter
21-
let jsWorkerOutput = File.CreateText(__SOURCE_DIRECTORY__ + @"\generated\dedicatedworker.js") :> TextWriter
22-
let tsWebOutput = File.CreateText(__SOURCE_DIRECTORY__ + @"\generated\dom.generated.d.ts") :> TextWriter
23-
let tsWorkerOutput = File.CreateText(__SOURCE_DIRECTORY__ + @"\generated\webworker.generated.d.ts") :> TextWriter
18+
let makeTextWriter fileName = File.CreateText(__SOURCE_DIRECTORY__ + @"\generated\" + fileName) :> TextWriter
19+
let jsWebOutput = makeTextWriter "domWeb.js"
20+
let jsWinOutput = makeTextWriter "domWindows.js"
21+
let jsWorkerOutput = makeTextWriter "dedicatedworker.js"
22+
let tsWebOutput = makeTextWriter "dom.generated.d.ts"
23+
let tsWorkerOutput = makeTextWriter "webworker.generated.d.ts"
2424
let defaultEventType = "Event"
2525

2626
/// ===========================================
2727
/// Types
2828
/// ===========================================
2929
type Browser = XmlProvider< "sample.xml", Global=true >
3030

31-
type commentType = JsonProvider< "inputfiles\comments.json" >
31+
type CommentType = JsonProvider< "inputfiles\comments.json" >
3232

33-
let comments = File.ReadAllText(__SOURCE_DIRECTORY__ + @"\inputfiles\comments.json") |> commentType.Parse
33+
type TypesFromJsonFile = JsonProvider< "inputfiles\overridingTypes.json" >
34+
35+
let overridingTypes =
36+
File.ReadAllText(__SOURCE_DIRECTORY__ + @"\inputfiles\overridingTypes.json") |> TypesFromJsonFile.Parse
37+
38+
let removedTypes =
39+
File.ReadAllText(__SOURCE_DIRECTORY__ + @"\inputfiles\removedTypes.json") |> TypesFromJsonFile.Parse
40+
41+
let addedTypes =
42+
File.ReadAllText(__SOURCE_DIRECTORY__ + @"\inputfiles\addedTypes.json") |> TypesFromJsonFile.Parse
43+
44+
type MemberKind =
45+
Property | Method
46+
member this.ToString = if this = Property then "property" else "method"
47+
48+
let findTypeFromJsonArray (jsonArray: TypesFromJsonFile.Root []) mName iName (kind: MemberKind) =
49+
jsonArray
50+
|> Array.tryFind (fun t ->
51+
t.Name = mName && (t.Interface.IsNone || t.Interface.Value = iName) && t.Kind = kind.ToString)
52+
53+
let findOverridingType mName iName (kind: MemberKind) = findTypeFromJsonArray overridingTypes mName iName kind
54+
let findRemovedType mName iName (kind: MemberKind) = findTypeFromJsonArray removedTypes mName iName kind
55+
let findAddedType mName iName (kind: MemberKind) = findTypeFromJsonArray addedTypes mName iName kind
56+
57+
let comments = File.ReadAllText(__SOURCE_DIRECTORY__ + @"\inputfiles\comments.json") |> CommentType.Parse
3458

3559
let GetCommentForProperty iName pName =
3660
match comments.Interfaces |> Array.tryFind (fun i -> i.Name = iName) with
@@ -181,7 +205,7 @@ let worker =
181205
/// all share a 'tag' property
182206
let inline ShouldKeep flavor (i : ^a when ^a : (member Tags : string option) and ^a : (member Name : string)) =
183207
let filterByTag =
184-
match ((^a : (member Tags : string option) i)) with
208+
match ((((((^a : (member Tags : string option) i)))))) with
185209
| Some tags ->
186210
// Check if should be included
187211
match flavor with
@@ -195,7 +219,6 @@ let inline ShouldKeep flavor (i : ^a when ^a : (member Tags : string option) and
195219
|> Seq.exists (fun t -> tags.Contains t)
196220
|> not
197221
| _ -> true
198-
199222
filterByTag
200223

201224
// Global interfacename to interface object map
@@ -451,13 +474,6 @@ let GetGlobalPollutorName flavor =
451474
| Some gp -> gp.Name
452475
| _ -> "Window"
453476

454-
// let flavorStr = flavor.ToString()
455-
// let iList = GetAllInterfacesByFlavor flavor
456-
// match Array.tryFind (fun (i:Browser.Interface) -> OptionCheckValue flavorStr i.PrimaryGlobal ) iList with
457-
// | Some i -> i.Name
458-
// | _ -> match Array.tryFind (fun (i:Browser.Interface) -> OptionCheckValue flavorStr i.Global) iList with
459-
// | Some i -> i.Name
460-
// | _ -> "Window"
461477
/// Return a sequence of returntype * HashSet<paramCombination> tuple
462478
let GetOverloads (f : Function) (decomposeMultipleTypes : bool) =
463479
let getParams (f : Function) =

TS.fs

Lines changed: 64 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -135,84 +135,61 @@ let DumpCreateEventOverloads (m: Browser.Method) =
135135
Pt.printl "createEvent(eventInterface: string): Event;"
136136

137137
let ParamsToString (ps: Param list) =
138-
let ParamToString (p: Param) =
138+
let paramToString (p: Param) =
139139
(if p.Variadic then "..." else "") +
140140
(AdjustParamName p.Name) +
141141
(if not p.Variadic && p.Optional then "?: " else ": ") +
142142
(DomTypeToTsType p.Type) +
143143
(if p.Variadic then "[]" else "")
144-
String.Join(", ", (List.map ParamToString ps))
144+
String.Join(", ", (List.map paramToString ps))
145145

146146
let DumpMethod flavor prefix (i:Browser.Interface) (m:Browser.Method) =
147+
// print comment
147148
if m.Name.IsSome then
148149
match GetCommentForMethod i.Name m.Name.Value with
149150
| Some comment -> Pt.printl "%s" comment
150151
| _ -> ()
151152

152-
match i.Name, m.Name with
153-
| _, Some "createElement" ->
154-
DumpCreateElementOverloads m
155-
| _, Some "createEvent" ->
156-
DumpCreateEventOverloads m
157-
| _, Some "getElementsByTagName" ->
158-
DumpGetElementsByTagNameOverloads m
159-
| _, Some "getElementsByTagNameNS" ->
160-
Pt.printl "getElementsByTagNameNS(namespaceURI: string, localName: string): NodeListOf<Element>;"
161-
| _, Some "getElementsByClassName" ->
162-
// Issue 4401:
163-
// in the spec "getElementsByClassName" is defined in both Document and HTMLElement, actually
164-
// it should be in Element instead of HTMLElement. So suppress it here if the i.Name equals HTMLElement
165-
if i.Name <> "HTMLElement" then
166-
Pt.printl "getElementsByClassName(classNames: string): NodeListOf<Element>;"
167-
| _, Some "getElementsByName" ->
168-
Pt.printl "getElementsByName(elementName: string): NodeListOf<Element>;"
169-
| "NodeSelector", Some "querySelectorAll" ->
170-
Pt.printl "querySelectorAll(selectors: string): NodeListOf<Element>;"
171-
| "Document", Some "getElementById" ->
172-
Pt.printl "getElementById(elementId: string): HTMLElement;"
173-
| "Document", Some "open" ->
174-
Pt.printl "open(url?: string, name?: string, features?: string, replace?: boolean): Document;"
175-
| _, Some "alert" ->
176-
Pt.printl "%salert(message?: any): void;" prefix
177-
// Todo: hack for issue #2984
178-
|"HTMLCanvasElement", Some "getContext" ->
179-
Pt.printl "%sgetContext(contextId: \"2d\"): CanvasRenderingContext2D;" prefix
180-
Pt.printl "%sgetContext(contextId: \"experimental-webgl\"): WebGLRenderingContext;" prefix
181-
Pt.printl "%sgetContext(contextId: string, ...args: any[]): CanvasRenderingContext2D | WebGLRenderingContext;" prefix
182-
// Todo: hack for issue #3002
183-
| "XMLHttpRequest", Some "send" ->
184-
if flavor <> Flavor.Worker then
185-
Pt.printl "%ssend(data?: Document): void;" prefix
186-
Pt.printl "%ssend(data?: string): void;" prefix
187-
Pt.printl "%ssend(data?: any): void;" prefix
188-
// Todo: hack for issue #3344
189-
| "WebGLRenderingContext", Some "texImage2D" ->
190-
Pt.printl "%stexImage2D(target: number, level: number, internalformat: number, width: number, height: number, border: number, format: number, type: number, pixels: ArrayBufferView): void;" prefix
191-
Pt.printl "%stexImage2D(target: number, level: number, internalformat: number, format: number, type: number, image: HTMLImageElement): void;" prefix
192-
Pt.printl "%stexImage2D(target: number, level: number, internalformat: number, format: number, type: number, canvas: HTMLCanvasElement): void;" prefix
193-
Pt.printl "%stexImage2D(target: number, level: number, internalformat: number, format: number, type: number, video: HTMLVideoElement): void;" prefix
194-
Pt.printl "%stexImage2D(target: number, level: number, internalformat: number, format: number, type: number, pixels: ImageData): void;" prefix
195-
| "WebGLRenderingContext", Some "texSubImage2D" ->
196-
Pt.printl "%stexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, width: number, height: number, format: number, type: number, pixels: ArrayBufferView): void;" prefix
197-
Pt.printl "%stexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, image: HTMLImageElement): void;" prefix
198-
Pt.printl "%stexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, canvas: HTMLCanvasElement): void;" prefix
199-
Pt.printl "%stexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, video: HTMLVideoElement): void;" prefix
200-
Pt.printl "%stexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, pixels: ImageData): void;" prefix
201-
| _ ->
202-
let consoleMethodsNeedToReplaceStringWithAny = [|"dir"; "dirxml"; "error"; "info"; "log"; "warn"|]
203-
GetOverloads (Method m) false
204-
|> List.iter
205-
(fun { ParamCombinations = pCombList; ReturnTypes = rTypes } ->
206-
let paramsString =
207-
// Some console methods should accept "any" instead of "string" for convenience, although
208-
// it is said to be string in the spec
209-
if i.Name = "Console" && m.Name.IsSome && Array.contains m.Name.Value consoleMethodsNeedToReplaceStringWithAny then
210-
(ParamsToString pCombList).Replace("string", "any")
211-
else
212-
ParamsToString pCombList
213-
let returnString = rTypes |> List.map DomTypeToTsType |> String.concat " | "
214-
Pt.printl "%s%s(%s): %s;" prefix (if m.Name.IsSome then m.Name.Value else "") paramsString returnString
215-
)
153+
// find if there are overriding signatures in the external json file
154+
let removedType =
155+
match m.Name with
156+
| Some mName -> findRemovedType mName i.Name MemberKind.Method
157+
| None -> None
158+
159+
let overridenType =
160+
match m.Name with
161+
| Some mName -> findOverridingType mName i.Name MemberKind.Method
162+
| None -> None
163+
164+
match removedType with
165+
| Some r -> ()
166+
| None ->
167+
match overridenType with
168+
| Some t ->
169+
match flavor with
170+
| Windows | Web -> t.WebOnlySignatures |> Array.iter (Pt.printl "%s%s;" prefix)
171+
| _ -> ()
172+
t.Signatures |> Array.iter (Pt.printl "%s%s;" prefix)
173+
| None ->
174+
match i.Name, m.Name with
175+
| _, Some "createElement" -> DumpCreateElementOverloads m
176+
| _, Some "createEvent" -> DumpCreateEventOverloads m
177+
| _, Some "getElementsByTagName" -> DumpGetElementsByTagNameOverloads m
178+
| _ ->
179+
let consoleMethodsNeedToReplaceStringWithAny = [|"dir"; "dirxml"; "error"; "info"; "log"; "warn"|]
180+
GetOverloads (Method m) false
181+
|> List.iter
182+
(fun { ParamCombinations = pCombList; ReturnTypes = rTypes } ->
183+
let paramsString =
184+
// Some console methods should accept "any" instead of "string" for convenience, although
185+
// it is said to be string in the spec
186+
if i.Name = "Console" && m.Name.IsSome && Array.contains m.Name.Value consoleMethodsNeedToReplaceStringWithAny then
187+
(ParamsToString pCombList).Replace("string", "any")
188+
else
189+
ParamsToString pCombList
190+
let returnString = rTypes |> List.map DomTypeToTsType |> String.concat " | "
191+
Pt.printl "%s%s(%s): %s;" prefix (if m.Name.IsSome then m.Name.Value else "") paramsString returnString
192+
)
216193

217194
let DumpCallBackInterface (i:Browser.Interface) =
218195
Pt.printl "interface %s {" i.Name
@@ -251,50 +228,33 @@ let DumpEnums () =
251228
let DumpMembers flavor prefix (dumpScope: DumpScope) (i:Browser.Interface) =
252229
// -------- Dump properties --------
253230
// Note: the schema file shows the property doesn't have static attribute
231+
let dumpProperty (p: Browser.Property) =
232+
match GetCommentForProperty i.Name p.Name with
233+
| Some comment -> Pt.printl "%s" comment
234+
| _ -> ()
235+
236+
match findRemovedType p.Name i.Name MemberKind.Property with
237+
| Some _ -> ()
238+
| None ->
239+
match findOverridingType p.Name i.Name MemberKind.Property with
240+
| Some t -> Pt.printl "%s%s: %s;" prefix t.Name t.Type.Value
241+
| None ->
242+
let pType = match p.Type with
243+
| "EventHandler" -> String.Format("(ev: {0}) => any", ehNameToEType.[p.Name])
244+
| _ -> DomTypeToTsType p.Type
245+
Pt.printl "%s%s: %s;" prefix p.Name pType
246+
254247
if dumpScope <> DumpScope.StaticOnly then
255248
match i.Properties with
256249
| Some ps ->
257250
ps.Properties
258251
|> Array.filter (ShouldKeep flavor)
259-
|> Array.iter (fun p ->
260-
match GetCommentForProperty i.Name p.Name with
261-
| Some comment -> Pt.printl "%s" comment
262-
| _ -> ()
263-
264-
let pType =
265-
match i.Name, p.Name, p.Type with
266-
| _, _, "EventHandler" ->
267-
String.Format("(ev: {0}) => any", ehNameToEType.[p.Name])
268-
// There are type conflicts between
269-
| "BeforeUnloadEvent", "returnValue", _-> "any"
270-
| "HTMLEmbedElement", "hidden", _ -> "any"
271-
| _ -> DomTypeToTsType p.Type
272-
match p.Name, pType with
273-
// HOTFIX: although technically the type of documentElement should be "Element",
274-
// but in most cases typescript would be dealing with HTML document, therefore it
275-
// would be more convenient (and more backward compatible) to assume "HTMLElement"
276-
| "documentElement", _ -> Pt.printl "%sdocumentElement: HTMLElement;" prefix
277-
// HOTFIX: move the className and id property from HTMLElement to Element
278-
| "id", _ when i.Name = "HTMLElement" -> ()
279-
| "className", _ when i.Name = "HTMLElement" -> ()
280-
| "className", _ when i.Name = "SVGStylable" ->
281-
Pt.printl "%sclassName: any;" prefix
282-
// HOTFIX: explicitly denote the type of SVGElement.className property to "any", and making it
283-
// appear after "id"
284-
| "id", _ when i.Name = "SVGElement" ->
285-
Pt.printl "%s%s: %s;" prefix p.Name pType
286-
Pt.printl "%sclassName: any;" prefix
287-
// HOTFIX: Issue 3884
288-
| "orientation", _ when i.Name = "Window" ->
289-
Pt.printl "%sorientation: string | number;" prefix
290-
| _ -> Pt.printl "%s%s: %s;" prefix p.Name pType)
252+
|> Array.iter dumpProperty
291253
| None -> ()
292-
// Hack to add the URL property to window
293-
if i.Name = "Window" then
294-
Pt.printl "%sURL: URL;" prefix
295-
if i.Name = "Element" then
296-
Pt.printl "%sid: string;" prefix
297-
Pt.printl "%sclassName: string;" prefix
254+
255+
addedTypes
256+
|> Array.filter (fun t -> t.Interface.IsNone || t.Interface.Value = i.Name)
257+
|> Array.iter (fun t -> Pt.printl "%s%s: %s;" prefix t.Name t.Type.Value)
298258

299259
// -------- Dump methods --------
300260
// Note: two cases:

inputfiles/addedTypes.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
[
2+
{
3+
"kind": "property",
4+
"interface": "Window",
5+
"name": "URL",
6+
"type": "URL"
7+
},
8+
{
9+
"kind": "property",
10+
"interface": "Element",
11+
"name": "id",
12+
"type": "string"
13+
},
14+
{
15+
"kind": "property",
16+
"interface": "Element",
17+
"name": "className",
18+
"type": "string"
19+
},
20+
{
21+
"kind": "property",
22+
"interface": "SVGElement",
23+
"name": "className",
24+
"type": "any"
25+
}
26+
]

0 commit comments

Comments
 (0)