pub fn ParseJSXElement( comptime parser_feature__typescript: bool, comptime parser_feature__jsx: JSXTransformType, comptime parser_feature__scan_only: bool, ) type { return struct { const P = js_parser.NewParser_(parser_feature__typescript, parser_feature__jsx, parser_feature__scan_only); const is_typescript_enabled = P.is_typescript_enabled; const only_scan_imports_and_do_not_visit = P.only_scan_imports_and_do_not_visit; pub fn parseJSXElement(noalias p: *P, loc: logger.Loc) anyerror!Expr { if (only_scan_imports_and_do_not_visit) { p.needs_jsx_import = true; } const tag = try JSXTag.parse(P, p); // The tag may have TypeScript type arguments: "/>" if (is_typescript_enabled) { // Pass a flag to the type argument skipper because we need to call _ = try p.skipTypeScriptTypeArguments(true); } var previous_string_with_backslash_loc = logger.Loc{}; var properties = G.Property.List{}; var key_prop_i: i32 = -1; var flags = Flags.JSXElement.Bitset{}; var start_tag: ?ExprNodeIndex = null; // Fragments don't have props // Fragments of the form "React.Fragment" are not parsed as fragments. if (@as(JSXTag.TagType, tag.data) == .tag) { start_tag = tag.data.tag; var spread_loc: logger.Loc = logger.Loc.Empty; var props = ListManaged(G.Property).init(p.allocator); var first_spread_prop_i: i32 = -1; var i: i32 = 0; parse_attributes: while (true) { switch (p.lexer.token) { .t_identifier => { defer i += 1; // Parse the prop name const key_range = p.lexer.range(); const prop_name_literal = p.lexer.identifier; const special_prop = E.JSXElement.SpecialProp.Map.get(prop_name_literal) orelse E.JSXElement.SpecialProp.any; try p.lexer.nextInsideJSXElement(); if (special_prop == .key) { // if (p.lexer.token != .t_equals) { // Unlike Babel, we're going to just warn here and move on. try p.log.addWarning(p.source, key_range.loc, "\"key\" prop ignored. Must be a string, number or symbol."); continue; } key_prop_i = i; } const prop_name = p.newExpr(E.String{ .data = prop_name_literal }, key_range.loc); // Parse the value var value: Expr = undefined; if (p.lexer.token != .t_equals) { // Implicitly true value //