1
+ import { validationError } from "../error.js" ;
1
2
import { Base } from "./base.js" ;
2
3
import {
3
4
type_with_extended_attributes ,
@@ -23,16 +24,18 @@ export class IterableLike extends Base {
23
24
? tokeniser . consume ( "maplike" , "setlike" )
24
25
: tokens . async
25
26
? tokeniser . consume ( "iterable" )
26
- : tokeniser . consume ( "iterable" , "maplike" , "setlike" ) ;
27
+ : tokeniser . consume ( "iterable" , "async_iterable" , " maplike", "setlike" ) ;
27
28
if ( ! tokens . base ) {
28
29
tokeniser . unconsume ( start_position ) ;
29
30
return ;
30
31
}
31
32
32
33
const { type } = ret ;
33
34
const secondTypeRequired = type === "maplike" ;
34
- const secondTypeAllowed = secondTypeRequired || type === "iterable" ;
35
- const argumentAllowed = ret . async && type === "iterable" ;
35
+ const secondTypeAllowed =
36
+ secondTypeRequired || type === "iterable" || type === "async_iterable" ;
37
+ const argumentAllowed =
38
+ type === "async_iterable" || ( ret . async && type === "iterable" ) ;
36
39
37
40
tokens . open =
38
41
tokeniser . consume ( "<" ) ||
@@ -86,6 +89,18 @@ export class IterableLike extends Base {
86
89
}
87
90
88
91
* validate ( defs ) {
92
+ if ( this . async && this . type === "iterable" ) {
93
+ const message = "`async iterable` is now changed to `async_iterable`." ;
94
+ yield validationError (
95
+ this . tokens . async ,
96
+ this ,
97
+ "obsolete-async-iterable-syntax" ,
98
+ message ,
99
+ {
100
+ autofix : autofixAsyncIterableSyntax ( this ) ,
101
+ } ,
102
+ ) ;
103
+ }
89
104
for ( const type of this . idlType ) {
90
105
yield * type . validate ( defs ) ;
91
106
}
@@ -114,3 +129,18 @@ export class IterableLike extends Base {
114
129
) ;
115
130
}
116
131
}
132
+
133
+ /**
134
+ * @param {IterableLike } iterableLike
135
+ */
136
+ function autofixAsyncIterableSyntax ( iterableLike ) {
137
+ return ( ) => {
138
+ const async = iterableLike . tokens . async ;
139
+ iterableLike . tokens . base = {
140
+ ...async ,
141
+ type : "async_iterable" ,
142
+ value : "async_iterable" ,
143
+ } ;
144
+ delete iterableLike . tokens . async ;
145
+ } ;
146
+ }
0 commit comments