Skip to content

Commit bdbcbfe

Browse files
committed
support implicit iterable interfaces
1 parent 0e4ebf4 commit bdbcbfe

File tree

4 files changed

+158
-7
lines changed

4 files changed

+158
-7
lines changed

Diff for: TS.fsx

+52-5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ module GlobalVars =
2020

2121
let makeTextWriter fileName = File.CreateText(Path.Combine(outputFolder, fileName)) :> TextWriter
2222
let tsWebOutput = makeTextWriter "dom.generated.d.ts"
23+
let tsWebES6Output = makeTextWriter "dom.generated.es6.d.ts"
2324
let tsWorkerOutput = makeTextWriter "webworker.generated.d.ts"
2425
let defaultEventType = "Event"
2526

@@ -698,6 +699,9 @@ module Emit =
698699
let extendedTypes =
699700
["ArrayBuffer";"ArrayBufferView";"Int8Array";"Uint8Array";"Int16Array";"Uint16Array";"Int32Array";"Uint32Array";"Float32Array";"Float64Array"]
700701

702+
let integerTypes =
703+
["byte";"octet";"short";"unsigned short";"long";"unsigned long";"long long";"unsigned long long"]
704+
701705
/// Get typescript type using object dom type, object name, and it's associated interface name
702706
let rec DomTypeToTsType (objDomType: string) =
703707
match objDomType.Trim('?') with
@@ -713,15 +717,13 @@ module Emit =
713717
| "EventListener" -> "EventListenerOrEventListenerObject"
714718
| "double" | "float" -> "number"
715719
| "Function" -> "Function"
716-
| "long" | "long long" | "signed long" | "signed long long" | "unsigned long" | "unsigned long long" -> "number"
717-
| "octet" | "byte" -> "number"
718720
| "object" -> "any"
719721
| "Promise" -> "Promise"
720722
| "ReadyState" -> "string"
721723
| "sequence" -> "Array"
722-
| "short" | "signed short" | "unsigned short" -> "number"
723724
| "UnrestrictedDouble" -> "number"
724725
| "void" -> "void"
726+
| integerType when List.contains integerType integerTypes -> "number"
725727
| extendedType when List.contains extendedType extendedTypes -> extendedType
726728
| _ ->
727729
if ignoreDOMTypes && Seq.contains objDomType ["Element"; "Window"; "Document"] then "any"
@@ -1466,8 +1468,8 @@ module Emit =
14661468
Pt.Reset()
14671469
Pt.Printl "/////////////////////////////"
14681470
match flavor with
1469-
| Worker -> Pt.Printl "/// IE Worker APIs"
1470-
| _ -> Pt.Printl "/// IE DOM APIs"
1471+
| Worker -> Pt.Printl "/// MSEdge Worker APIs"
1472+
| _ -> Pt.Printl "/// MSEdge DOM APIs"
14711473
Pt.Printl "/////////////////////////////"
14721474
Pt.Printl ""
14731475

@@ -1502,8 +1504,53 @@ module Emit =
15021504
target.Flush()
15031505
target.Close()
15041506

1507+
let EmitIterator (i: Browser.Interface) =
1508+
let isIntegerKeyParam (p: Browser.Param) =
1509+
List.contains p.Type integerTypes
1510+
1511+
// check anonymous unsigned long getter and length property
1512+
let isIterableGetter (m: Browser.Method) =
1513+
m.Getter = Some 1 && m.Params.Length = 1 && isIntegerKeyParam m.Params.[0]
1514+
1515+
let findIterableGetter() =
1516+
let anonymousGetter =
1517+
if (i.AnonymousMethods.IsSome) then Array.tryFind isIterableGetter i.AnonymousMethods.Value.Methods
1518+
else None
1519+
1520+
if (anonymousGetter.IsSome) then anonymousGetter
1521+
else if (i.Methods.IsSome) then Array.tryFind isIterableGetter i.Methods.Value.Methods
1522+
else None
1523+
1524+
let findLengthProperty (p: Browser.Property) =
1525+
p.Name = "length" && List.contains p.Type integerTypes
1526+
1527+
if i.Name <> "Window" && i.Properties.IsSome then
1528+
let iterableGetter = findIterableGetter()
1529+
let lengthProperty = Array.tryFind findLengthProperty i.Properties.Value.Properties
1530+
if iterableGetter.IsSome && lengthProperty.IsSome then
1531+
Pt.Printl "interface %s {" i.Name
1532+
Pt.IncreaseIndent()
1533+
Pt.Printl "[Symbol.iterator](): IterableIterator<%s>" iterableGetter.Value.Type
1534+
Pt.DecreaseIndent()
1535+
Pt.Printl "}"
1536+
Pt.Printl ""
1537+
1538+
let EmitES6Thing (target: TextWriter) =
1539+
Pt.Reset()
1540+
Pt.Printl "/////////////////////////////"
1541+
Pt.Printl "/// MSEdge DOM ES6 APIs"
1542+
Pt.Printl "/////////////////////////////"
1543+
Pt.Printl ""
1544+
1545+
browser.Interfaces |> Array.iter EmitIterator
1546+
1547+
fprintf target "%s" (Pt.GetResult())
1548+
target.Flush()
1549+
target.Close()
1550+
15051551
let EmitDomWeb () =
15061552
EmitTheWholeThing Flavor.All GlobalVars.tsWebOutput
1553+
EmitES6Thing GlobalVars.tsWebES6Output
15071554

