MCPcopy Create free account
hub / github.com/nodejs/node / parse

Method parse

test/fixtures/wpt/resources/webidl2/lib/webidl2.js:3158–3224  ·  view source on GitHub ↗

* @param {import("../tokeniser.js").Tokeniser} tokeniser

(tokeniser)

Source from the content-addressed store, hash-verified

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\``);

Callers

nothing calls this directly

Calls 5

unconsumeMethod · 0.80
probeMethod · 0.80
consumeMethod · 0.45
errorMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected