* @param {import("../tokeniser.js").Tokeniser} tokeniser
(tokeniser)
| 3156 | * @param {import("../tokeniser.js").Tokeniser} tokeniser |
| 3157 | */ |
| 3158 | static parse(tokeniser) { |
| 3159 | const start_position = tokeniser.position; |
| 3160 | const ret = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_2__.autoParenter)( |
| 3161 | new IterableLike({ source: tokeniser.source, tokens: {} }), |
| 3162 | ); |
| 3163 | const { tokens } = ret; |
| 3164 | tokens.readonly = tokeniser.consume("readonly"); |
| 3165 | if (!tokens.readonly) { |
| 3166 | tokens.async = tokeniser.consume("async"); |
| 3167 | } |
| 3168 | tokens.base = tokens.readonly |
| 3169 | ? tokeniser.consume("maplike", "setlike") |
| 3170 | : tokens.async |
| 3171 | ? tokeniser.consume("iterable") |
| 3172 | : tokeniser.consume("iterable", "async_iterable", "maplike", "setlike"); |
| 3173 | if (!tokens.base) { |
| 3174 | tokeniser.unconsume(start_position); |
| 3175 | return; |
| 3176 | } |
| 3177 | |
| 3178 | const { type } = ret; |
| 3179 | const secondTypeRequired = type === "maplike"; |
| 3180 | const secondTypeAllowed = |
| 3181 | secondTypeRequired || type === "iterable" || type === "async_iterable"; |
| 3182 | const argumentAllowed = |
| 3183 | type === "async_iterable" || (ret.async && type === "iterable"); |
| 3184 | |
| 3185 | tokens.open = |
| 3186 | tokeniser.consume("<") || |
| 3187 | tokeniser.error(`Missing less-than sign \`<\` in ${type} declaration`); |
| 3188 | const first = |
| 3189 | (0,_helpers_js__WEBPACK_IMPORTED_MODULE_2__.type_with_extended_attributes)(tokeniser) || |
| 3190 | tokeniser.error(`Missing a type argument in ${type} declaration`); |
| 3191 | ret.idlType = [first]; |
| 3192 | ret.arguments = []; |
| 3193 | |
| 3194 | if (secondTypeAllowed) { |
| 3195 | first.tokens.separator = tokeniser.consume(","); |
| 3196 | if (first.tokens.separator) { |
| 3197 | ret.idlType.push((0,_helpers_js__WEBPACK_IMPORTED_MODULE_2__.type_with_extended_attributes)(tokeniser)); |
| 3198 | } else if (secondTypeRequired) { |
| 3199 | tokeniser.error(`Missing second type argument in ${type} declaration`); |
| 3200 | } |
| 3201 | } |
| 3202 | |
| 3203 | tokens.close = |
| 3204 | tokeniser.consume(">") || |
| 3205 | tokeniser.error(`Missing greater-than sign \`>\` in ${type} declaration`); |
| 3206 | |
| 3207 | if (tokeniser.probe("(")) { |
| 3208 | if (argumentAllowed) { |
| 3209 | tokens.argsOpen = tokeniser.consume("("); |
| 3210 | ret.arguments.push(...(0,_helpers_js__WEBPACK_IMPORTED_MODULE_2__.argument_list)(tokeniser)); |
| 3211 | tokens.argsClose = |
| 3212 | tokeniser.consume(")") || |
| 3213 | tokeniser.error("Unterminated async iterable argument list"); |
| 3214 | } else { |
| 3215 | tokeniser.error(`Arguments are only allowed for \`async iterable\``); |