15081555
let EmitDomWorker () =
15091556
ignoreDOMTypes <- true

Diff for: baselines/dom.generated.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/////////////////////////////
3-
/// IE DOM APIs
3+
/// MSEdge DOM APIs
44
/////////////////////////////
55

66
interface Account {

Diff for: baselines/dom.generated.es6.d.ts

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
2+
/////////////////////////////
3+
/// MSEdge DOM ES6 APIs
4+
/////////////////////////////
5+
6+
interface AudioTrackList {
7+
[Symbol.iterator](): IterableIterator<AudioTrack>
8+
}
9+
10+
interface CSSRuleList {
11+
[Symbol.iterator](): IterableIterator<CSSRule>
12+
}
13+
14+
interface CSSStyleDeclaration {
15+
[Symbol.iterator](): IterableIterator<DOMString>
16+
}
17+
18+
interface ClientRectList {
19+
[Symbol.iterator](): IterableIterator<ClientRect>
20+
}
21+
22+
interface DOMStringList {
23+
[Symbol.iterator](): IterableIterator<DOMString>
24+
}
25+
26+
interface DOMTokenList {
27+
[Symbol.iterator](): IterableIterator<DOMString>
28+
}
29+
30+
interface DataTransferItemList {
31+
[Symbol.iterator](): IterableIterator<File>
32+
}
33+
34+
interface FileList {
35+
[Symbol.iterator](): IterableIterator<File>
36+
}
37+
38+
interface HTMLAllCollection {
39+
[Symbol.iterator](): IterableIterator<Element>
40+
}
41+
42+
interface HTMLCollection {
43+
[Symbol.iterator](): IterableIterator<Element>
44+
}
45+
46+
interface MSRangeCollection {
47+
[Symbol.iterator](): IterableIterator<Range>
48+
}
49+
50+
interface MediaList {
51+
[Symbol.iterator](): IterableIterator<DOMString>
52+
}
53+
54+
interface MimeTypeArray {
55+
[Symbol.iterator](): IterableIterator<Plugin>
56+
}
57+
58+
interface NamedNodeMap {
59+
[Symbol.iterator](): IterableIterator<Attr>
60+
}
61+
62+
interface NodeList {
63+
[Symbol.iterator](): IterableIterator<Node>
64+
}
65+
66+
interface Plugin {
67+
[Symbol.iterator](): IterableIterator<MimeType>
68+
}
69+
70+
interface PluginArray {
71+
[Symbol.iterator](): IterableIterator<Plugin>
72+
}
73+
74+
interface SourceBufferList {
75+
[Symbol.iterator](): IterableIterator<SourceBuffer>
76+
}
77+
78+
interface Storage {
79+
[Symbol.iterator](): IterableIterator<DOMString>
80+
}
81+
82+
interface StyleSheetList {
83+
[Symbol.iterator](): IterableIterator<StyleSheet>
84+
}
85+
86+
interface StyleSheetPageList {
87+
[Symbol.iterator](): IterableIterator<CSSPageRule>
88+
}
89+
90+
interface TextTrackCueList {
91+
[Symbol.iterator](): IterableIterator<TextTrackCue>
92+
}
93+
94+
interface TextTrackList {
95+
[Symbol.iterator](): IterableIterator<TextTrack>
96+
}
97+
98+
interface TouchList {
99+
[Symbol.iterator](): IterableIterator<Touch>
100+
}
101+
102+
interface VideoTrackList {
103+
[Symbol.iterator](): IterableIterator<VideoTrack>
104+
}

Diff for: baselines/webworker.generated.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/////////////////////////////
3-
/// IE Worker APIs
3+
/// MSEdge Worker APIs
44
/////////////////////////////
55

66
interface Algorithm {

0 commit comments

Comments
 (0)