diff --git a/dag/extdeps/languages/typescript/program.dag b/dag/extdeps/languages/typescript/program.dag index 33a20d79502..9fccbb7034b 100644 --- a/dag/extdeps/languages/typescript/program.dag +++ b/dag/extdeps/languages/typescript/program.dag @@ -157,8 +157,8 @@ fn ts_return(expr: TsExpr?) -> TsStmt { Return { expr: expr } } -fn ts_if(cond: TsExpr, then: TsStmt, else_stmt: TsStmt?) -> TsStmt { - If { cond: cond, then: then, else_stmt: else_stmt } +fn ts_if(cond: TsExpr, then_stmt: TsStmt, else_stmt: TsStmt?) -> TsStmt { + If { cond: cond, then: then_stmt, else_stmt: else_stmt } } fn ts_for_of(var_name: String, iterable: TsExpr, body: TsStmt) -> TsStmt { diff --git a/dag/gunbc/node_http_server_emit.dag b/dag/gunbc/node_http_server_emit.dag index 47817c8ae45..b2af7f70ac8 100644 --- a/dag/gunbc/node_http_server_emit.dag +++ b/dag/gunbc/node_http_server_emit.dag @@ -185,7 +185,7 @@ fn node_http_request_handler_block() -> TsStmt { args: [ts_ident(name: "path")] ) ), - then: node_http_match_handler_body(), + then_stmt: node_http_match_handler_body(), else_stmt: none ) ), @@ -213,7 +213,7 @@ fn node_http_request_handler_block() -> TsStmt { op: ">", right: ts_lit_num(text: "0") ), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_const( name: "allow", value: ts_call( diff --git a/dag/gunbc/recurring_failure_mode/seed_admits_a_keyword_as_a_pattern_binder.dag b/dag/gunbc/recurring_failure_mode/seed_admits_a_keyword_as_a_pattern_binder.dag index f97395e5138..cc9fa47cbd0 100644 --- a/dag/gunbc/recurring_failure_mode/seed_admits_a_keyword_as_a_pattern_binder.dag +++ b/dag/gunbc/recurring_failure_mode/seed_admits_a_keyword_as_a_pattern_binder.dag @@ -15,6 +15,8 @@ data seed_admits_a_keyword_as_a_pattern_binder: RecurringFailureMode = Recurring "CEILING AND NEXT-RUNG TRIGGER: structurally impossible once no v2 source is admitted through the seed parser alone -- the native parse is the one grammar every module must pass. The capability that retires the leniency's reach is the native route qualifying the corpus it parses, so a keyword binder refuses at a gate every PR runs rather than only in a census.", "SECOND SHAPE (N7-1, gunbc#13028): a fn PARAMETER spelled `loop` and then READ as a value -- `fn infer_loop_member_role(loop: Node)` with `loop.kind`, `loop: loop`, `at: loop` in its body. The v2 parser admits the declaration (`fn f(loop: Int) -> Int { 1 }` parses) and refuses every value use with parse_g0_tokens_remain, so the whole of v2.compiler.infer became a native file refusal while every seed-interpreted control stayed green. Found by bisecting the file's new items through v2.compiler.parse parse_module_prepared under the seed: exactly the three items that read `loop` refused. The same root as the pattern-binder shape -- the seed lexes a keyword as an identifier -- reached through a binding position the pattern-binder repair does not cover.", "THIRD SPECIMEN (the parameter shape, keyword `then`): v2.compiler.service_realization realization_require_conj declared `then: fn() -> Optional` and called it as `then()`; `then` is ^dag_token_kw_then. The whole module was a native file refusal (dependency/native census run 37197235156, parse_g0_tokens_remain, no locus); v2.compiler.parse_acceptance_census located it at bytes 18350..18351, the `(` after the keyword. Renaming the parameter (and its argument labels) to `proceed` is the repair: the source was invalid, as in the second shape.", + "FOURTH SPECIMEN, THE BINDER/REFERENCE ASYMMETRY (2026-10-03, ROOT E of the native seven): the v2 grammar admitted keywords as BINDING names (dag_binding_name_keyword_tokens at every parameter, `let`, `node NAME` / `NAME =` and field-pattern binder) but admitted only an identifier plus `module` / `data` as a REFERENCE (dag_grammar_primary_name_expr), so a name could be declared and never used. The refusal then landed at the first USE as the generic parse_g0_tokens_remain, far from the binder: src/v2/compiler/body_lowering_fold.dag `body_lower_exit_first(.., then: Node, ..)` refused at `node: then`, and src/v2/compiler/service_realization.dag `realization_require_conj(.., then: fn() ..)` at `then()` -- both inside the native seven's import closure, measured at main a0a5c62161b. A native census over dag + src/v2 (the v2.cli.compile_cli if-arm-reader-differential refused-file list, located per file by a single-file native emit) found nine such files at their first refusal, and a declaration scan found five non-contextual keyword PARAMETERS (then x3, alias, as).", + "REPAIR AND THE CONTEXTUAL PRECEDENT (operator ruling via the N7 manager, 2026-10-03: close the asymmetry from the BINDER side, symmetrically): every value-binder position now consumes the reference production itself (dag_grammar_primary_name_expr) behind a leading not-predicate guard that refuses any other keyword as v2.std.parse_refusal_reason KeywordAsValueName, located at the keyword (dag_grammar_value_name_before / dag_grammar_value_name_unconditional / dag_grammar_field_pattern_binder_guard). A field LABEL is not a value name and still admits a keyword. ONE declared set, dag_contextual_value_name_keywords = module, data, is read by BOTH ends, so a name is declarable exactly when it is referenceable. The criterion for that set, recorded here as the precedent for the next keyword question: a keyword may be a value name only if it heads nothing that can begin or continue an expression -- `module` and `data` head declarations only (136 parameters are named `module`); clause keywords (then, else, in, as, where) and expression heads (if, match, let, fn, loop) never qualify, because admitting them buys ambiguity for no capability. Each guard fires only where the keyword can only be a binder (a parameter before `:`, `node NAME` before `:` / `=`, a bare NAME before `=`, a field-pattern binder before `,` / `}` excluding the literal patterns true / false, `let` unconditionally), because patterns and the `node` sugar are probed ahead of statements and RefuseOnMatch stops the parse. Claims: v2.test.parse.keyword_value_name_parse (five located subjects, five probed-position controls). The keyword binders in the corpus were renamed, not admitted. RUNG, PER POSITION, STATED: the bare `NAME =` statement sugar refuses a keyword binder only as the generic parse_g0_tokens_remain, because statement alternatives dispatch by FIRST set and a not-predicate guard is transparent to it (measured: `loop = 1` refuses at the keyword, unnamed); the keyword is still never ACCEPTED there (v2.test.parse.keyword_value_name_parse kvn_bare_eq_keyword_binder_still_refuses_holds). NEXT TRIGGER, the capability: FIRST-set computation that sees through a refusal guard, at which point that form takes the named guard like the others.", ], evidence: [], } diff --git a/dag/gunbc/roadmap/roadmap_allocation_client.dag b/dag/gunbc/roadmap/roadmap_allocation_client.dag index e7e4f135d1c..ea13cacce69 100644 --- a/dag/gunbc/roadmap/roadmap_allocation_client.dag +++ b/dag/gunbc/roadmap/roadmap_allocation_client.dag @@ -30,8 +30,8 @@ fn js_and(left: TsExpr, right: TsExpr) -> TsExpr { ts_binop(left: left, op: "&&" fn js_or(left: TsExpr, right: TsExpr) -> TsExpr { ts_binop(left: left, op: "||", right: right) } fn js_not(expr: TsExpr) -> TsExpr { ts_prefix(op: "!", expr: expr) } fn js_invoke(name: String, args: List) -> TsExpr { ts_call(callee: js_id(name: name), args: args) } -fn js_when(cond: TsExpr, stmts: List) -> TsStmt { ts_if(cond: cond, then: ts_block(stmts: stmts), else_stmt: none) } -fn js_branch(cond: TsExpr, then: List, otherwise: List) -> TsStmt { ts_if(cond: cond, then: ts_block(stmts: then), else_stmt: Present { value: ts_block(stmts: otherwise) }) } +fn js_when(cond: TsExpr, stmts: List) -> TsStmt { ts_if(cond: cond, then_stmt: ts_block(stmts: stmts), else_stmt: none) } +fn js_branch(cond: TsExpr, then_arm: List, otherwise: List) -> TsStmt { ts_if(cond: cond, then_stmt: ts_block(stmts: then_arm), else_stmt: Present { value: ts_block(stmts: otherwise) }) } fn js_quiet(stmts: List) -> TsStmt { ts_try(body: ts_block(stmts: stmts), catch_param: "error", handler: ts_block(stmts: [])) } fn js_typeof(expr: TsExpr, kind: String) -> TsExpr { js_eq(left: ts_prefix(op: "typeof ", expr: expr), right: js_lit(value: kind)) } @@ -179,7 +179,7 @@ fn allocation_render_statements() -> List { alternate: js_plus(left: ts_lit_str(value: "Stale, last observed "), right: ts_binop(left: js_field(name: "observed_at"), op: "||", right: ts_lit_str(value: "never"))))), js_row(term: "Lease ends", value: js_field(name: "expires_at")), js_do(expr: js_send(object: js_id(name: "card"), method: "append", args: [js_id(name: "title"), js_id(name: "list")])), - ts_if(cond: js_field(name: "connection"), then: ts_block(stmts: [ + ts_if(cond: js_field(name: "connection"), then_stmt: ts_block(stmts: [ ts_const(name: "code", value: js_create(tag: "code")), js_text(target: js_id(name: "code"), value: js_field(name: "connection")), js_do(expr: js_send(object: js_id(name: "card"), method: "append", args: [js_id(name: "code")])), @@ -188,7 +188,7 @@ fn allocation_render_statements() -> List { js_text(target: js_id(name: "waiting"), value: ts_lit_str(value: "No connection is advertised until a fresh observation shows it running.")), js_do(expr: js_send(object: js_id(name: "card"), method: "append", args: [js_id(name: "waiting")])), ]) }), - ts_if(cond: ts_binop(left: js_field(name: "retired_at"), op: "===", right: ts_lit_str(value: "")), then: ts_block(stmts: [ + ts_if(cond: ts_binop(left: js_field(name: "retired_at"), op: "===", right: ts_lit_str(value: "")), then_stmt: ts_block(stmts: [ ts_const(name: "release", value: js_create(tag: "button")), js_set(target: js_get(object: js_id(name: "release"), property: "type"), value: ts_lit_str(value: "button")), js_do(expr: js_send(object: js_id(name: "release"), method: "setAttribute", args: [ts_lit_str(value: "data-allocation-release"), ts_lit_str(value: "")])), @@ -201,7 +201,7 @@ fn allocation_render_statements() -> List { js_do(expr: js_send(object: js_id(name: "card"), method: "append", args: [js_id(name: "release")])), ]), else_stmt: none), ts_const(name: "prior", value: js_send(object: js_id(name: "allocationCards"), method: "get", args: [js_field(name: "id")])), - ts_if(cond: js_id(name: "prior"), then: ts_block(stmts: [js_do(expr: js_send(object: js_id(name: "prior"), method: "replaceWith", args: [js_id(name: "card")]))]), + ts_if(cond: js_id(name: "prior"), then_stmt: ts_block(stmts: [js_do(expr: js_send(object: js_id(name: "prior"), method: "replaceWith", args: [js_id(name: "card")]))]), else_stmt: Present { value: ts_block(stmts: [js_do(expr: js_send(object: js_id(name: "allocationList"), method: "append", args: [js_id(name: "card")]))]) }), js_do(expr: js_send(object: js_id(name: "allocationCards"), method: "set", args: [js_field(name: "id"), js_id(name: "card")])), ])), @@ -231,7 +231,7 @@ fn allocation_flow_statements() -> List { ts_const(name: "pending", value: js_invoke(name: "allocationPending", args: [])), js_when(cond: js_not(expr: js_id(name: "pending")), stmts: [ts_return(expr: none)]), ts_const(name: "recorded", value: js_send(object: js_id(name: "allocations"), method: "find", args: [js_fn(params: ["a"], stmts: [js_ret(expr: js_and(left: js_and(left: js_id(name: "a"), right: js_typeof(expr: js_id(name: "a"), kind: "object")), right: js_eq(left: js_get(object: js_id(name: "a"), property: "id"), right: js_get(object: js_id(name: "pending"), property: "key"))))])])), - js_branch(cond: js_and(left: js_id(name: "recorded"), right: js_eq(left: js_get(object: js_id(name: "recorded"), property: "profile"), right: js_get(object: js_id(name: "pending"), property: "profile"))), then: [ + js_branch(cond: js_and(left: js_id(name: "recorded"), right: js_eq(left: js_get(object: js_id(name: "recorded"), property: "profile"), right: js_get(object: js_id(name: "pending"), property: "profile"))), then_arm: [ js_do(expr: js_invoke(name: "allocationSettleIntent", args: [])), js_status(value: js_lit(value: "Your earlier request was recorded; it is shown below.")), ], otherwise: [ @@ -264,10 +264,10 @@ fn allocation_flow_statements() -> List { js_status(value: js_lit(value: "Requesting release…")), js_do(expr: js_then(promise: js_invoke(name: "allocationFetch", args: [js_plus(left: js_item_path(id: js_id(name: "id")), right: js_lit(value: allocation_release_suffix)), ts_object(fields: [ts_field(key: "csrf_token", value: js_id(name: "allocationCsrf")), ts_field(key: "generation", value: js_id(name: "generation"))])]), handler: js_fn(params: ["result"], stmts: [ - js_branch(cond: js_invoke(name: "allocationSnapshotFor", args: [js_id(name: "result"), js_id(name: "id")]), then: [ + js_branch(cond: js_invoke(name: "allocationSnapshotFor", args: [js_id(name: "result"), js_id(name: "id")]), then_arm: [ js_do(expr: js_invoke(name: "allocationRender", args: [js_result(property: "body")])), js_status(value: js_lit(value: "Release recorded; the controller retires the workspace.")), - ], otherwise: [js_branch(cond: js_and(left: js_result(property: "readable"), right: js_result(property: "body")), then: [js_do(expr: js_invoke(name: "allocationRefused", args: [js_result(property: "body")]))], + ], otherwise: [js_branch(cond: js_and(left: js_result(property: "readable"), right: js_result(property: "body")), then_arm: [js_do(expr: js_invoke(name: "allocationRefused", args: [js_result(property: "body")]))], otherwise: [js_status(value: js_plus(left: js_body(property: "reason"), right: js_lit(value: " Reload to see whether the release was recorded.")))])]), ]))), ])), @@ -289,12 +289,12 @@ fn allocation_flow_statements() -> List { ts_field(key: "profile", value: js_get(object: js_id(name: "intent"), property: "profile")), ])]), handler: js_fn(params: ["result"], stmts: [ js_set(target: js_get(object: js_id(name: "allocationCreate"), property: "disabled"), value: js_not(expr: js_invoke(name: "allocationWritable", args: []))), - js_branch(cond: js_and(left: js_invoke(name: "allocationSnapshotFor", args: [js_id(name: "result"), js_get(object: js_id(name: "intent"), property: "key")]), right: js_eq(left: js_body(property: "profile"), right: js_get(object: js_id(name: "intent"), property: "profile"))), then: [ + js_branch(cond: js_and(left: js_invoke(name: "allocationSnapshotFor", args: [js_id(name: "result"), js_get(object: js_id(name: "intent"), property: "key")]), right: js_eq(left: js_body(property: "profile"), right: js_get(object: js_id(name: "intent"), property: "profile"))), then_arm: [ js_do(expr: js_invoke(name: "allocationSettleIntent", args: [])), js_do(expr: js_invoke(name: "allocationRender", args: [js_result(property: "body")])), js_status(value: js_lit(value: "Request recorded; placement and boot are reported below.")), ], otherwise: [js_branch(cond: js_and(left: js_and(left: js_result(property: "readable"), right: js_result(property: "body")), right: ts_binop(left: js_result(property: "status"), op: "!==", right: ts_lit_num(text: "200"))), - then: [js_do(expr: js_invoke(name: "allocationRefused", args: [js_result(property: "body")]))], + then_arm: [js_do(expr: js_invoke(name: "allocationRefused", args: [js_result(property: "body")]))], otherwise: [js_status(value: js_plus(left: js_or(left: js_and(left: js_result(property: "body"), right: js_body(property: "reason")), right: js_lit(value: "The answer did not name this request.")), right: js_lit(value: " Your request is kept; Request workspace repeats it.")))])]), ]))), ])), @@ -311,7 +311,7 @@ fn allocation_live_statements() -> List { ts_const(name: "allocationList", value: js_element(id: "allocation-list")), ts_const(name: "allocationCsrf", value: js_get(object: js_get(object: js_id(name: "allocationRoot"), property: "dataset"), property: "csrf")), ], concat(allocation_key_statements(), concat(allocation_request_statements(), concat(allocation_render_statements(), concat(allocation_flow_statements(), [ - ts_if(cond: js_id(name: "allocationCsrf"), then: ts_block(stmts: [ + ts_if(cond: js_id(name: "allocationCsrf"), then_stmt: ts_block(stmts: [ js_do(expr: js_send(object: js_id(name: "allocationForm"), method: "addEventListener", args: [ts_lit_str(value: "submit"), js_id(name: "allocationSubmit")])), js_do(expr: js_invoke(name: "allocationLoad", args: [])), js_do(expr: ts_call(callee: js_id(name: "setInterval"), args: [js_id(name: "allocationPoll"), ts_lit_num(text: "5000")])), diff --git a/dag/gunbc/roadmap/roadmap_belt.dag b/dag/gunbc/roadmap/roadmap_belt.dag index 2b5172e7827..a9c16918777 100644 --- a/dag/gunbc/roadmap/roadmap_belt.dag +++ b/dag/gunbc/roadmap/roadmap_belt.dag @@ -289,8 +289,8 @@ fn belt_refusal_member_id(a: MemberAction) -> } } -fn belt_refusal_ids(as: List>) -> List { - as |> map(a => belt_refusal_member_id(a: a)) +fn belt_refusal_ids(actions: List>) -> List { + actions |> map(a => belt_refusal_member_id(a: a)) } fn belt_reconcile_json_value( @@ -308,7 +308,7 @@ fn belt_reconcile_json_value( json_kv(key: "upserts", value: json_array(elements: belt_member_ids(ms: r.upserts) |> map(id => json_string(s: id)))), json_kv(key: "would_teardown", value: json_array(elements: belt_member_ids(ms: r.teardowns) |> map(id => json_string(s: id)))), json_kv(key: "refusal_count", value: json_int(n: belt_reconcile_refusal_count(r: r))), - json_kv(key: "refused", value: json_array(elements: belt_refusal_ids(as: r.refusals) |> map(id => json_string(s: id)))), + json_kv(key: "refused", value: json_array(elements: belt_refusal_ids(actions: r.refusals) |> map(id => json_string(s: id)))), ]) } diff --git a/dag/gunbc/roadmap/roadmap_component.dag b/dag/gunbc/roadmap/roadmap_component.dag index 6d06e00cae9..74eb96ab15c 100644 --- a/dag/gunbc/roadmap/roadmap_component.dag +++ b/dag/gunbc/roadmap/roadmap_component.dag @@ -227,7 +227,7 @@ fn dashboard_instance_fetch_statements() -> List { right: ts_lit_str(value: "unknown"))), ts_if( cond: ts_ident(name: "il"), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_member(object: ts_ident(name: "il"), property: "textContent"), op: "=", @@ -267,7 +267,7 @@ fn dashboard_instance_fetch_statements() -> List { left: ts_ident(name: "posture"), op: "===", right: ts_lit_str(value: "observe-only")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member( object: ts_call( @@ -308,7 +308,7 @@ fn dashboard_instance_fetch_statements() -> List { args: [ts_lit_str(value: join([".", dashboard_instance_label_class], ""))])), ts_if( cond: ts_ident(name: "il"), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_member(object: ts_ident(name: "il"), property: "textContent"), op: "=", @@ -661,7 +661,7 @@ fn reason_surface_helper_stmt() -> TsStmt { ts_const(name: js_reason_surface_fn, value: ts_arrow(params: ["dt", "source", "text"], body: ts_block(stmts: [ ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "dt")), - then: ts_block(stmts: [ts_return(expr: none)]), + then_stmt: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none, ), ts_let(name: "rl", value: ts_call( @@ -676,7 +676,7 @@ fn reason_surface_helper_stmt() -> TsStmt { )), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "text")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "rl"), op: "&&", @@ -687,7 +687,7 @@ fn reason_surface_helper_stmt() -> TsStmt { ), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "rl")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "rl"), op: "=", @@ -854,7 +854,7 @@ fn dispatch_terminal_apply_body() -> TsStmt { )), ts_if( cond: ts_binop(left: ts_ident(name: "band"), op: "===", right: ts_lit_str(value: "loud")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ js_classlist_call(method: "add", arg: ts_lit_str(value: dispatch_class_loud)), ]), else_stmt: none, @@ -895,7 +895,7 @@ fn dispatch_terminal_apply_body() -> TsStmt { args: [ts_ident(name: "b")])), ts_if( cond: ts_binop(left: ts_ident(name: "expandRow"), op: "&&", right: ts_ident(name: "dt")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_member(object: ts_ident(name: "dt"), property: "open"), op: "=", @@ -918,7 +918,7 @@ fn dispatch_terminal_apply_body() -> TsStmt { ])), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "ok")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member(object: ts_ident(name: "console"), property: "log"), args: [ts_lit_str(value: "dispatch refused"), ts_ident(name: "j")], @@ -928,7 +928,7 @@ fn dispatch_terminal_apply_body() -> TsStmt { ), ts_if( cond: ts_ident(name: "ok"), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: js_sessions_observe_fn), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: js_attempts_observe_fn), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: js_refresh_workflow_fn), args: [])), @@ -1092,7 +1092,7 @@ fn disclosure_bind_statements() -> List { )), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "m")), - then: ts_block(stmts: [ts_return(expr: none)]), + then_stmt: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none, ), ts_const(name: "paint", value: ts_arrow(params: [], body: ts_expr_stmt(expr: ts_call( @@ -1119,7 +1119,7 @@ fn swatch_toggle_bind_statements() -> List { ts_const(name: "t", value: ts_call(callee: ts_ident(name: "gunbcSwatchChoice"), args: [])), ts_if( cond: ts_binop(left: ts_ident(name: "t"), op: "===", right: ts_lit_str(value: swatch_default_set_value)), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member(object: js_document_element(), property: "removeAttribute"), args: [ts_lit_str(value: "data-swatch-set")], @@ -1168,7 +1168,7 @@ fn swatch_toggle_bind_statements() -> List { )), ts_if( cond: ts_binop(left: ts_ident(name: "next"), op: "===", right: ts_lit_str(value: swatch_default_set_value)), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member(object: ts_ident(name: "localStorage"), property: "removeItem"), args: [ts_lit_str(value: swatch_storage_key)], @@ -1178,7 +1178,7 @@ fn swatch_toggle_bind_statements() -> List { ), ts_if( cond: ts_binop(left: ts_ident(name: "next"), op: "!==", right: ts_lit_str(value: swatch_default_set_value)), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member(object: ts_ident(name: "localStorage"), property: "setItem"), args: [ts_lit_str(value: swatch_storage_key), ts_ident(name: "next")], @@ -1242,7 +1242,7 @@ fn observation_complete_stmts( right: ts_ident(name: "false"))), ts_if( cond: ts_ident(name: pending), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: pending), op: "=", @@ -1257,7 +1257,7 @@ fn observation_begin_stmts(in_flight: String, pending: String) -> List { [ ts_if( cond: ts_ident(name: in_flight), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: pending), op: "=", @@ -1286,7 +1286,7 @@ fn sessions_mark_live_stmts() -> List { args: [ts_lit_str(value: ".dispatch-btn")]))), ts_if( cond: ts_ident(name: "sb"), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_member( object: ts_member(object: ts_ident(name: "sb"), property: "dataset"), @@ -1307,7 +1307,7 @@ fn sessions_mark_live_stmts() -> List { left: ts_ident(name: "sdt"), op: "&&", right: ts_prefix(op: "!", expr: ts_ident(name: "sf"))), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "sf"), op: "=", @@ -1354,7 +1354,7 @@ fn sessions_mark_live_stmts() -> List { left: ts_ident(name: "st"), op: "&&", right: ts_ident(name: "sfx")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_member(object: ts_ident(name: "st"), property: "textContent"), op: "=", @@ -1382,7 +1382,7 @@ fn sessions_mark_live_stmts() -> List { left: ts_ident(name: "sf"), op: "&&", right: ts_prefix(op: "!", expr: ts_ident(name: "cc"))), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "cc"), op: "=", @@ -1445,7 +1445,7 @@ fn sessions_mark_live_stmts() -> List { left: ts_member(object: ts_ident(name: "j"), property: "ok"), op: "===", right: ts_ident(name: "true")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member( object: ts_member(object: ts_ident(name: "window"), property: "location"), @@ -1550,7 +1550,7 @@ fn sessions_mark_live_stmts() -> List { left: ts_member(object: ts_ident(name: "sact"), property: "kind"), op: "!==", right: ts_lit_str(value: "none"))), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_member( object: ts_member(object: ts_ident(name: "cc"), property: "dataset"), @@ -1623,7 +1623,7 @@ fn sessions_reset_presence_stmt() -> TsStmt { object: ts_member(object: ts_ident(name: "pb"), property: "classList"), property: "contains"), args: [ts_lit_str(value: session_facts_class)]), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member(object: ts_ident(name: "pb"), property: "remove"), args: [])), @@ -1661,7 +1661,7 @@ fn observe_impact_preamble_statements() -> List { args: [ts_lit_str(value: ".workspace-observation")])), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "box")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "box"), op: "=", @@ -1698,7 +1698,7 @@ fn observe_impact_preamble_statements() -> List { args: [ts_lit_str(value: ".observe-impact-detail")])), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "d")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "d"), op: "=", @@ -1730,7 +1730,7 @@ fn observe_impact_preamble_statements() -> List { ts_const(name: "box", value: ts_call( callee: ts_member(object: ts_ident(name: "document"), property: "querySelector"), args: [ts_lit_str(value: ".workspace-observation")])), - ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "box")), then: ts_return(expr: none), else_stmt: none), + ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "box")), then_stmt: ts_return(expr: none), else_stmt: none), ts_const(name: "n", value: ts_member( object: ts_call( callee: ts_member(object: ts_ident(name: "box"), property: "querySelectorAll"), @@ -1740,11 +1740,11 @@ fn observe_impact_preamble_statements() -> List { cond: ts_prefix(op: "!", expr: ts_call( callee: ts_member(object: ts_member(object: ts_ident(name: "box"), property: "classList"), property: "contains"), args: [ts_lit_str(value: "client-minted")])), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none), ts_if( cond: ts_binop(left: ts_ident(name: "n"), op: "===", right: ts_lit_num(text: "0")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "box"), property: "remove"), args: [])), ts_return(expr: none), ]), @@ -1773,13 +1773,13 @@ fn observe_impact_preamble_statements() -> List { } fn observation_refused_banner_stmts(source_class: String) -> List { - [ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "querySelector"), args: [ts_lit_str(value: "main[data-observation-banners=\"off\"]")])), then: ts_block(stmts: [ + [ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "querySelector"), args: [ts_lit_str(value: "main[data-observation-banners=\"off\"]")])), then_stmt: ts_block(stmts: [ ts_let(name: "bn", value: ts_call( callee: ts_member(object: ts_ident(name: "document"), property: "querySelector"), args: [ts_lit_str(value: concat(".", source_class))])), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "bn")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "bn"), op: "=", @@ -1826,7 +1826,7 @@ fn sessions_fetch_effect_statements() -> List { args: [ts_arrow(params: ["sj"], body: ts_block(stmts: concat([ ts_if( cond: ts_member(object: ts_ident(name: "sj"), property: "observe_refused"), - then: ts_block(stmts: concat( + then_stmt: ts_block(stmts: concat( [ ts_const(name: "wireWhy", value: ts_binop( left: ts_member(object: ts_ident(name: "sj"), property: "reason"), @@ -1890,11 +1890,11 @@ fn attempts_mark_stmts() -> List { right: ts_call(callee: ts_member(object: ts_ident(name: "ar"), property: "querySelector"), args: [ts_lit_str(value: "details.taskbar-inspect")]))), ts_if( cond: ts_ident(name: "adt"), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_let(name: "al", value: ts_call(callee: ts_member(object: ts_ident(name: "adt"), property: "querySelector"), args: [ts_lit_str(value: ".dispatch-attempts")])), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "al")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "al"), op: "=", right: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "createElement"), args: [ts_lit_str(value: "div")]))), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "al"), property: "className"), op: "=", right: ts_lit_str(value: "dispatch-attempts"))), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "al"), property: "textContent"), op: "=", right: ts_lit_str(value: "attempts: "))), @@ -1930,7 +1930,7 @@ fn attempts_fetch_effect_statements() -> List { args: [ts_arrow(params: ["aj"], body: ts_block(stmts: concat([ ts_if( cond: ts_member(object: ts_ident(name: "aj"), property: "attempts_refused"), - then: ts_block(stmts: concat( + then_stmt: ts_block(stmts: concat( [ ts_const(name: "wireWhy", value: ts_binop( left: ts_member(object: ts_ident(name: "aj"), property: "reason"), @@ -2314,7 +2314,7 @@ fn inspect_ensure_helper_stmt() -> TsStmt { ts_let(name: "stg", value: ts_slot_query(obj: "ib", selector: ".inspect-stages")), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "stg")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "stg"), op: "=", @@ -2343,7 +2343,7 @@ fn inspect_ensure_helper_stmt() -> TsStmt { ts_let(name: "raw", value: ts_slot_query(obj: "ib", selector: ".inspect-raw")), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "raw")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "raw"), op: "=", @@ -2427,7 +2427,7 @@ fn activity_paint_stmts() -> List { left: ts_ident(name: "tb"), op: "!==", right: ts_ident(name: "wr"))), - then: ts_block(stmts: activity_fill_create_stmts()), + then_stmt: ts_block(stmts: activity_fill_create_stmts()), else_stmt: none), ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "fl"), @@ -2444,7 +2444,7 @@ fn activity_paint_stmts() -> List { right: ts_slot_query(obj: "fl", selector: join([".", stage_strip_class], "")))), ts_if( cond: ts_ident(name: "st"), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_member(object: ts_ident(name: "st"), property: "textContent"), op: "=", @@ -2532,7 +2532,7 @@ fn activity_paint_stmts() -> List { right: ts_slot_query(obj: "wr", selector: "details.taskbar-inspect"))), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "ins")), - then: ts_block(stmts: activity_inspect_create_stmts()), + then_stmt: ts_block(stmts: activity_inspect_create_stmts()), else_stmt: none), ts_const(name: "ib", value: ts_slot_query(obj: "ins", selector: ".inspect-body")), ts_expr_stmt(expr: ts_binop( @@ -2567,7 +2567,7 @@ fn activity_paint_stmts() -> List { right: ts_slot_query(obj: "stg", selector: join([".", activity_ledger_class], "")))), ts_if( cond: ts_ident(name: "aled"), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_member(object: ts_ident(name: "aled"), property: "textContent"), op: "=", @@ -2677,7 +2677,7 @@ fn activity_paint_stmts() -> List { right: ts_slot_query(obj: "raw", selector: join([".", activity_evidence_class], "")))), ts_if( cond: ts_ident(name: "aev"), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_member(object: ts_ident(name: "aev"), property: "textContent"), op: "=", @@ -2719,7 +2719,7 @@ fn activity_paint_stmts() -> List { right: ts_lit_str(value: "refused")), op: "&&", right: ts_member(object: ts_ident(name: "av"), property: "located_reason")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_const(name: "lr", value: ts_call( callee: ts_member(object: ts_ident(name: "document"), property: "createElement"), args: [ts_lit_str(value: "div")])), @@ -2787,7 +2787,7 @@ fn workflow_mark_attempt_stmts() -> List { right: ts_call( callee: ts_member(object: ts_ident(name: "wr"), property: "hasAttribute"), args: [ts_lit_str(value: "data-summary-only")]))), - then: ts_block(stmts: []), + then_stmt: ts_block(stmts: []), else_stmt: Present { value: ts_block(stmts: activity_paint_stmts()) }), ] } @@ -2824,7 +2824,7 @@ fn workflow_fetch_request_statements() -> List { object: ts_ident(name: "wj"), property: "observe_refused", ), - then: ts_block(stmts: concat( + then_stmt: ts_block(stmts: concat( [ ts_const(name: "why", value: ts_binop( left: ts_lit_str( @@ -2991,7 +2991,7 @@ fn row_selection_bind_statements() -> List { cond: ts_call( callee: ts_member(object: ts_member(object: ts_ident(name: "li"), property: "classList"), property: "contains"), args: [ts_lit_str(value: row_selected_class)]), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "gunbcClearSelection"), args: [])), @@ -3003,7 +3003,7 @@ fn row_selection_bind_statements() -> List { args: [ts_lit_str(value: ".taskbar .dispatch-btn.action-primary")])), ts_if( cond: ts_ident(name: "b"), - then: ts_expr_stmt(expr: ts_call( + then_stmt: ts_expr_stmt(expr: ts_call( callee: ts_member(object: ts_member(object: ts_ident(name: "b"), property: "classList"), property: "add"), args: [ts_lit_str(value: action_focal_class)])), else_stmt: none, @@ -3018,25 +3018,25 @@ fn row_selection_bind_statements() -> List { left: ts_prefix(op: "!", expr: ts_ident(name: "t")), op: "||", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "t"), property: "closest"))), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_if( cond: ts_call( callee: ts_member(object: ts_ident(name: "t"), property: "closest"), args: [ts_lit_str(value: "summary, button, a, input, select, textarea")]), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_const(name: "li", value: ts_call( callee: ts_member(object: ts_ident(name: "t"), property: "closest"), args: [ts_lit_str(value: "li.node")])), - ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "li")), then: ts_return(expr: none), else_stmt: none), + ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "li")), then_stmt: ts_return(expr: none), else_stmt: none), ts_const(name: "was", value: ts_call( callee: ts_member(object: ts_member(object: ts_ident(name: "li"), property: "classList"), property: "contains"), args: [ts_lit_str(value: row_selected_class)])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "gunbcClearSelection"), args: [])), - ts_if(cond: ts_ident(name: "was"), then: ts_return(expr: none), else_stmt: none), + ts_if(cond: ts_ident(name: "was"), then_stmt: ts_return(expr: none), else_stmt: none), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "gunbcSelectRow"), args: [ts_ident(name: "li")])), ]))], )), @@ -3052,14 +3052,14 @@ fn row_selection_bind_statements() -> List { right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "t"), property: "matches"))), op: "||", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "t"), property: "closest"))), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_if( cond: ts_prefix(op: "!", expr: ts_call( callee: ts_member(object: ts_ident(name: "t"), property: "matches"), args: [ts_lit_str(value: ":focus-visible")])), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_const(name: "li", value: ts_call( @@ -3067,7 +3067,7 @@ fn row_selection_bind_statements() -> List { args: [ts_lit_str(value: "li.node")])), ts_if( cond: ts_ident(name: "li"), - then: ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "gunbcSelectRow"), args: [ts_ident(name: "li")])), + then_stmt: ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "gunbcSelectRow"), args: [ts_ident(name: "li")])), else_stmt: none, ), ]))], @@ -3080,7 +3080,7 @@ fn row_selection_bind_statements() -> List { left: ts_member(object: ts_ident(name: "e"), property: "key"), op: "===", right: ts_lit_str(value: "Escape")), - then: ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "gunbcClearSelection"), args: [])), + then_stmt: ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "gunbcClearSelection"), args: [])), else_stmt: none, ), ts_if( @@ -3094,7 +3094,7 @@ fn row_selection_bind_statements() -> List { left: ts_member(object: ts_ident(name: "e"), property: "key"), op: "!==", right: ts_lit_str(value: " "))), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_const(name: "t", value: ts_member(object: ts_ident(name: "e"), property: "target")), @@ -3103,14 +3103,14 @@ fn row_selection_bind_statements() -> List { left: ts_prefix(op: "!", expr: ts_ident(name: "t")), op: "||", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "t"), property: "matches"))), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_if( cond: ts_prefix(op: "!", expr: ts_call( callee: ts_member(object: ts_ident(name: "t"), property: "matches"), args: [ts_lit_str(value: "li.node")])), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_expr_stmt(expr: ts_call( @@ -3120,7 +3120,7 @@ fn row_selection_bind_statements() -> List { callee: ts_member(object: ts_member(object: ts_ident(name: "t"), property: "classList"), property: "contains"), args: [ts_lit_str(value: row_selected_class)])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "gunbcClearSelection"), args: [])), - ts_if(cond: ts_ident(name: "was"), then: ts_return(expr: none), else_stmt: none), + ts_if(cond: ts_ident(name: "was"), then_stmt: ts_return(expr: none), else_stmt: none), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "gunbcSelectRow"), args: [ts_ident(name: "t")])), ]))], )), @@ -3156,11 +3156,11 @@ fn ts_for_each(selector: String, item: String, body: List) -> TsStmt { fn issue_filter_bind_statements() -> List { [ - ts_const(name: "gunbcFilterEmpty", value: ts_arrow(params: ["root"], body: ts_block(stmts: [ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "root")), then: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_const(name: "band", value: ts_member(object: ts_member(object: ts_ident(name: "root"), property: "dataset"), property: "bandFilter")), ts_const(name: "visible", value: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelectorAll"), args: [ts_lit_str(value: ".view-table li.node")])]), property: "some"), args: [ts_arrow(params: ["row"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_binop(left: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "row"), property: "style"), property: "display"), op: "!==", right: ts_lit_str(value: "none")), op: "&&", right: ts_binop(left: ts_prefix(op: "!", expr: ts_ident(name: "band")), op: "||", right: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "row"), property: "dataset"), property: "band"), op: "===", right: ts_ident(name: "band")))) })]))])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "root"), property: "dataset"), property: "empty"), op: "=", right: ts_cond(test: ts_ident(name: "visible"), consequent: ts_lit_str(value: "0"), alternate: ts_lit_str(value: "1"))))]))), + ts_const(name: "gunbcFilterEmpty", value: ts_arrow(params: ["root"], body: ts_block(stmts: [ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "root")), then_stmt: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_const(name: "band", value: ts_member(object: ts_member(object: ts_ident(name: "root"), property: "dataset"), property: "bandFilter")), ts_const(name: "visible", value: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelectorAll"), args: [ts_lit_str(value: ".view-table li.node")])]), property: "some"), args: [ts_arrow(params: ["row"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_binop(left: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "row"), property: "style"), property: "display"), op: "!==", right: ts_lit_str(value: "none")), op: "&&", right: ts_binop(left: ts_prefix(op: "!", expr: ts_ident(name: "band")), op: "||", right: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "row"), property: "dataset"), property: "band"), op: "===", right: ts_ident(name: "band")))) })]))])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "root"), property: "dataset"), property: "empty"), op: "=", right: ts_cond(test: ts_ident(name: "visible"), consequent: ts_lit_str(value: "0"), alternate: ts_lit_str(value: "1"))))]))), ts_for_each(selector: "[data-band-chip]", item: "c", body: [ ts_on_click(obj: "c", body: [ ts_const(name: "root", value: ts_closest(obj: "c", selector: ".roadmap-frontier")), - ts_if(cond: ts_binop(left: ts_ident(name: "root"), op: "&&", right: ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelector"), args: [ts_lit_str(value: ".issue-table")])), then: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), + ts_if(cond: ts_binop(left: ts_ident(name: "root"), op: "&&", right: ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelector"), args: [ts_lit_str(value: ".issue-table")])), then_stmt: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_expr_stmt(expr: ts_binop( left: ts_ident(name: "root"), op: "&&", @@ -3207,7 +3207,7 @@ fn issue_filter_bind_statements() -> List { ts_lit_str(value: "input"), ts_arrow(params: ["e"], body: ts_block(stmts: [ ts_const(name: "root", value: ts_closest(obj: "q", selector: ".roadmap-frontier")), - ts_if(cond: ts_binop(left: ts_ident(name: "root"), op: "&&", right: ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelector"), args: [ts_lit_str(value: ".issue-table")])), then: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), + ts_if(cond: ts_binop(left: ts_ident(name: "root"), op: "&&", right: ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelector"), args: [ts_lit_str(value: ".issue-table")])), then_stmt: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_const(name: "needle", value: ts_call( callee: ts_member( object: ts_member( @@ -3647,29 +3647,29 @@ fn js_instrument_toggle_class_on(el: String, cls: String, on: TsExpr) -> TsStmt fn instrument_tuner_load_camera_fn_body() -> List { [ ts_const(name: "w", value: js_local_storage_get(key: camera_storage_key)), - ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "w")), then: ts_return(expr: none), else_stmt: none), + ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "w")), then_stmt: ts_return(expr: none), else_stmt: none), ts_const(name: "parts", value: ts_call( callee: ts_member(object: ts_ident(name: "w"), property: "split"), args: [ts_lit_str(value: camera_wire_sep)], )), ts_if( cond: ts_binop(left: ts_member(object: ts_ident(name: "parts"), property: "length"), op: "!==", right: ts_lit_num(text: "3")), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_if( cond: js_instrument_wire_index_valid(keys_var: "INSTRUMENT_WIRE_DEPTH_KEYS", parts_var: "parts", index: "0"), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_if( cond: js_instrument_wire_index_valid(keys_var: "INSTRUMENT_MODE_KEYS", parts_var: "parts", index: "1"), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_if( cond: js_instrument_wire_index_valid(keys_var: "INSTRUMENT_FOCUS_KEYS", parts_var: "parts", index: "2"), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_expr_stmt(expr: ts_binop(left: js_instrument_camera_member(name: "depth"), op: "=", right: ts_index(object: ts_ident(name: "parts"), index: ts_lit_num(text: "0")))), @@ -3780,7 +3780,7 @@ fn instrument_tuner_step_depth_fn_body() -> List { callee: ts_member(object: ts_ident(name: "INSTRUMENT_DEPTH_KEYS"), property: "indexOf"), args: [js_instrument_camera_member(name: "depth")], )), - ts_if(cond: ts_binop(left: ts_ident(name: "i"), op: "<", right: ts_lit_num(text: "0")), then: ts_return(expr: none), else_stmt: none), + ts_if(cond: ts_binop(left: ts_ident(name: "i"), op: "<", right: ts_lit_num(text: "0")), then_stmt: ts_return(expr: none), else_stmt: none), ts_if( cond: ts_binop( left: ts_binop(left: ts_ident(name: "dir"), op: "===", right: ts_lit_str(value: "in")), @@ -3795,7 +3795,7 @@ fn instrument_tuner_step_depth_fn_body() -> List { ), ), ), - then: ts_expr_stmt(expr: ts_binop( + then_stmt: ts_expr_stmt(expr: ts_binop( left: js_instrument_camera_member(name: "depth"), op: "=", right: ts_index( @@ -3811,7 +3811,7 @@ fn instrument_tuner_step_depth_fn_body() -> List { op: "&&", right: ts_binop(left: ts_ident(name: "i"), op: ">", right: ts_lit_num(text: "0")), ), - then: ts_expr_stmt(expr: ts_binop( + then_stmt: ts_expr_stmt(expr: ts_binop( left: js_instrument_camera_member(name: "depth"), op: "=", right: ts_index( @@ -3823,7 +3823,7 @@ fn instrument_tuner_step_depth_fn_body() -> List { ), ts_if( cond: ts_binop(left: js_instrument_camera_member(name: "depth"), op: "!==", right: ts_ident(name: "prevDepth")), - then: ts_block(stmts: concat( + then_stmt: ts_block(stmts: concat( instrument_tuner_persist_and_apply_stmts(), [ts_expr_stmt(expr: ts_call(callee: ts_ident(name: js_tick_fn), args: []))], )), @@ -3854,7 +3854,7 @@ fn instrument_tuner_seek_depth_fn_body() -> List { op: "||", right: ts_binop(left: ts_ident(name: "targetIdx"), op: "===", right: ts_ident(name: "currentIdx")), ), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_expr_stmt(expr: ts_call( @@ -3876,7 +3876,7 @@ fn instrument_tuner_select_subject_fn_body() -> List { [ ts_if( cond: ts_binop(left: js_instrument_camera_member(name: "focus"), op: "===", right: ts_ident(name: "key")), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_expr_stmt(expr: ts_binop(left: js_instrument_camera_member(name: "focus"), op: "=", right: ts_ident(name: "key"))), @@ -3894,7 +3894,7 @@ fn instrument_tuner_toggle_subject_key_stmts() -> List { )), ts_if( cond: ts_ident(name: "was"), - then: ts_block(stmts: concat( + then_stmt: ts_block(stmts: concat( [ts_expr_stmt(expr: ts_call(callee: ts_ident(name: js_instrument_clear_subject_fn), args: []))], [ts_return(expr: none)], )), @@ -3926,7 +3926,7 @@ fn instrument_tuner_subject_click_handler_body() -> List { op: "||", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "t"), property: "closest")), ), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_if( @@ -3934,14 +3934,14 @@ fn instrument_tuner_subject_click_handler_body() -> List { callee: ts_member(object: ts_ident(name: "t"), property: "closest"), args: [ts_lit_str(value: "button, a, input, select, textarea")], ), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_const(name: "li", value: ts_call( callee: ts_member(object: ts_ident(name: "t"), property: "closest"), args: [ts_lit_str(value: join(["li.", instrument_subject_class], ""))], )), - ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "li")), then: ts_return(expr: none), else_stmt: none), + ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "li")), then_stmt: ts_return(expr: none), else_stmt: none), ts_const(name: "key", value: ts_call( callee: ts_member(object: ts_ident(name: "li"), property: "getAttribute"), args: [ts_lit_str(value: "data-subject-key")], @@ -3960,7 +3960,7 @@ fn instrument_tuner_subject_focus_handler_body() -> List { op: "||", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "t"), property: "matches")), ), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_if( @@ -3968,7 +3968,7 @@ fn instrument_tuner_subject_focus_handler_body() -> List { callee: ts_member(object: ts_ident(name: "t"), property: "matches"), args: [ts_lit_str(value: ":focus-visible")], )), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_const(name: "li", value: ts_call( @@ -3977,7 +3977,7 @@ fn instrument_tuner_subject_focus_handler_body() -> List { )), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: "li")), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_ident(name: js_instrument_select_subject_fn), @@ -4001,12 +4001,12 @@ fn instrument_tuner_wheel_preamble() -> List { ts_const(name: "raw", value: ts_member(object: ts_ident(name: "e"), property: "deltaY")), ts_if( cond: ts_binop(left: ts_ident(name: "mode"), op: "===", right: ts_lit_num(text: "1")), - then: ts_return(expr: ts_binop(left: ts_ident(name: "raw"), op: "*", right: ts_lit_num(text: "16"))), + then_stmt: ts_return(expr: ts_binop(left: ts_ident(name: "raw"), op: "*", right: ts_lit_num(text: "16"))), else_stmt: none, ), ts_if( cond: ts_binop(left: ts_ident(name: "mode"), op: "===", right: ts_lit_num(text: "2")), - then: ts_return(expr: ts_binop( + then_stmt: ts_return(expr: ts_binop( left: ts_ident(name: "raw"), op: "*", right: ts_binop(left: ts_member(object: ts_ident(name: "window"), property: "innerHeight"), op: "||", right: ts_lit_num(text: "800")), @@ -4022,7 +4022,7 @@ fn instrument_tuner_wheel_preamble() -> List { op: "<", right: ts_ident(name: js_instrument_wheel_threshold_const), ), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_const(name: "before", value: js_instrument_camera_member(name: "depth")), @@ -4038,7 +4038,7 @@ fn instrument_tuner_wheel_preamble() -> List { )), ts_if( cond: ts_binop(left: js_instrument_camera_member(name: "depth"), op: "===", right: ts_ident(name: "before")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: js_instrument_wheel_travel_var), op: "=", right: ts_lit_num(text: "0"))), ts_return(expr: none), ]), @@ -4061,7 +4061,7 @@ fn instrument_tuner_wheel_preamble() -> List { callee: ts_member(object: ts_ident(name: "INSTRUMENT_DEPTH_KEYS"), property: "indexOf"), args: [js_instrument_camera_member(name: "depth")], )), - ts_if(cond: ts_binop(left: ts_ident(name: "i"), op: "<", right: ts_lit_num(text: "0")), then: ts_return(expr: none), else_stmt: none), + ts_if(cond: ts_binop(left: ts_ident(name: "i"), op: "<", right: ts_lit_num(text: "0")), then_stmt: ts_return(expr: none), else_stmt: none), ts_const(name: "atMax", value: ts_binop( left: ts_ident(name: "i"), op: ">=", @@ -4078,7 +4078,7 @@ fn instrument_tuner_wheel_preamble() -> List { op: "&&", right: ts_ident(name: "atMax"), ), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_if( @@ -4087,14 +4087,14 @@ fn instrument_tuner_wheel_preamble() -> List { op: "&&", right: ts_ident(name: "atMin"), ), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "e"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: js_instrument_wheel_travel_var), op: "+=", right: ts_ident(name: "delta"))), ts_if( cond: ts_ident(name: js_instrument_wheel_timer_var), - then: ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "clearTimeout"), args: [ts_ident(name: js_instrument_wheel_timer_var)])), + then_stmt: ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "clearTimeout"), args: [ts_ident(name: js_instrument_wheel_timer_var)])), else_stmt: none, ), ts_expr_stmt(expr: ts_binop( @@ -4218,12 +4218,12 @@ fn instrument_tuner_keydown_bind_stmt() -> TsStmt { ts_arrow(params: ["e"], body: ts_block(stmts: [ ts_if( cond: ts_binop(left: ts_member(object: ts_ident(name: "e"), property: "key"), op: "===", right: ts_lit_str(value: "Escape")), - then: ts_expr_stmt(expr: ts_call(callee: ts_ident(name: js_instrument_clear_subject_fn), args: [])), + then_stmt: ts_expr_stmt(expr: ts_call(callee: ts_ident(name: js_instrument_clear_subject_fn), args: [])), else_stmt: none, ), ts_if( cond: ts_binop(left: ts_member(object: ts_ident(name: "e"), property: "key"), op: "===", right: ts_lit_str(value: "ArrowDown")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "e"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: js_instrument_step_depth_fn), args: [ts_lit_str(value: "in")])), ]), @@ -4231,7 +4231,7 @@ fn instrument_tuner_keydown_bind_stmt() -> TsStmt { ), ts_if( cond: ts_binop(left: ts_member(object: ts_ident(name: "e"), property: "key"), op: "===", right: ts_lit_str(value: "ArrowUp")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "e"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: js_instrument_step_depth_fn), args: [ts_lit_str(value: "out")])), ]), @@ -4251,7 +4251,7 @@ fn instrument_tuner_keydown_bind_stmt() -> TsStmt { right: ts_lit_str(value: " "), ), ), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_const(name: "t", value: ts_member(object: ts_ident(name: "e"), property: "target")), @@ -4261,7 +4261,7 @@ fn instrument_tuner_keydown_bind_stmt() -> TsStmt { op: "||", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "t"), property: "matches")), ), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_if( @@ -4269,7 +4269,7 @@ fn instrument_tuner_keydown_bind_stmt() -> TsStmt { callee: ts_member(object: ts_ident(name: "t"), property: "matches"), args: [ts_lit_str(value: join(["li.", instrument_subject_class], ""))], )), - then: ts_return(expr: none), + then_stmt: ts_return(expr: none), else_stmt: none, ), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "e"), property: "preventDefault"), args: [])), @@ -4279,7 +4279,7 @@ fn instrument_tuner_keydown_bind_stmt() -> TsStmt { )), ts_if( cond: ts_binop(left: js_instrument_camera_member(name: "focus"), op: "===", right: ts_ident(name: "key")), - then: ts_block(stmts: concat( + then_stmt: ts_block(stmts: concat( [ts_expr_stmt(expr: ts_call(callee: ts_ident(name: js_instrument_clear_subject_fn), args: []))], [ts_return(expr: none)], )), @@ -4428,7 +4428,7 @@ fn js_motion_assign(target: TsExpr, value: TsExpr) -> TsStmt { } fn js_motion_guard(cond: TsExpr) -> TsStmt { - ts_if(cond: cond, then: ts_return(expr: none), else_stmt: none) + ts_if(cond: cond, then_stmt: ts_return(expr: none), else_stmt: none) } fn js_motion_cat(parts: List) -> TsExpr { @@ -4473,7 +4473,7 @@ fn js_motion_any_axis_valued(obj: TsExpr, x: String, y: String, z: String) -> Ts fn js_motion_count_if(cond: TsExpr, counter: String) -> TsStmt { ts_if( cond: cond, - then: js_motion_assign( + then_stmt: js_motion_assign( target: ts_ident(name: counter), value: ts_binop(left: ts_ident(name: counter), op: "+", right: ts_lit_num(text: "1")), ), @@ -4593,7 +4593,7 @@ fn motion_play_fn_statement() -> TsStmt { )), ts_if( cond: ts_binop(left: ts_ident(name: js_motion_timer_var), op: "!==", right: ts_ident(name: "null")), - then: ts_block(stmts: js_motion_clear_timer_statements()), + then_stmt: ts_block(stmts: js_motion_clear_timer_statements()), else_stmt: none, ), ts_const( @@ -4616,7 +4616,7 @@ fn motion_play_fn_statement() -> TsStmt { op: ">=", right: ts_member(object: ts_ident(name: "frames"), property: "length"), ), - then: ts_block(stmts: concat( + then_stmt: ts_block(stmts: concat( js_motion_clear_timer_statements(), [ ts_return(expr: none) ], )), @@ -4734,7 +4734,7 @@ fn motion_devicemotion_probe_statement() -> TsStmt { value: ts_arrow(params: [], body: ts_block(stmts: [ ts_if( cond: js_motion_typeof_undefined(name: device_motion_event_interface), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ js_motion_line_call( index: "0", text: ts_lit_str(value: join([device_motion_event_interface, " Ā· interface absent in this container"], "")), @@ -4753,7 +4753,7 @@ fn motion_devicemotion_probe_statement() -> TsStmt { op: "===", right: ts_lit_str(value: "function"), ), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member( object: ts_call( @@ -4770,7 +4770,7 @@ fn motion_devicemotion_probe_statement() -> TsStmt { args: [ts_arrow(params: ["st"], body: ts_block(stmts: [ ts_if( cond: ts_binop(left: ts_ident(name: "st"), op: "===", right: ts_lit_str(value: permission_state_wire(s: PermissionGranted))), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "listen"), args: [])), ts_return(expr: none), ]), @@ -4812,7 +4812,7 @@ fn motion_sensor_probe_statement() -> TsStmt { value: ts_arrow(params: [], body: ts_block(stmts: [ ts_if( cond: js_motion_typeof_undefined(name: accelerometer_interface_name(i: LinearAccelerationSensor)), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ js_motion_line_call( index: "1", text: ts_lit_str(value: join([ @@ -4920,7 +4920,7 @@ fn motion_probe_bind_statements() -> List { motion_probe_bind_statement(), ts_if( cond: ts_ident(name: "motionProbeBtn"), - then: ts_expr_stmt(expr: ts_call( + then_stmt: ts_expr_stmt(expr: ts_call( callee: ts_member(object: ts_ident(name: "motionProbeBtn"), property: "addEventListener"), args: [ ts_lit_str(value: "click"), diff --git a/dag/gunbc/roadmap/roadmap_inline_assignment_client.dag b/dag/gunbc/roadmap/roadmap_inline_assignment_client.dag index 7bc514497a2..7e86600cfd3 100644 --- a/dag/gunbc/roadmap/roadmap_inline_assignment_client.dag +++ b/dag/gunbc/roadmap/roadmap_inline_assignment_client.dag @@ -14,7 +14,7 @@ fn inline_assignment_bind_statements() -> List { ts_let(name: "assignmentNoticeTimer", value: ts_ident(name: "null")), ts_const(name: "assignmentSignInNotice", value: ts_arrow(params: [], body: ts_block(stmts: [ ts_let(name: "notice", value: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "querySelector"), args: [ts_lit_str(value: ".issue-assignment-notice")])), -ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "notice")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "notice")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "notice"), op: "=", right: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "createElement"), args: [ts_lit_str(value: "div")]))), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "notice"), property: "className"), op: "=", right: ts_lit_str(value: "issue-assignment-notice"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "notice"), property: "setAttribute"), args: [ts_lit_str(value: "role"), ts_lit_str(value: "status")])), @@ -34,7 +34,7 @@ ts_const(name: "assignmentForms", value: ts_call(callee: ts_member(object: ts_id ts_const(name: "assignmentBindInteraction", value: ts_arrow(params: ["form"], body: ts_block(stmts: [ ts_const(name: "submit", value: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "querySelector"), args: [ts_lit_str(value: "[type=\"submit\"]")])), ts_const(name: "disclosure", value: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "closest"), args: [ts_lit_str(value: ".issue-assignee-disclosure")])), -ts_if(cond: ts_ident(name: "disclosure"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "disclosure"), then_stmt: ts_block(stmts: [ ts_const(name: "input", value: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "querySelector"), args: [ts_lit_str(value: "[name=\"assignee\"]")])), ts_const(name: "resting", value: ts_call(callee: ts_member(object: ts_ident(name: "disclosure"), property: "querySelector"), args: [ts_lit_str(value: "summary")])), ts_const(name: "cancelEdit", value: ts_arrow(params: [], body: ts_block(stmts: [ @@ -43,25 +43,25 @@ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "input"), pro ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "submit"), property: "hidden"), op: "=", right: ts_ident(name: "true"))) ]))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "disclosure"), property: "addEventListener"), args: [ts_lit_str(value: "toggle"), ts_arrow(params: ["event"], body: ts_block(stmts: [ -ts_if(cond: ts_member(object: ts_ident(name: "disclosure"), property: "open"), then: ts_block(stmts: [ +ts_if(cond: ts_member(object: ts_ident(name: "disclosure"), property: "open"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "input"), property: "focus"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "input"), property: "select"), args: [])) ]), else_stmt: none) ]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "disclosure"), property: "addEventListener"), args: [ts_lit_str(value: "keydown"), ts_arrow(params: ["event"], body: ts_block(stmts: [ -ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "Escape")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "Escape")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "cancelEdit"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "resting"), property: "focus"), args: [])) ]), else_stmt: none) ]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "disclosure"), property: "addEventListener"), args: [ts_lit_str(value: "focusout"), ts_arrow(params: ["event"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "disclosure"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "relatedTarget")])), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "disclosure"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "relatedTarget")])), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "cancelEdit"), args: [])) ]), else_stmt: none) ]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: ["event"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "disclosure"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "target")])), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "disclosure"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "target")])), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "cancelEdit"), args: [])) ]), else_stmt: none) ]))])) @@ -70,8 +70,8 @@ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "form"), pro ts_const(name: "workflow", value: ts_member(object: ts_member(object: ts_ident(name: "event"), property: "detail"), property: "workflow")), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "submit"), property: "hidden"), op: "=", right: ts_prefix(op: "!", expr: ts_ident(name: "workflow")))), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "submit"), property: "textContent"), op: "=", right: ts_cond(test: ts_ident(name: "workflow"), consequent: ts_lit_str(value: "Assign and dispatch"), alternate: ts_lit_str(value: "Assign")))), -ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "workflow")), then: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "submit"), property: "disabled")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "workflow")), then_stmt: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "submit"), property: "disabled")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "requestSubmit"), args: [ts_ident(name: "submit")])) ]), else_stmt: none) ]), else_stmt: none) @@ -79,7 +79,7 @@ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "form"), pro ]))), ts_const(name: "assignmentResult", value: ts_arrow(params: ["container"], body: ts_block(stmts: [ ts_let(name: "result", value: ts_call(callee: ts_member(object: ts_ident(name: "container"), property: "querySelector"), args: [ts_lit_str(value: ".issue-inline-result")])), -ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "result")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "result")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "result"), op: "=", right: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "createElement"), args: [ts_lit_str(value: "div")]))), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "result"), property: "className"), op: "=", right: ts_lit_str(value: "issue-inline-result"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "result"), property: "setAttribute"), args: [ts_lit_str(value: "role"), ts_lit_str(value: "status")])), @@ -90,7 +90,7 @@ ts_return(expr: Present { value: ts_ident(name: "result") }) ]))), ts_const(name: "assignmentContext", value: ts_arrow(params: ["path"], body: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_call(callee: ts_ident(name: "fetch"), args: [ts_binop(left: ts_ident(name: "path"), op: "+", right: ts_lit_str(value: "/assignment")), ts_object(fields: [ts_field(key: "credentials", value: ts_lit_str(value: "same-origin")), ts_field(key: "cache", value: ts_lit_str(value: "no-store"))])]), property: "then"), args: [ts_arrow(params: ["response"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), then_stmt: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "response"), property: "text"), args: []), property: "then"), args: [ts_arrow(params: ["message"], body: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "Promise"), property: "reject"), args: [ts_new(callee: ts_ident(name: "Error"), args: [ts_ident(name: "message")])]) }) ]))]) }) @@ -105,14 +105,14 @@ ts_const(name: "body", value: ts_call(callee: ts_member(object: ts_new(callee: t ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_call(callee: ts_ident(name: "fetch"), args: [ts_binop(left: ts_ident(name: "path"), op: "+", right: ts_lit_str(value: "/assign")), ts_object(fields: [ts_field(key: "method", value: ts_lit_str(value: "POST")), ts_field(key: "credentials", value: ts_lit_str(value: "same-origin")), ts_field(key: "headers", value: ts_object(fields: [ts_quoted_field(key: "Content-Type", value: ts_lit_str(value: "application/x-www-form-urlencoded;charset=UTF-8"))])), ts_field(key: "body", value: ts_ident(name: "body"))])]), property: "then"), args: [ts_arrow(params: ["response"], body: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "response"), property: "text"), args: []), property: "then"), args: [ts_arrow(params: ["message"], body: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "result"), property: "textContent"), op: "=", right: ts_binop(left: ts_ident(name: "message"), op: "||", right: ts_binop(left: ts_binop(left: ts_lit_str(value: "Assignment returned HTTP "), op: "+", right: ts_member(object: ts_ident(name: "response"), property: "status")), op: "+", right: ts_lit_str(value: ". Reload to check the issue before retrying."))))), -ts_if(cond: ts_call(callee: ts_member(object: ts_ident(name: "message"), property: "startsWith"), args: [ts_lit_str(value: "assigned:")]), then: ts_block(stmts: [ +ts_if(cond: ts_call(callee: ts_member(object: ts_ident(name: "message"), property: "startsWith"), args: [ts_lit_str(value: "assigned:")]), then_stmt: ts_block(stmts: [ ts_const(name: "selected", value: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "container"), property: "querySelectorAll"), args: [ts_lit_str(value: "[data-choice-value]")])]), property: "find"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ ts_return(expr: Present { value: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "choiceValue"), op: "===", right: ts_ident(name: "assignee")) }) ]))])), ts_const(name: "rowButton", value: ts_call(callee: ts_member(object: ts_ident(name: "assignmentButtons"), property: "find"), args: [ts_arrow(params: ["button"], body: ts_block(stmts: [ ts_return(expr: Present { value: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "button"), property: "dataset"), property: "assignNode"), op: "===", right: ts_member(object: ts_member(object: ts_ident(name: "container"), property: "dataset"), property: "assignNode")) }) ]))])), -ts_if(cond: ts_binop(left: ts_ident(name: "selected"), op: "&&", right: ts_ident(name: "rowButton")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_ident(name: "selected"), op: "&&", right: ts_ident(name: "rowButton")), then_stmt: ts_block(stmts: [ ts_const(name: "avatar", value: ts_call(callee: ts_member(object: ts_ident(name: "selected"), property: "querySelector"), args: [ts_lit_str(value: ".site-avatar")])), ts_const(name: "label", value: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "createElement"), args: [ts_lit_str(value: "span")])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "label"), property: "className"), op: "=", right: ts_lit_str(value: "issue-assignee-text"))), @@ -129,9 +129,9 @@ ts_return(expr: Present { value: ts_binop(left: ts_member(object: ts_ident(name: ts_const(name: "assignmentBindSession", value: ts_arrow(params: ["form", "session"], body: ts_block(stmts: [ ts_const(name: "submit", value: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "querySelector"), args: [ts_lit_str(value: "[type=\"submit\"]")])), ts_const(name: "disclosure", value: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "closest"), args: [ts_lit_str(value: ".issue-assignee-disclosure")])), -ts_if(cond: ts_ident(name: "disclosure"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "disclosure"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "disclosure"), property: "querySelector"), args: [ts_lit_str(value: "summary")]), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: ["event"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "session"), property: "authenticated")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "session"), property: "authenticated")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "stopPropagation"), args: [])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "disclosure"), property: "open"), op: "=", right: ts_ident(name: "false"))), @@ -143,7 +143,7 @@ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "submit"), pr ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "submit"), property: "title"), op: "=", right: ts_cond(test: ts_member(object: ts_ident(name: "session"), property: "authenticated"), consequent: ts_lit_str(value: "Record assignment"), alternate: ts_lit_str(value: "Sign in to assign this issue.")))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "addEventListener"), args: [ts_lit_str(value: "submit"), ts_arrow(params: ["event"], body: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), -ts_if(cond: ts_binop(left: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "session"), property: "authenticated")), op: "||", right: ts_member(object: ts_ident(name: "submit"), property: "disabled")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "session"), property: "authenticated")), op: "||", right: ts_member(object: ts_ident(name: "submit"), property: "disabled")), then_stmt: ts_block(stmts: [ ts_return(expr: none) ]), else_stmt: none), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "submit"), property: "disabled"), op: "=", right: ts_ident(name: "true"))), @@ -167,7 +167,7 @@ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_member(object: ts_ident(n ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "button"), property: "disabled"), op: "=", right: ts_ident(name: "false"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "button"), property: "setAttribute"), args: [ts_lit_str(value: "title"), ts_lit_str(value: "Choose an assignee")])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "button"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: [], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "session"), property: "authenticated")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "session"), property: "authenticated")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "assignmentSignInNotice"), args: [])), ts_return(expr: none) ]), else_stmt: none), @@ -179,7 +179,7 @@ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "editor"), pr ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "setAttribute"), args: [ts_lit_str(value: "popover"), ts_lit_str(value: "auto")])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "editor"), property: "innerHTML"), op: "=", right: ts_member(object: ts_ident(name: "context"), property: "picker_html"))), ts_const(name: "form", value: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "querySelector"), args: [ts_lit_str(value: "form")])), -ts_if(cond: ts_binop(left: ts_ident(name: "form"), op: "===", right: ts_ident(name: "null")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_ident(name: "form"), op: "===", right: ts_ident(name: "null")), then_stmt: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "Promise"), property: "reject"), args: [ts_new(callee: ts_ident(name: "Error"), args: [ts_lit_str(value: "Assignment editor unavailable")])]) }) ]), else_stmt: none), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "document"), property: "body"), property: "appendChild"), args: [ts_ident(name: "editor")])), @@ -195,31 +195,31 @@ ts_const(name: "cancel", value: ts_arrow(params: [], body: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "hidePopover"), args: [])) ]))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "addEventListener"), args: [ts_lit_str(value: "keydown"), ts_arrow(params: ["event"], body: ts_block(stmts: [ -ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "Escape")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "Escape")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "cancel"), args: [])) ]), else_stmt: none) ]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "addEventListener"), args: [ts_lit_str(value: "focusout"), ts_arrow(params: ["event"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "relatedTarget")])), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "relatedTarget")])), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "cancel"), args: [])) ]), else_stmt: none) ]))])), ts_const(name: "events", value: ts_new(callee: ts_ident(name: "AbortController"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "window"), property: "addEventListener"), args: [ts_lit_str(value: "resize"), ts_ident(name: "cancel"), ts_object(fields: [ts_field(key: "signal", value: ts_member(object: ts_ident(name: "events"), property: "signal"))])])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "addEventListener"), args: [ts_lit_str(value: "scroll"), ts_arrow(params: ["event"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "target")])), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "target")])), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "cancel"), args: [])) ]), else_stmt: none) ])), ts_object(fields: [ts_field(key: "capture", value: ts_ident(name: "true")), ts_field(key: "signal", value: ts_member(object: ts_ident(name: "events"), property: "signal"))])])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "addEventListener"), args: [ts_lit_str(value: "toggle"), ts_arrow(params: ["event"], body: ts_block(stmts: [ -ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "newState"), op: "===", right: ts_lit_str(value: "closed")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "newState"), op: "===", right: ts_lit_str(value: "closed")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "events"), property: "abort"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "disposeChoice"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "editor"), property: "remove"), args: [])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "button"), property: "style"), property: "visibility"), op: "=", right: ts_lit_str(value: ""))), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "button"), property: "disabled"), op: "=", right: ts_ident(name: "false"))), -ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "document"), property: "activeElement"), op: "===", right: ts_member(object: ts_ident(name: "document"), property: "body")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "document"), property: "activeElement"), op: "===", right: ts_member(object: ts_ident(name: "document"), property: "body")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "button"), property: "focus"), args: [])) ]), else_stmt: none) ]), else_stmt: none) @@ -241,7 +241,7 @@ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "assignmentBindInteraction"), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "assignmentBindSession"), args: [ts_ident(name: "form"), ts_ident(name: "session")])) ]))])) ]))), -ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "assignmentButtons"), property: "length"), op: "||", right: ts_member(object: ts_ident(name: "assignmentForms"), property: "length")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "assignmentButtons"), property: "length"), op: "||", right: ts_member(object: ts_ident(name: "assignmentForms"), property: "length")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "gunbcSessionRead"), property: "then"), args: [ts_ident(name: "assignmentSetSession")]), property: "catch"), args: [ts_arrow(params: [], body: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "assignmentSetSession"), args: [ts_object(fields: [ts_field(key: "authenticated", value: ts_ident(name: "false"))])])) ]))])) diff --git a/dag/gunbc/roadmap/roadmap_issue_sort.dag b/dag/gunbc/roadmap/roadmap_issue_sort.dag index a64f6d8827c..ccb3c86f1c1 100644 --- a/dag/gunbc/roadmap/roadmap_issue_sort.dag +++ b/dag/gunbc/roadmap/roadmap_issue_sort.dag @@ -14,14 +14,14 @@ fn issue_sort_bind_statements() -> List { [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "querySelectorAll"), args: [ts_lit_str(value: ".roadmap-frontier")]), property: "forEach"), args: [ts_arrow(params: ["root"], body: ts_block(stmts: [ ts_const(name: "table", value: ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelector"), args: [ts_lit_str(value: ".issue-table")])), -ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "table")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "table")), then_stmt: ts_block(stmts: [ ts_return(expr: none) ]), else_stmt: none), ts_const(name: "list", value: ts_call(callee: ts_member(object: ts_ident(name: "table"), property: "querySelector"), args: [ts_lit_str(value: "ul")])), ts_const(name: "buttons", value: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "table"), property: "querySelectorAll"), args: [ts_lit_str(value: "[data-sort-key]")])])), ts_const(name: "undo", value: ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelector"), args: [ts_lit_str(value: ".issue-sort-undo")])), ts_const(name: "status", value: ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelector"), args: [ts_lit_str(value: ".issue-sort-status")])), -ts_if(cond: ts_binop(left: ts_binop(left: ts_prefix(op: "!", expr: ts_ident(name: "list")), op: "||", right: ts_prefix(op: "!", expr: ts_ident(name: "undo"))), op: "||", right: ts_prefix(op: "!", expr: ts_ident(name: "status"))), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_binop(left: ts_prefix(op: "!", expr: ts_ident(name: "list")), op: "||", right: ts_prefix(op: "!", expr: ts_ident(name: "undo"))), op: "||", right: ts_prefix(op: "!", expr: ts_ident(name: "status"))), then_stmt: ts_block(stmts: [ ts_return(expr: none) ]), else_stmt: none), ts_const(name: "rows", value: ts_arrow(params: [], body: ts_block(stmts: [ @@ -102,15 +102,15 @@ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "localAvailable"), op: "=", rig ]))), ts_const(name: "retry", value: ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelector"), args: [ts_lit_str(value: "[data-view-retry]")])), ts_const(name: "report", value: ts_arrow(params: ["text"], body: ts_block(stmts: [ -ts_if(cond: ts_ident(name: "saveStatus"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "saveStatus"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "saveStatus"), property: "textContent"), op: "=", right: ts_ident(name: "text"))) ]), else_stmt: none), -ts_if(cond: ts_ident(name: "retry"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "retry"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "retry"), property: "hidden"), op: "=", right: ts_binop(left: ts_prefix(op: "!", expr: ts_binop(left: ts_binop(left: ts_ident(name: "account"), op: "&&", right: ts_prefix(op: "!", expr: ts_ident(name: "writable"))), op: "&&", right: ts_ident(name: "loaded"))), op: "||", right: ts_call(callee: ts_member(object: ts_ident(name: "text"), property: "startsWith"), args: [ts_lit_str(value: "Loading")])))) ]), else_stmt: none) ]))), ts_const(name: "flush", value: ts_arrow(params: [], body: ts_block(stmts: [ -ts_if(cond: ts_binop(left: ts_binop(left: ts_prefix(op: "!", expr: ts_ident(name: "writable")), op: "||", right: ts_ident(name: "saving")), op: "||", right: ts_prefix(op: "!", expr: ts_ident(name: "queued"))), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_binop(left: ts_prefix(op: "!", expr: ts_ident(name: "writable")), op: "||", right: ts_ident(name: "saving")), op: "||", right: ts_prefix(op: "!", expr: ts_ident(name: "queued"))), then_stmt: ts_block(stmts: [ ts_return(expr: none) ]), else_stmt: none), ts_const(name: "prefs", value: ts_ident(name: "queued")), @@ -118,7 +118,7 @@ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "queued"), op: "=", right: ts_i ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "saving"), op: "=", right: ts_ident(name: "true"))), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "report"), args: [ts_lit_str(value: "Saving to account…")])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_call(callee: ts_ident(name: "fetch"), args: [ts_lit_str(value: "/preferences/issues"), ts_object(fields: [ts_field(key: "method", value: ts_lit_str(value: "POST")), ts_field(key: "keepalive", value: ts_ident(name: "true")), ts_field(key: "credentials", value: ts_lit_str(value: "same-origin")), ts_field(key: "headers", value: ts_object(fields: [ts_quoted_field(key: "Content-Type", value: ts_lit_str(value: "application/x-www-form-urlencoded;charset=UTF-8"))])), ts_field(key: "body", value: ts_call(callee: ts_member(object: ts_new(callee: ts_ident(name: "URLSearchParams"), args: [ts_object(fields: [ts_field(key: "csrf", value: ts_ident(name: "csrf")), ts_field(key: "revision", value: ts_call(callee: ts_ident(name: "String"), args: [ts_ident(name: "revision")])), ts_field(key: "preferences", value: ts_call(callee: ts_member(object: ts_ident(name: "JSON"), property: "stringify"), args: [ts_ident(name: "prefs")]))])]), property: "toString"), args: []))])]), property: "then"), args: [ts_arrow(params: ["response"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), then_stmt: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "response"), property: "text"), args: []), property: "then"), args: [ts_arrow(params: ["text"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "Promise"), property: "reject"), args: [ts_new(callee: ts_ident(name: "Error"), args: [ts_ident(name: "text")])]) })]))]) }) ]), else_stmt: none), ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "response"), property: "json"), args: []) }) @@ -126,9 +126,9 @@ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "revision"), op: "=", right: ts_member(object: ts_ident(name: "result"), property: "revision"))), ts_try(body: ts_block(stmts: [ ts_const(name: "pending", value: ts_call(callee: ts_ident(name: "readPending"), args: [])), -ts_if(cond: ts_binop(left: ts_ident(name: "pending"), op: "&&", right: ts_binop(left: ts_call(callee: ts_member(object: ts_ident(name: "JSON"), property: "stringify"), args: [ts_member(object: ts_ident(name: "pending"), property: "preferences")]), op: "===", right: ts_call(callee: ts_member(object: ts_ident(name: "JSON"), property: "stringify"), args: [ts_ident(name: "prefs")]))), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_ident(name: "pending"), op: "&&", right: ts_binop(left: ts_call(callee: ts_member(object: ts_ident(name: "JSON"), property: "stringify"), args: [ts_member(object: ts_ident(name: "pending"), property: "preferences")]), op: "===", right: ts_call(callee: ts_member(object: ts_ident(name: "JSON"), property: "stringify"), args: [ts_ident(name: "prefs")]))), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "localStorage"), property: "removeItem"), args: [ts_binop(left: ts_call(callee: ts_ident(name: "localKey"), args: []), op: "+", right: ts_lit_str(value: ":pending"))])) -]), else_stmt: Present { value: ts_if(cond: ts_ident(name: "queued"), then: ts_block(stmts: [ +]), else_stmt: Present { value: ts_if(cond: ts_ident(name: "queued"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "markPending"), args: [ts_ident(name: "queued")])) ]), else_stmt: none) }) ]), catch_param: "error", handler: ts_block(stmts: [ @@ -147,14 +147,14 @@ ts_const(name: "persist", value: ts_arrow(params: [], body: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "edits"), op: "=", right: ts_binop(left: ts_ident(name: "edits"), op: "+", right: ts_lit_num(text: "1")))), ts_const(name: "prefs", value: ts_call(callee: ts_ident(name: "snapshot"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "cache"), args: [ts_ident(name: "prefs")])), -ts_if(cond: ts_ident(name: "account"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "account"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "markPending"), args: [ts_ident(name: "prefs")])) ]), else_stmt: none), -ts_if(cond: ts_binop(left: ts_ident(name: "account"), op: "&&", right: ts_ident(name: "writable")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_ident(name: "account"), op: "&&", right: ts_ident(name: "writable")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "queued"), op: "=", right: ts_ident(name: "prefs"))), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "clearTimeout"), args: [ts_ident(name: "timer")])), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "timer"), op: "=", right: ts_call(callee: ts_ident(name: "setTimeout"), args: [ts_ident(name: "flush"), ts_lit_num(text: "400")]))) -]), else_stmt: Present { value: ts_if(cond: ts_binop(left: ts_ident(name: "loaded"), op: "&&", right: ts_prefix(op: "!", expr: ts_ident(name: "account"))), then: ts_block(stmts: [ +]), else_stmt: Present { value: ts_if(cond: ts_binop(left: ts_ident(name: "loaded"), op: "&&", right: ts_prefix(op: "!", expr: ts_ident(name: "account"))), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "report"), args: [ts_cond(test: ts_ident(name: "localAvailable"), consequent: ts_lit_str(value: "Saved in this browser"), alternate: ts_lit_str(value: "Browser storage unavailable; this page only"))])) ]), else_stmt: none) }) ]))), @@ -167,15 +167,15 @@ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "list"), pro ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "more"), property: "disabled"), op: "=", right: ts_ident(name: "true"))), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "status"), property: "textContent"), op: "=", right: ts_lit_str(value: "Loading issues…"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_call(callee: ts_ident(name: "fetch"), args: [ts_lit_str(value: "/issues/query"), ts_object(fields: [ts_field(key: "method", value: ts_lit_str(value: "POST")), ts_field(key: "credentials", value: ts_lit_str(value: "same-origin")), ts_field(key: "cache", value: ts_lit_str(value: "no-store")), ts_field(key: "headers", value: ts_object(fields: [ts_quoted_field(key: "Content-Type", value: ts_lit_str(value: "application/x-www-form-urlencoded;charset=UTF-8"))])), ts_field(key: "body", value: ts_call(callee: ts_member(object: ts_new(callee: ts_ident(name: "URLSearchParams"), args: [ts_object(fields: [ts_field(key: "preferences", value: ts_call(callee: ts_member(object: ts_ident(name: "JSON"), property: "stringify"), args: [ts_call(callee: ts_ident(name: "snapshot"), args: [])])), ts_field(key: "offset", value: ts_call(callee: ts_ident(name: "String"), args: [ts_cond(test: ts_ident(name: "append"), consequent: ts_ident(name: "nextOffset"), alternate: ts_lit_num(text: "0"))])), ts_field(key: "snapshot", value: ts_cond(test: ts_ident(name: "append"), consequent: ts_ident(name: "snapshotId"), alternate: ts_lit_str(value: "")))])]), property: "toString"), args: []))])]), property: "then"), args: [ts_arrow(params: ["response"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), then_stmt: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "response"), property: "text"), args: []), property: "then"), args: [ts_arrow(params: ["message"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "Promise"), property: "reject"), args: [ts_new(callee: ts_ident(name: "Error"), args: [ts_ident(name: "message")])]) })]))]) }) ]), else_stmt: none), ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "response"), property: "json"), args: []) }) ]))]), property: "then"), args: [ts_arrow(params: ["result"], body: ts_block(stmts: [ -ts_if(cond: ts_binop(left: ts_ident(name: "serial"), op: "!==", right: ts_ident(name: "requestSerial")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_ident(name: "serial"), op: "!==", right: ts_ident(name: "requestSerial")), then_stmt: ts_block(stmts: [ ts_return(expr: none) ]), else_stmt: none), -ts_if(cond: ts_ident(name: "append"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "append"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "list"), property: "insertAdjacentHTML"), args: [ts_lit_str(value: "beforeend"), ts_member(object: ts_ident(name: "result"), property: "html")])) ]), else_stmt: Present { value: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "list"), property: "innerHTML"), op: "=", right: ts_member(object: ts_ident(name: "result"), property: "html"))) @@ -191,12 +191,12 @@ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "list"), pro ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_ident(name: "rows"), args: []), property: "forEach"), args: [ts_arrow(params: ["row"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "row"), property: "classList"), property: "toggle"), args: [ts_lit_str(value: "issue-focus-selected"), ts_binop(left: ts_prefix(op: "!", expr: ts_prefix(op: "!", expr: ts_ident(name: "project"))), op: "&&", right: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "row"), property: "dataset"), property: "node"), op: "===", right: ts_ident(name: "selected")))]) })]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "dispatchEvent"), args: [ts_new(callee: ts_ident(name: "CustomEvent"), args: [ts_lit_str(value: "issue-results")])])) ]))]), property: "catch"), args: [ts_arrow(params: ["error"], body: ts_block(stmts: [ -ts_if(cond: ts_binop(left: ts_ident(name: "serial"), op: "!==", right: ts_ident(name: "requestSerial")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_ident(name: "serial"), op: "!==", right: ts_ident(name: "requestSerial")), then_stmt: ts_block(stmts: [ ts_return(expr: none) ]), else_stmt: none), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "list"), property: "setAttribute"), args: [ts_lit_str(value: "aria-busy"), ts_lit_str(value: "false")])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "more"), property: "disabled"), op: "=", right: ts_ident(name: "false"))), -ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "append")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "append")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "list"), property: "replaceChildren"), args: [])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "more"), property: "hidden"), op: "=", right: ts_ident(name: "true"))) ]), else_stmt: none), @@ -240,7 +240,7 @@ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "project"), op: "=", right: ts_ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "selected"), op: "=", right: ts_member(object: ts_ident(name: "prefs"), property: "selected"))), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "expanded"), op: "=", right: ts_member(object: ts_ident(name: "prefs"), property: "expanded"))), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "topo"), op: "=", right: ts_ident(name: "false"))), -ts_if(cond: ts_ident(name: "search"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "search"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "search"), property: "value"), op: "=", right: ts_member(object: ts_ident(name: "prefs"), property: "query"))) ]), else_stmt: none), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "history"), property: "length"), op: "=", right: ts_lit_num(text: "0"))), @@ -257,7 +257,7 @@ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_member(object: ts_ident(n ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelectorAll"), args: [ts_lit_str(value: "[data-band-chip]")]), property: "forEach"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "classList"), property: "toggle"), args: [ts_lit_str(value: "chip-on"), ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "bandChip"), op: "===", right: ts_ident(name: "band"))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "option"), property: "setAttribute"), args: [ts_lit_str(value: "aria-selected"), ts_cond(test: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "bandChip"), op: "===", right: ts_ident(name: "band")), consequent: ts_lit_str(value: "true"), alternate: ts_lit_str(value: "false"))])), -ts_if(cond: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "bandChip"), op: "===", right: ts_ident(name: "band")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "bandChip"), op: "===", right: ts_ident(name: "band")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "option"), property: "closest"), args: [ts_lit_str(value: "[data-site-choice]")]), property: "querySelector"), args: [ts_lit_str(value: "[data-choice-label]")]), property: "textContent"), op: "=", right: ts_member(object: ts_ident(name: "option"), property: "textContent"))) ]), else_stmt: none) ]))])), @@ -268,12 +268,12 @@ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "history"), ]))), ts_const(name: "restore", value: ts_arrow(params: [], body: ts_block(stmts: [ ts_const(name: "previous", value: ts_call(callee: ts_member(object: ts_ident(name: "history"), property: "pop"), args: [])), -ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "previous")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_ident(name: "previous")), then_stmt: ts_block(stmts: [ ts_return(expr: none) ]), else_stmt: none), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "sorts"), op: "=", right: ts_member(object: ts_ident(name: "previous"), property: "sorts"))), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "band"), op: "=", right: ts_member(object: ts_ident(name: "previous"), property: "band"))), -ts_if(cond: ts_ident(name: "search"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "search"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "search"), property: "value"), op: "=", right: ts_member(object: ts_ident(name: "previous"), property: "query"))) ]), else_stmt: none), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "topo"), op: "=", right: ts_member(object: ts_ident(name: "previous"), property: "topo"))), @@ -285,7 +285,7 @@ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "persist"), args: [])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "status"), property: "textContent"), op: "=", right: ts_lit_str(value: "Previous view restored."))) ]))), ts_const(name: "focus", value: ts_arrow(params: ["row"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_member(object: ts_ident(name: "row"), property: "dataset"), property: "project")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_member(object: ts_ident(name: "row"), property: "dataset"), property: "project")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "status"), property: "textContent"), op: "=", right: ts_lit_str(value: "Project nesting is ambiguous or cyclic; no project view was selected."))), ts_return(expr: none) ]), else_stmt: none), @@ -306,14 +306,14 @@ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "anchor"), p ]))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "list"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: ["event"], body: ts_block(stmts: [ ts_const(name: "row", value: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "event"), property: "target"), property: "closest"), args: [ts_lit_str(value: "li.node")])), -ts_if(cond: ts_binop(left: ts_binop(left: ts_binop(left: ts_binop(left: ts_binop(left: ts_binop(left: ts_ident(name: "row"), op: "&&", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "target"), op: "===", right: ts_ident(name: "row"))), op: "&&", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "event"), property: "button"))), op: "&&", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "event"), property: "metaKey"))), op: "&&", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "event"), property: "ctrlKey"))), op: "&&", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "event"), property: "shiftKey"))), op: "&&", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "event"), property: "altKey"))), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_binop(left: ts_binop(left: ts_binop(left: ts_binop(left: ts_binop(left: ts_ident(name: "row"), op: "&&", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "target"), op: "===", right: ts_ident(name: "row"))), op: "&&", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "event"), property: "button"))), op: "&&", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "event"), property: "metaKey"))), op: "&&", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "event"), property: "ctrlKey"))), op: "&&", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "event"), property: "shiftKey"))), op: "&&", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "event"), property: "altKey"))), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "focus"), args: [ts_ident(name: "row")])) ]), else_stmt: none) ]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "list"), property: "addEventListener"), args: [ts_lit_str(value: "keydown"), ts_arrow(params: ["event"], body: ts_block(stmts: [ ts_const(name: "row", value: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "event"), property: "target"), property: "closest"), args: [ts_lit_str(value: "li.node")])), -ts_if(cond: ts_binop(left: ts_binop(left: ts_ident(name: "row"), op: "&&", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "target"), op: "===", right: ts_ident(name: "row"))), op: "&&", right: ts_binop(left: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "Enter")), op: "||", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: " ")))), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_binop(left: ts_ident(name: "row"), op: "&&", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "target"), op: "===", right: ts_ident(name: "row"))), op: "&&", right: ts_binop(left: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "Enter")), op: "||", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: " ")))), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "focus"), args: [ts_ident(name: "row")])) ]), else_stmt: none) @@ -341,9 +341,9 @@ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "button"), p ts_const(name: "key", value: ts_member(object: ts_member(object: ts_ident(name: "button"), property: "dataset"), property: "sortKey")), ts_const(name: "index", value: ts_call(callee: ts_member(object: ts_ident(name: "sorts"), property: "findIndex"), args: [ts_arrow(params: ["term"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_binop(left: ts_index(object: ts_call(callee: ts_member(object: ts_ident(name: "term"), property: "split"), args: [ts_lit_str(value: ":")]), index: ts_lit_num(text: "0")), op: "===", right: ts_ident(name: "key")) })]))])), ts_const(name: "next", value: ts_call(callee: ts_member(object: ts_ident(name: "sorts"), property: "slice"), args: [])), -ts_if(cond: ts_binop(left: ts_ident(name: "index"), op: "<", right: ts_lit_num(text: "0")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_ident(name: "index"), op: "<", right: ts_lit_num(text: "0")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "next"), property: "push"), args: [ts_binop(left: ts_binop(left: ts_ident(name: "key"), op: "+", right: ts_lit_str(value: ":")), op: "+", right: ts_call(callee: ts_ident(name: "firstDirection"), args: [ts_ident(name: "key")]))])) -]), else_stmt: Present { value: ts_if(cond: ts_binop(left: ts_index(object: ts_call(callee: ts_member(object: ts_index(object: ts_ident(name: "next"), index: ts_ident(name: "index")), property: "split"), args: [ts_lit_str(value: ":")]), index: ts_lit_num(text: "1")), op: "===", right: ts_call(callee: ts_ident(name: "firstDirection"), args: [ts_ident(name: "key")])), then: ts_block(stmts: [ +]), else_stmt: Present { value: ts_if(cond: ts_binop(left: ts_index(object: ts_call(callee: ts_member(object: ts_index(object: ts_ident(name: "next"), index: ts_ident(name: "index")), property: "split"), args: [ts_lit_str(value: ":")]), index: ts_lit_num(text: "1")), op: "===", right: ts_call(callee: ts_ident(name: "firstDirection"), args: [ts_ident(name: "key")])), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_index(object: ts_ident(name: "next"), index: ts_ident(name: "index")), op: "=", right: ts_binop(left: ts_ident(name: "key"), op: "+", right: ts_cond(test: ts_binop(left: ts_call(callee: ts_ident(name: "firstDirection"), args: [ts_ident(name: "key")]), op: "===", right: ts_lit_str(value: "asc")), consequent: ts_lit_str(value: ":desc"), alternate: ts_lit_str(value: ":asc"))))) ]), else_stmt: Present { value: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "next"), property: "splice"), args: [ts_ident(name: "index"), ts_lit_num(text: "1")])) @@ -360,7 +360,7 @@ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "persist"), args: [])) ]))])) ]))])), ts_const(name: "reset", value: ts_call(callee: ts_member(object: ts_ident(name: "root"), property: "querySelector"), args: [ts_lit_str(value: "[data-view-reset]")])), -ts_if(cond: ts_ident(name: "reset"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "reset"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "reset"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: [], body: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "remember"), args: [])), ts_const(name: "prior", value: ts_call(callee: ts_member(object: ts_ident(name: "history"), property: "slice"), args: [])), @@ -370,17 +370,17 @@ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "paint"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "persist"), args: [])) ]))])) ]), else_stmt: none), -ts_if(cond: ts_ident(name: "search"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "search"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "search"), property: "addEventListener"), args: [ts_lit_str(value: "input"), ts_arrow(params: [], body: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "paint"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "persist"), args: [])) ]))])) ]), else_stmt: none), -ts_if(cond: ts_ident(name: "retry"), then: ts_block(stmts: [ +ts_if(cond: ts_ident(name: "retry"), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "retry"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: [], body: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "report"), args: [ts_lit_str(value: "Loading account preferences…")])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_call(callee: ts_ident(name: "fetch"), args: [ts_lit_str(value: "/preferences/issues"), ts_object(fields: [ts_field(key: "credentials", value: ts_lit_str(value: "same-origin")), ts_field(key: "cache", value: ts_lit_str(value: "no-store"))])]), property: "then"), args: [ts_arrow(params: ["response"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), then_stmt: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "Promise"), property: "reject"), args: [ts_new(callee: ts_ident(name: "Error"), args: [ts_lit_str(value: "Account preferences unavailable")])]) }) ]), else_stmt: none), ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "response"), property: "json"), args: []) }) @@ -400,43 +400,43 @@ ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "window"), p ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "applyPreferences"), args: [ts_binop(left: ts_call(callee: ts_ident(name: "readLocal"), args: [ts_ident(name: "anonymousKey")]), op: "||", right: ts_call(callee: ts_ident(name: "defaults"), args: []))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "gunbcSessionRead"), property: "then"), args: [ts_arrow(params: ["session"], body: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "loaded"), op: "=", right: ts_ident(name: "true"))), -ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "session"), property: "authenticated")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "session"), property: "authenticated")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "report"), args: [ts_cond(test: ts_ident(name: "localAvailable"), consequent: ts_lit_str(value: "Saved in this browser"), alternate: ts_lit_str(value: "Browser storage unavailable; this page only"))])), ts_return(expr: none) ]), else_stmt: none), -ts_if(cond: ts_binop(left: ts_binop(left: ts_prefix(op: "typeof ", expr: ts_member(object: ts_ident(name: "session"), property: "principal")), op: "!==", right: ts_lit_str(value: "string")), op: "||", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "session"), property: "principal"))), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_binop(left: ts_prefix(op: "typeof ", expr: ts_member(object: ts_ident(name: "session"), property: "principal")), op: "!==", right: ts_lit_str(value: "string")), op: "||", right: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "session"), property: "principal"))), then_stmt: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "Promise"), property: "reject"), args: [ts_new(callee: ts_ident(name: "Error"), args: [ts_lit_str(value: "Account identity unavailable")])]) }) ]), else_stmt: none), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "account"), op: "=", right: ts_member(object: ts_ident(name: "session"), property: "principal"))), ts_const(name: "observedEdits", value: ts_ident(name: "edits")), ts_const(name: "cached", value: ts_call(callee: ts_ident(name: "readLocal"), args: [ts_call(callee: ts_ident(name: "localKey"), args: [])])), -ts_if(cond: ts_binop(left: ts_ident(name: "cached"), op: "&&", right: ts_binop(left: ts_ident(name: "edits"), op: "===", right: ts_lit_num(text: "0"))), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_ident(name: "cached"), op: "&&", right: ts_binop(left: ts_ident(name: "edits"), op: "===", right: ts_lit_num(text: "0"))), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "applyPreferences"), args: [ts_ident(name: "cached")])) ]), else_stmt: none), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "report"), args: [ts_lit_str(value: "Loading account preferences…")])), ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_call(callee: ts_ident(name: "fetch"), args: [ts_lit_str(value: "/preferences/issues"), ts_object(fields: [ts_field(key: "credentials", value: ts_lit_str(value: "same-origin")), ts_field(key: "cache", value: ts_lit_str(value: "no-store"))])]), property: "then"), args: [ts_arrow(params: ["response"], body: ts_block(stmts: [ -ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), then: ts_block(stmts: [ +ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), then_stmt: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "Promise"), property: "reject"), args: [ts_new(callee: ts_ident(name: "Error"), args: [ts_lit_str(value: "Account preferences unavailable")])]) }) ]), else_stmt: none), ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "response"), property: "json"), args: []) }) ]))]), property: "then"), args: [ts_arrow(params: ["context"], body: ts_block(stmts: [ -ts_if(cond: ts_binop(left: ts_binop(left: ts_member(object: ts_ident(name: "context"), property: "preferences"), op: "!==", right: ts_ident(name: "null")), op: "&&", right: ts_prefix(op: "!", expr: ts_call(callee: ts_ident(name: "valid"), args: [ts_member(object: ts_ident(name: "context"), property: "preferences")]))), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_binop(left: ts_member(object: ts_ident(name: "context"), property: "preferences"), op: "!==", right: ts_ident(name: "null")), op: "&&", right: ts_prefix(op: "!", expr: ts_call(callee: ts_ident(name: "valid"), args: [ts_member(object: ts_ident(name: "context"), property: "preferences")]))), then_stmt: ts_block(stmts: [ ts_return(expr: Present { value: ts_call(callee: ts_member(object: ts_ident(name: "Promise"), property: "reject"), args: [ts_new(callee: ts_ident(name: "Error"), args: [ts_lit_str(value: "Invalid account preferences")])]) }) ]), else_stmt: none), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "revision"), op: "=", right: ts_member(object: ts_ident(name: "context"), property: "revision"))), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "csrf"), op: "=", right: ts_member(object: ts_ident(name: "context"), property: "csrf"))), ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "writable"), op: "=", right: ts_ident(name: "true"))), ts_const(name: "pending", value: ts_call(callee: ts_ident(name: "readPending"), args: [])), -ts_if(cond: ts_binop(left: ts_ident(name: "pending"), op: "&&", right: ts_binop(left: ts_ident(name: "edits"), op: "===", right: ts_ident(name: "observedEdits"))), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_ident(name: "pending"), op: "&&", right: ts_binop(left: ts_ident(name: "edits"), op: "===", right: ts_ident(name: "observedEdits"))), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "applyPreferences"), args: [ts_member(object: ts_ident(name: "pending"), property: "preferences")])), -ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "pending"), property: "revision"), op: "===", right: ts_ident(name: "revision")), then: ts_block(stmts: [ +ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "pending"), property: "revision"), op: "===", right: ts_ident(name: "revision")), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "persist"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "flush"), args: [])) ]), else_stmt: Present { value: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_ident(name: "writable"), op: "=", right: ts_ident(name: "false"))), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "report"), args: [ts_lit_str(value: "Unsynced browser view; account preferences changed. Save this view to replace them.")])) ]) }) -]), else_stmt: Present { value: ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "context"), property: "preferences"), op: "&&", right: ts_binop(left: ts_ident(name: "edits"), op: "===", right: ts_ident(name: "observedEdits"))), then: ts_block(stmts: [ +]), else_stmt: Present { value: ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "context"), property: "preferences"), op: "&&", right: ts_binop(left: ts_ident(name: "edits"), op: "===", right: ts_ident(name: "observedEdits"))), then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "applyPreferences"), args: [ts_member(object: ts_ident(name: "context"), property: "preferences")])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "cache"), args: [ts_member(object: ts_ident(name: "context"), property: "preferences")])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "report"), args: [ts_lit_str(value: "Saved to account")])) diff --git a/dag/gunbc/runner/workspace_microvm_access.dag b/dag/gunbc/runner/workspace_microvm_access.dag index 2d0d020bdf9..ff7a3e17192 100644 --- a/dag/gunbc/runner/workspace_microvm_access.dag +++ b/dag/gunbc/runner/workspace_microvm_access.dag @@ -148,13 +148,13 @@ fn workspace_observe_connection(identity: AttemptIdentity, launch: AttemptLaunch } fn workspace_connection_text(connection: WorkspaceConnection) -> String { - let alias = connection.host_key_alias as String - let known_host = join([alias, connection.host_key as String], " ") + let host_alias = connection.host_key_alias as String + let known_host = join([host_alias, connection.host_key as String], " ") let gateway = join([connection.host_account as String, "@", connection.host_tailnet as String], "") let target = join([connection.guest_user as String, "@", connection.guest_ip as String], "") join([ "mkdir -p ~/.ssh && chmod 700 ~/.ssh && printf '%s\\n' ", posix_single_quote(spelling: connection.gateway_known_host as String), " ", posix_single_quote(spelling: known_host), - " >> ~/.ssh/known_hosts && ssh -o StrictHostKeyChecking=yes -o ", posix_single_quote(spelling: concat("HostKeyAlias=", alias)), + " >> ~/.ssh/known_hosts && ssh -o StrictHostKeyChecking=yes -o ", posix_single_quote(spelling: concat("HostKeyAlias=", host_alias)), " -J ", posix_single_quote(spelling: gateway), " ", posix_single_quote(spelling: target), "\n\nVerify allocation: cat /etc/gunbc-allocation\nExpected identity: ", connection.identity.attempt.attempt_id.value as String, "\nRelease or expiry permanently deletes this workspace disk.", diff --git a/dag/gunbc/site/choice_client.dag b/dag/gunbc/site/choice_client.dag index da772d6dc1d..33a1b8974e8 100644 --- a/dag/gunbc/site/choice_client.dag +++ b/dag/gunbc/site/choice_client.dag @@ -3,6 +3,6 @@ import extdeps.languages.typescript.program { TsStmt, ts_ident, ts_lit_str, ts_l // Shared rich and compact selection grammar. Selection emits intent; it never posts. fn choice_bind_statements() -> List { - [ts_const(name: "siteBindChoice", value: ts_arrow(params: ["choice"], body: ts_block(stmts: [ts_const(name: "trigger", value: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "querySelector"), args: [ts_lit_str(value: "[data-choice-trigger]")])), ts_const(name: "popup", value: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "querySelector"), args: [ts_lit_str(value: "[data-choice-list]")])), ts_const(name: "options", value: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "querySelectorAll"), args: [ts_lit_str(value: "[data-choice-value]")])])), ts_const(name: "rich", value: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "choice"), property: "dataset"), property: "siteChoice"), op: "===", right: ts_lit_str(value: "rich"))), ts_const(name: "closeChoice", value: ts_arrow(params: [], body: ts_block(stmts: [ts_if(cond: ts_ident(name: "rich"), then: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "popup"), property: "hidden"), op: "=", right: ts_ident(name: "true"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "setAttribute"), args: [ts_lit_str(value: "aria-expanded"), ts_lit_str(value: "false")]))]), else_stmt: Present { value: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "choice"), property: "open"), op: "=", right: ts_ident(name: "false")))]) })]))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "addEventListener"), args: [ts_lit_str(value: "focusout"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "relatedTarget")])), then: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "closeChoice"), args: []))]), else_stmt: none)]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "forEach"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "option"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_if(cond: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "choiceValue"), then: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "forEach"), args: [ts_arrow(params: ["item"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "item"), property: "setAttribute"), args: [ts_lit_str(value: "aria-selected"), ts_binop(left: ts_ident(name: "item"), op: "===", right: ts_ident(name: "option"))]))]))])), ts_if(cond: ts_ident(name: "rich"), then: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "trigger"), property: "value"), op: "=", right: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "choiceValue")))]), else_stmt: Present { value: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "querySelector"), args: [ts_lit_str(value: "[data-choice-label]")]), property: "textContent"), op: "=", right: ts_member(object: ts_ident(name: "option"), property: "textContent")))]) }), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "focus"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "closeChoice"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "dispatchEvent"), args: [ts_new(callee: ts_ident(name: "CustomEvent"), args: [ts_lit_str(value: "site-choice"), ts_object(fields: [ts_field(key: "bubbles", value: ts_ident(name: "true")), ts_field(key: "detail", value: ts_object(fields: [ts_field(key: "value", value: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "choiceValue")), ts_field(key: "workflow", value: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "workflow"), op: "===", right: ts_lit_str(value: "1")))]))])])]))]), else_stmt: none)]))]))]))])), ts_if(cond: ts_ident(name: "rich"), then: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "addEventListener"), args: [ts_lit_str(value: "focus"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "popup"), property: "hidden"), op: "=", right: ts_ident(name: "false"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "setAttribute"), args: [ts_lit_str(value: "aria-expanded"), ts_lit_str(value: "true")]))]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "addEventListener"), args: [ts_lit_str(value: "input"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_const(name: "query", value: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "trigger"), property: "value"), property: "toLowerCase"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "forEach"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "option"), property: "hidden"), op: "=", right: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "textContent"), property: "toLowerCase"), args: []), property: "includes"), args: [ts_ident(name: "query")]))))]))])), ts_const(name: "empty", value: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "querySelector"), args: [ts_lit_str(value: "[data-choice-empty]")])), ts_if(cond: ts_ident(name: "empty"), then: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "empty"), property: "hidden"), op: "=", right: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "some"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "option"), property: "hidden")) })]))])))]), else_stmt: none), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "popup"), property: "hidden"), op: "=", right: ts_ident(name: "false"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "setAttribute"), args: [ts_lit_str(value: "aria-expanded"), ts_lit_str(value: "true")]))]))]))]), else_stmt: none), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "addEventListener"), args: [ts_lit_str(value: "keydown"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_const(name: "key", value: ts_member(object: ts_ident(name: "event"), property: "key")), ts_if(cond: ts_binop(left: ts_binop(left: ts_ident(name: "rich"), op: "&&", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "target"), op: "===", right: ts_ident(name: "trigger"))), op: "&&", right: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "Enter"))), then: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: []))]), else_stmt: none), ts_if(cond: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "Escape")), then: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "focus"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "closeChoice"), args: [])), ts_return(expr: none)]), else_stmt: none), ts_const(name: "visible", value: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "filter"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "option"), property: "hidden")) })]))])), ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "visible"), property: "length")), then: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_if(cond: ts_binop(left: ts_binop(left: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "ArrowDown")), op: "||", right: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "ArrowUp"))), op: "||", right: ts_binop(left: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "Home")), op: "||", right: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "End")))), then: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_if(cond: ts_ident(name: "rich"), then: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "popup"), property: "hidden"), op: "=", right: ts_ident(name: "false"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "setAttribute"), args: [ts_lit_str(value: "aria-expanded"), ts_lit_str(value: "true")]))]), else_stmt: Present { value: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "choice"), property: "open"), op: "=", right: ts_ident(name: "true")))]) }), ts_const(name: "current", value: ts_call(callee: ts_member(object: ts_ident(name: "visible"), property: "indexOf"), args: [ts_member(object: ts_ident(name: "document"), property: "activeElement")])), ts_const(name: "next", value: ts_cond(test: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "Home")), consequent: ts_lit_num(text: "0"), alternate: ts_cond(test: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "End")), consequent: ts_binop(left: ts_member(object: ts_ident(name: "visible"), property: "length"), op: "-", right: ts_lit_num(text: "1")), alternate: ts_cond(test: ts_binop(left: ts_ident(name: "current"), op: "<", right: ts_lit_num(text: "0")), consequent: ts_cond(test: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "ArrowUp")), consequent: ts_binop(left: ts_member(object: ts_ident(name: "visible"), property: "length"), op: "-", right: ts_lit_num(text: "1")), alternate: ts_lit_num(text: "0")), alternate: ts_binop(left: ts_binop(left: ts_binop(left: ts_ident(name: "current"), op: "+", right: ts_cond(test: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "ArrowDown")), consequent: ts_lit_num(text: "1"), alternate: ts_lit_num(text: "-1"))), op: "+", right: ts_member(object: ts_ident(name: "visible"), property: "length")), op: "%", right: ts_member(object: ts_ident(name: "visible"), property: "length")))))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_index(object: ts_ident(name: "visible"), index: ts_ident(name: "next")), property: "focus"), args: []))]), else_stmt: none), ts_if(cond: ts_binop(left: ts_binop(left: ts_ident(name: "rich"), op: "&&", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "target"), op: "===", right: ts_ident(name: "trigger"))), op: "&&", right: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "Enter"))), then: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_index(object: ts_ident(name: "visible"), index: ts_lit_num(text: "0")), property: "click"), args: []))]), else_stmt: none)]))])), ts_const(name: "outsideChoice", value: ts_arrow(params: ["event"], body: ts_block(stmts: [ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "target")])), then: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "closeChoice"), args: []))]), else_stmt: none)]))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_ident(name: "outsideChoice")])), ts_return(expr: Present { value: ts_arrow(params: [], body: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "removeEventListener"), args: [ts_lit_str(value: "click"), ts_ident(name: "outsideChoice")]))])) })]))), + [ts_const(name: "siteBindChoice", value: ts_arrow(params: ["choice"], body: ts_block(stmts: [ts_const(name: "trigger", value: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "querySelector"), args: [ts_lit_str(value: "[data-choice-trigger]")])), ts_const(name: "popup", value: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "querySelector"), args: [ts_lit_str(value: "[data-choice-list]")])), ts_const(name: "options", value: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "querySelectorAll"), args: [ts_lit_str(value: "[data-choice-value]")])])), ts_const(name: "rich", value: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "choice"), property: "dataset"), property: "siteChoice"), op: "===", right: ts_lit_str(value: "rich"))), ts_const(name: "closeChoice", value: ts_arrow(params: [], body: ts_block(stmts: [ts_if(cond: ts_ident(name: "rich"), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "popup"), property: "hidden"), op: "=", right: ts_ident(name: "true"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "setAttribute"), args: [ts_lit_str(value: "aria-expanded"), ts_lit_str(value: "false")]))]), else_stmt: Present { value: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "choice"), property: "open"), op: "=", right: ts_ident(name: "false")))]) })]))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "addEventListener"), args: [ts_lit_str(value: "focusout"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "relatedTarget")])), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "closeChoice"), args: []))]), else_stmt: none)]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "forEach"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "option"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_if(cond: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "choiceValue"), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "forEach"), args: [ts_arrow(params: ["item"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "item"), property: "setAttribute"), args: [ts_lit_str(value: "aria-selected"), ts_binop(left: ts_ident(name: "item"), op: "===", right: ts_ident(name: "option"))]))]))])), ts_if(cond: ts_ident(name: "rich"), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "trigger"), property: "value"), op: "=", right: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "choiceValue")))]), else_stmt: Present { value: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "querySelector"), args: [ts_lit_str(value: "[data-choice-label]")]), property: "textContent"), op: "=", right: ts_member(object: ts_ident(name: "option"), property: "textContent")))]) }), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "focus"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "closeChoice"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "dispatchEvent"), args: [ts_new(callee: ts_ident(name: "CustomEvent"), args: [ts_lit_str(value: "site-choice"), ts_object(fields: [ts_field(key: "bubbles", value: ts_ident(name: "true")), ts_field(key: "detail", value: ts_object(fields: [ts_field(key: "value", value: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "choiceValue")), ts_field(key: "workflow", value: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "workflow"), op: "===", right: ts_lit_str(value: "1")))]))])])]))]), else_stmt: none)]))]))]))])), ts_if(cond: ts_ident(name: "rich"), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "addEventListener"), args: [ts_lit_str(value: "focus"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "popup"), property: "hidden"), op: "=", right: ts_ident(name: "false"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "setAttribute"), args: [ts_lit_str(value: "aria-expanded"), ts_lit_str(value: "true")]))]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "addEventListener"), args: [ts_lit_str(value: "input"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_const(name: "query", value: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "trigger"), property: "value"), property: "toLowerCase"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "forEach"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "option"), property: "hidden"), op: "=", right: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "textContent"), property: "toLowerCase"), args: []), property: "includes"), args: [ts_ident(name: "query")]))))]))])), ts_const(name: "empty", value: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "querySelector"), args: [ts_lit_str(value: "[data-choice-empty]")])), ts_if(cond: ts_ident(name: "empty"), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "empty"), property: "hidden"), op: "=", right: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "some"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "option"), property: "hidden")) })]))])))]), else_stmt: none), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "popup"), property: "hidden"), op: "=", right: ts_ident(name: "false"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "setAttribute"), args: [ts_lit_str(value: "aria-expanded"), ts_lit_str(value: "true")]))]))]))]), else_stmt: none), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "addEventListener"), args: [ts_lit_str(value: "keydown"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_const(name: "key", value: ts_member(object: ts_ident(name: "event"), property: "key")), ts_if(cond: ts_binop(left: ts_binop(left: ts_ident(name: "rich"), op: "&&", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "target"), op: "===", right: ts_ident(name: "trigger"))), op: "&&", right: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "Enter"))), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: []))]), else_stmt: none), ts_if(cond: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "Escape")), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "focus"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "closeChoice"), args: [])), ts_return(expr: none)]), else_stmt: none), ts_const(name: "visible", value: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "filter"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "option"), property: "hidden")) })]))])), ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "visible"), property: "length")), then_stmt: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_if(cond: ts_binop(left: ts_binop(left: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "ArrowDown")), op: "||", right: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "ArrowUp"))), op: "||", right: ts_binop(left: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "Home")), op: "||", right: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "End")))), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_if(cond: ts_ident(name: "rich"), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "popup"), property: "hidden"), op: "=", right: ts_ident(name: "false"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "trigger"), property: "setAttribute"), args: [ts_lit_str(value: "aria-expanded"), ts_lit_str(value: "true")]))]), else_stmt: Present { value: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "choice"), property: "open"), op: "=", right: ts_ident(name: "true")))]) }), ts_const(name: "current", value: ts_call(callee: ts_member(object: ts_ident(name: "visible"), property: "indexOf"), args: [ts_member(object: ts_ident(name: "document"), property: "activeElement")])), ts_const(name: "next", value: ts_cond(test: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "Home")), consequent: ts_lit_num(text: "0"), alternate: ts_cond(test: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "End")), consequent: ts_binop(left: ts_member(object: ts_ident(name: "visible"), property: "length"), op: "-", right: ts_lit_num(text: "1")), alternate: ts_cond(test: ts_binop(left: ts_ident(name: "current"), op: "<", right: ts_lit_num(text: "0")), consequent: ts_cond(test: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "ArrowUp")), consequent: ts_binop(left: ts_member(object: ts_ident(name: "visible"), property: "length"), op: "-", right: ts_lit_num(text: "1")), alternate: ts_lit_num(text: "0")), alternate: ts_binop(left: ts_binop(left: ts_binop(left: ts_ident(name: "current"), op: "+", right: ts_cond(test: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "ArrowDown")), consequent: ts_lit_num(text: "1"), alternate: ts_lit_num(text: "-1"))), op: "+", right: ts_member(object: ts_ident(name: "visible"), property: "length")), op: "%", right: ts_member(object: ts_ident(name: "visible"), property: "length")))))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_index(object: ts_ident(name: "visible"), index: ts_ident(name: "next")), property: "focus"), args: []))]), else_stmt: none), ts_if(cond: ts_binop(left: ts_binop(left: ts_ident(name: "rich"), op: "&&", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "target"), op: "===", right: ts_ident(name: "trigger"))), op: "&&", right: ts_binop(left: ts_ident(name: "key"), op: "===", right: ts_lit_str(value: "Enter"))), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_index(object: ts_ident(name: "visible"), index: ts_lit_num(text: "0")), property: "click"), args: []))]), else_stmt: none)]))])), ts_const(name: "outsideChoice", value: ts_arrow(params: ["event"], body: ts_block(stmts: [ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "choice"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "target")])), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "closeChoice"), args: []))]), else_stmt: none)]))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_ident(name: "outsideChoice")])), ts_return(expr: Present { value: ts_arrow(params: [], body: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "removeEventListener"), args: [ts_lit_str(value: "click"), ts_ident(name: "outsideChoice")]))])) })]))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "querySelectorAll"), args: [ts_lit_str(value: "[data-site-choice]")])]), property: "forEach"), args: [ts_ident(name: "siteBindChoice")]))] } diff --git a/dag/gunbc/site/controls.dag b/dag/gunbc/site/controls.dag index f5c8f3265d8..2cf9cb6242c 100644 --- a/dag/gunbc/site/controls.dag +++ b/dag/gunbc/site/controls.dag @@ -116,12 +116,12 @@ fn js_oscillator_tick_body(s: SoundSpec) -> TsStmt { ts_block(stmts: [ ts_if( cond: ts_call(callee: ts_ident(name: js_sound_muted_fn), args: []), - then: ts_block(stmts: [ts_return(expr: none)]), + then_stmt: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none, ), ts_if( cond: ts_prefix(op: "!", expr: ts_ident(name: js_audio_context_var)), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop( left: ts_ident(name: js_audio_context_var), op: "=", @@ -133,7 +133,7 @@ fn js_oscillator_tick_body(s: SoundSpec) -> TsStmt { ts_const(name: "play", value: ts_arrow(params: [], body: ts_block(stmts: js_oscillator_schedule_stmts(s: s, decay_s: decay_s)))), ts_if( cond: ts_binop(left: js_actx_member(name: "state"), op: "===", right: ts_lit_str(value: "running")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call(callee: ts_ident(name: "play"), args: [])), ts_return(expr: none), ]), @@ -270,7 +270,7 @@ fn theme_toggle_bind_statements() -> List { ts_const(name: "t", value: ts_call(callee: ts_ident(name: js_theme_choice_fn), args: [])), ts_if( cond: ts_binop(left: ts_ident(name: "t"), op: "===", right: ts_lit_str(value: theme_toggle_auto_value)), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member(object: js_document_element(), property: "removeAttribute"), args: [ts_lit_str(value: "data-theme")], @@ -319,7 +319,7 @@ fn theme_toggle_bind_statements() -> List { )), ts_if( cond: ts_binop(left: ts_ident(name: "next"), op: "===", right: ts_lit_str(value: theme_toggle_auto_value)), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member(object: ts_ident(name: "localStorage"), property: "removeItem"), args: [ts_lit_str(value: theme_storage_key)], @@ -329,7 +329,7 @@ fn theme_toggle_bind_statements() -> List { ), ts_if( cond: ts_binop(left: ts_ident(name: "next"), op: "!==", right: ts_lit_str(value: theme_toggle_auto_value)), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member(object: ts_ident(name: "localStorage"), property: "setItem"), args: [ts_lit_str(value: theme_storage_key), ts_ident(name: "next")], @@ -367,7 +367,7 @@ fn account_swap_statements() -> List { ts_const(name: "gunbcAccountSignin", value: account_query_expr(selector: "[data-account-signin]")), ts_if( cond: ts_binop(left: ts_ident(name: "gunbcAccountSlot"), op: "&&", right: ts_ident(name: "gunbcAccountSignin")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_call( callee: ts_member( object: ts_call( @@ -378,7 +378,7 @@ fn account_swap_statements() -> List { left: ts_binop(left: ts_ident(name: "s"), op: "&&", right: ts_member(object: ts_ident(name: "s"), property: "authenticated")), op: "&&", right: ts_binop(left: ts_member(object: ts_ident(name: "s"), property: "authenticated"), op: "===", right: ts_ident(name: "true"))), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_const(name: "gunbcViewer", value: ts_binop( left: ts_binop( left: ts_member(object: ts_ident(name: "s"), property: "name"), @@ -407,7 +407,7 @@ fn account_swap_statements() -> List { right: ts_ident(name: "gunbcShort"))), ts_if( cond: ts_member(object: ts_ident(name: "s"), property: "picture"), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_const(name: "gunbcAvatarImg", value: ts_call( callee: ts_member(object: ts_ident(name: "document"), property: "createElement"), args: [ts_lit_str(value: "img")])), @@ -439,7 +439,7 @@ fn account_swap_statements() -> List { ts_const(name: "gunbcAccountMenu", value: account_query_expr(selector: "[data-account-menu]")), ts_if( cond: ts_binop(left: ts_ident(name: "gunbcAccountTrigger"), op: "&&", right: ts_ident(name: "gunbcAccountMenu")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_on_click(obj: "gunbcAccountTrigger", body: [ ts_const(name: "gunbcMenuOpen", value: ts_member(object: ts_ident(name: "gunbcAccountMenu"), property: "hidden")), ts_expr_stmt(expr: ts_binop( @@ -466,7 +466,7 @@ fn account_swap_statements() -> List { left: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "gunbcAccountTrigger"), property: "contains"), args: [ts_member(object: ts_ident(name: "e"), property: "target")])), op: "&&", right: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "gunbcAccountMenu"), property: "contains"), args: [ts_member(object: ts_ident(name: "e"), property: "target")])))), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "gunbcAccountMenu"), property: "hidden"), op: "=", right: ts_ident(name: "true"))), ts_expr_stmt(expr: ts_call( callee: ts_member(object: ts_ident(name: "gunbcAccountTrigger"), property: "setAttribute"), diff --git a/dag/gunbc/site/mention_client.dag b/dag/gunbc/site/mention_client.dag index 31f94983ca5..54dc2997a64 100644 --- a/dag/gunbc/site/mention_client.dag +++ b/dag/gunbc/site/mention_client.dag @@ -1,3 +1,3 @@ module gunbc.site.mention_client import extdeps.languages.typescript.program { TsStmt, ts_ident, ts_lit_str, ts_lit_num, ts_member, ts_index, ts_call, ts_arrow, ts_block, ts_const, ts_return, ts_expr_stmt, ts_if, ts_cond, ts_prefix, ts_binop } -fn mention_bind_statements() -> List { [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "querySelectorAll"), args: [ts_lit_str(value: ".issue-comment-form")])]), property: "forEach"), args: [ts_arrow(params: ["form"], body: ts_block(stmts: [ts_const(name: "input", value: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "querySelector"), args: [ts_lit_str(value: ".issue-comment-input")])), ts_const(name: "menu", value: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "querySelector"), args: [ts_lit_str(value: ".issue-mention-options")])), ts_const(name: "options", value: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "querySelectorAll"), args: [ts_lit_str(value: "[data-mention-reference]")])])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "form"), property: "mentionStart"), op: "=", right: ts_lit_num(text: "-1"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "input"), property: "addEventListener"), args: [ts_lit_str(value: "input"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_const(name: "before", value: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "input"), property: "value"), property: "slice"), args: [ts_lit_num(text: "0"), ts_member(object: ts_ident(name: "input"), property: "selectionStart")])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "form"), property: "mentionStart"), op: "=", right: ts_call(callee: ts_member(object: ts_ident(name: "before"), property: "lastIndexOf"), args: [ts_lit_str(value: "@")]))), ts_const(name: "query", value: ts_call(callee: ts_member(object: ts_ident(name: "before"), property: "slice"), args: [ts_binop(left: ts_member(object: ts_ident(name: "form"), property: "mentionStart"), op: "+", right: ts_lit_num(text: "1"))])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "menu"), property: "hidden"), op: "=", right: ts_binop(left: ts_binop(left: ts_member(object: ts_ident(name: "form"), property: "mentionStart"), op: "<", right: ts_lit_num(text: "0")), op: "||", right: ts_call(callee: ts_member(object: ts_ident(name: "query"), property: "includes"), args: [ts_lit_str(value: " ")])))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "forEach"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "option"), property: "hidden"), op: "=", right: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "textContent"), property: "toLowerCase"), args: []), property: "includes"), args: [ts_call(callee: ts_member(object: ts_ident(name: "query"), property: "toLowerCase"), args: [])]))))]))]))]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "forEach"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "option"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_const(name: "start", value: ts_member(object: ts_ident(name: "form"), property: "mentionStart")), ts_if(cond: ts_binop(left: ts_ident(name: "start"), op: "<", right: ts_lit_num(text: "0")), then: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_const(name: "reference", value: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "mentionReference"), op: "+", right: ts_lit_str(value: " "))), ts_const(name: "end", value: ts_member(object: ts_ident(name: "input"), property: "selectionStart")), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "input"), property: "value"), op: "=", right: ts_binop(left: ts_binop(left: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "input"), property: "value"), property: "slice"), args: [ts_lit_num(text: "0"), ts_ident(name: "start")]), op: "+", right: ts_ident(name: "reference")), op: "+", right: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "input"), property: "value"), property: "slice"), args: [ts_ident(name: "end")])))), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "menu"), property: "hidden"), op: "=", right: ts_ident(name: "true"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "input"), property: "focus"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "input"), property: "setSelectionRange"), args: [ts_binop(left: ts_ident(name: "start"), op: "+", right: ts_member(object: ts_ident(name: "reference"), property: "length")), ts_binop(left: ts_ident(name: "start"), op: "+", right: ts_member(object: ts_ident(name: "reference"), property: "length"))]))]))]))]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "addEventListener"), args: [ts_lit_str(value: "keydown"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "Escape")), then: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "menu"), property: "hidden"), op: "=", right: ts_ident(name: "true"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "input"), property: "focus"), args: [])), ts_return(expr: none)]), else_stmt: none), ts_if(cond: ts_member(object: ts_ident(name: "menu"), property: "hidden"), then: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_const(name: "visible", value: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "filter"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "option"), property: "hidden")) })]))])), ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "visible"), property: "length")), then: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_if(cond: ts_binop(left: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "ArrowDown")), op: "||", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "ArrowUp"))), then: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_const(name: "current", value: ts_call(callee: ts_member(object: ts_ident(name: "visible"), property: "indexOf"), args: [ts_member(object: ts_ident(name: "document"), property: "activeElement")])), ts_const(name: "step", value: ts_cond(test: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "ArrowDown")), consequent: ts_lit_num(text: "1"), alternate: ts_lit_num(text: "-1"))), ts_const(name: "next", value: ts_binop(left: ts_binop(left: ts_binop(left: ts_ident(name: "current"), op: "+", right: ts_ident(name: "step")), op: "+", right: ts_member(object: ts_ident(name: "visible"), property: "length")), op: "%", right: ts_member(object: ts_ident(name: "visible"), property: "length"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_index(object: ts_ident(name: "visible"), index: ts_ident(name: "next")), property: "focus"), args: []))]), else_stmt: none)]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "target")])), then: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "menu"), property: "hidden"), op: "=", right: ts_ident(name: "true")))]), else_stmt: none)]))]))]))]))] } +fn mention_bind_statements() -> List { [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "querySelectorAll"), args: [ts_lit_str(value: ".issue-comment-form")])]), property: "forEach"), args: [ts_arrow(params: ["form"], body: ts_block(stmts: [ts_const(name: "input", value: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "querySelector"), args: [ts_lit_str(value: ".issue-comment-input")])), ts_const(name: "menu", value: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "querySelector"), args: [ts_lit_str(value: ".issue-mention-options")])), ts_const(name: "options", value: ts_call(callee: ts_member(object: ts_ident(name: "Array"), property: "from"), args: [ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "querySelectorAll"), args: [ts_lit_str(value: "[data-mention-reference]")])])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "form"), property: "mentionStart"), op: "=", right: ts_lit_num(text: "-1"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "input"), property: "addEventListener"), args: [ts_lit_str(value: "input"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_const(name: "before", value: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "input"), property: "value"), property: "slice"), args: [ts_lit_num(text: "0"), ts_member(object: ts_ident(name: "input"), property: "selectionStart")])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "form"), property: "mentionStart"), op: "=", right: ts_call(callee: ts_member(object: ts_ident(name: "before"), property: "lastIndexOf"), args: [ts_lit_str(value: "@")]))), ts_const(name: "query", value: ts_call(callee: ts_member(object: ts_ident(name: "before"), property: "slice"), args: [ts_binop(left: ts_member(object: ts_ident(name: "form"), property: "mentionStart"), op: "+", right: ts_lit_num(text: "1"))])), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "menu"), property: "hidden"), op: "=", right: ts_binop(left: ts_binop(left: ts_member(object: ts_ident(name: "form"), property: "mentionStart"), op: "<", right: ts_lit_num(text: "0")), op: "||", right: ts_call(callee: ts_member(object: ts_ident(name: "query"), property: "includes"), args: [ts_lit_str(value: " ")])))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "forEach"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "option"), property: "hidden"), op: "=", right: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "textContent"), property: "toLowerCase"), args: []), property: "includes"), args: [ts_call(callee: ts_member(object: ts_ident(name: "query"), property: "toLowerCase"), args: [])]))))]))]))]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "forEach"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "option"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_const(name: "start", value: ts_member(object: ts_ident(name: "form"), property: "mentionStart")), ts_if(cond: ts_binop(left: ts_ident(name: "start"), op: "<", right: ts_lit_num(text: "0")), then_stmt: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_const(name: "reference", value: ts_binop(left: ts_member(object: ts_member(object: ts_ident(name: "option"), property: "dataset"), property: "mentionReference"), op: "+", right: ts_lit_str(value: " "))), ts_const(name: "end", value: ts_member(object: ts_ident(name: "input"), property: "selectionStart")), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "input"), property: "value"), op: "=", right: ts_binop(left: ts_binop(left: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "input"), property: "value"), property: "slice"), args: [ts_lit_num(text: "0"), ts_ident(name: "start")]), op: "+", right: ts_ident(name: "reference")), op: "+", right: ts_call(callee: ts_member(object: ts_member(object: ts_ident(name: "input"), property: "value"), property: "slice"), args: [ts_ident(name: "end")])))), ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "menu"), property: "hidden"), op: "=", right: ts_ident(name: "true"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "input"), property: "focus"), args: [])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "input"), property: "setSelectionRange"), args: [ts_binop(left: ts_ident(name: "start"), op: "+", right: ts_member(object: ts_ident(name: "reference"), property: "length")), ts_binop(left: ts_ident(name: "start"), op: "+", right: ts_member(object: ts_ident(name: "reference"), property: "length"))]))]))]))]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "addEventListener"), args: [ts_lit_str(value: "keydown"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_if(cond: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "Escape")), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "menu"), property: "hidden"), op: "=", right: ts_ident(name: "true"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "input"), property: "focus"), args: [])), ts_return(expr: none)]), else_stmt: none), ts_if(cond: ts_member(object: ts_ident(name: "menu"), property: "hidden"), then_stmt: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_const(name: "visible", value: ts_call(callee: ts_member(object: ts_ident(name: "options"), property: "filter"), args: [ts_arrow(params: ["option"], body: ts_block(stmts: [ts_return(expr: Present { value: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "option"), property: "hidden")) })]))])), ts_if(cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "visible"), property: "length")), then_stmt: ts_block(stmts: [ts_return(expr: none)]), else_stmt: none), ts_if(cond: ts_binop(left: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "ArrowDown")), op: "||", right: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "ArrowUp"))), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "event"), property: "preventDefault"), args: [])), ts_const(name: "current", value: ts_call(callee: ts_member(object: ts_ident(name: "visible"), property: "indexOf"), args: [ts_member(object: ts_ident(name: "document"), property: "activeElement")])), ts_const(name: "step", value: ts_cond(test: ts_binop(left: ts_member(object: ts_ident(name: "event"), property: "key"), op: "===", right: ts_lit_str(value: "ArrowDown")), consequent: ts_lit_num(text: "1"), alternate: ts_lit_num(text: "-1"))), ts_const(name: "next", value: ts_binop(left: ts_binop(left: ts_binop(left: ts_ident(name: "current"), op: "+", right: ts_ident(name: "step")), op: "+", right: ts_member(object: ts_ident(name: "visible"), property: "length")), op: "%", right: ts_member(object: ts_ident(name: "visible"), property: "length"))), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_index(object: ts_ident(name: "visible"), index: ts_ident(name: "next")), property: "focus"), args: []))]), else_stmt: none)]))])), ts_expr_stmt(expr: ts_call(callee: ts_member(object: ts_ident(name: "document"), property: "addEventListener"), args: [ts_lit_str(value: "click"), ts_arrow(params: ["event"], body: ts_block(stmts: [ts_if(cond: ts_prefix(op: "!", expr: ts_call(callee: ts_member(object: ts_ident(name: "form"), property: "contains"), args: [ts_member(object: ts_ident(name: "event"), property: "target")])), then_stmt: ts_block(stmts: [ts_expr_stmt(expr: ts_binop(left: ts_member(object: ts_ident(name: "menu"), property: "hidden"), op: "=", right: ts_ident(name: "true")))]), else_stmt: none)]))]))]))]))] } diff --git a/dag/gunbc/site/session_client.dag b/dag/gunbc/site/session_client.dag index 4b6d795ca6a..e5edd97b65b 100644 --- a/dag/gunbc/site/session_client.dag +++ b/dag/gunbc/site/session_client.dag @@ -36,7 +36,7 @@ fn session_read_bind_statements() -> List { args: [ts_arrow(params: ["response"], body: ts_block(stmts: [ ts_if( cond: ts_prefix(op: "!", expr: ts_member(object: ts_ident(name: "response"), property: "ok")), - then: ts_block(stmts: [ + then_stmt: ts_block(stmts: [ ts_return(expr: Present { value: ts_call( callee: ts_member(object: ts_ident(name: "Promise"), property: "reject"), args: [ts_new(callee: ts_ident(name: "Error"), args: [ts_lit_str(value: "Session read failed")])]) }), diff --git a/dag/gunbc/spark/llama_cpp_rpc_observed.dag b/dag/gunbc/spark/llama_cpp_rpc_observed.dag index 5c5e4f39089..328d59cb81e 100644 --- a/dag/gunbc/spark/llama_cpp_rpc_observed.dag +++ b/dag/gunbc/spark/llama_cpp_rpc_observed.dag @@ -196,7 +196,7 @@ type LlamaCppRpcDeployment sole_constructor { } fn llama_cpp_rpc_construct( - alias: NonEmptyStr, + served_alias: NonEmptyStr, front_door: LlamaCppRpcFrontDoor, weights_peer: LlamaCppRpcWeightsPeer, fabric: LlamaCppRpcFabricObserved, @@ -218,7 +218,7 @@ fn llama_cpp_rpc_construct( none } else { Present { value: LlamaCppRpcDeployment { - alias: alias, + alias: served_alias, front_door: front_door, weights_peer: weights_peer, fabric: fabric, @@ -454,7 +454,7 @@ fn llama_cpp_rpc_observed() -> LlamaCppRpcDeployment? { Absent => none Present { value: peer } => llama_cpp_rpc_construct( - alias: llama_cpp_rpc_observed_alias, + served_alias: llama_cpp_rpc_observed_alias, front_door: llama_cpp_rpc_observed_front_door, weights_peer: peer, fabric: llama_cpp_rpc_observed_fabric, diff --git a/dag/gunbc/spark/native_experiment_apply.dag b/dag/gunbc/spark/native_experiment_apply.dag index 49ac8cab953..6dc8a93125e 100644 --- a/dag/gunbc/spark/native_experiment_apply.dag +++ b/dag/gunbc/spark/native_experiment_apply.dag @@ -458,7 +458,7 @@ fn spark_experiment_workload_phase(cohort: ExecutionCellCohort let window = spark_churn_window_seconds(admitted_seconds: plan.max_runtime_seconds) let context_window = token_count_value(t: plan.profile.max_model_len) - let alias = plan.profile.served_alias + let served = plan.profile.served_alias Present { value: SparkExperimentWorkloadPhase { variant: variant, readiness_gate: SparkExperimentWorkloadLeg { @@ -475,9 +475,9 @@ fn spark_experiment_workload_phase(cohort: ExecutionCellCohort systemd_workload_prefill_script(member: head, serve_port: plan.profile.serve_port, served_alias: alias, seat_count: variant.seat_count, seat_window: seat_window, context_window: context_window, sequential: false, watchdog: variant.watchdog, request_timeout_seconds: variant.request_timeout_seconds, decode_probe: variant.decode_probe) - SparkSeatsSequential => systemd_workload_prefill_script(member: head, serve_port: plan.profile.serve_port, served_alias: alias, seat_count: variant.seat_count, seat_window: seat_window, context_window: context_window, sequential: true, watchdog: variant.watchdog, request_timeout_seconds: variant.request_timeout_seconds, decode_probe: variant.decode_probe) - SparkCacheReuseQualification => systemd_workload_cache_reuse_script(member: head, serve_port: plan.profile.serve_port, served_alias: alias, seat_window: seat_window, context_window: context_window) + SparkSeatsConcurrent => systemd_workload_prefill_script(member: head, serve_port: plan.profile.serve_port, served_alias: served, seat_count: variant.seat_count, seat_window: seat_window, context_window: context_window, sequential: false, watchdog: variant.watchdog, request_timeout_seconds: variant.request_timeout_seconds, decode_probe: variant.decode_probe) + SparkSeatsSequential => systemd_workload_prefill_script(member: head, serve_port: plan.profile.serve_port, served_alias: served, seat_count: variant.seat_count, seat_window: seat_window, context_window: context_window, sequential: true, watchdog: variant.watchdog, request_timeout_seconds: variant.request_timeout_seconds, decode_probe: variant.decode_probe) + SparkCacheReuseQualification => systemd_workload_cache_reuse_script(member: head, serve_port: plan.profile.serve_port, served_alias: served, seat_window: seat_window, context_window: context_window) }, }, }, @@ -486,7 +486,7 @@ fn spark_experiment_workload_phase(cohort: ExecutionCellCohort Bool { Present { value: sha } => { let h = as_content_hash_cryptographic(digest: sha) let canon = serialize_content_hash(hash: h) as String - let alias = concat(canon, "sha256:ignored") - match parse_content_hash(wire: alias) { + let alias_value = concat(canon, "sha256:ignored") + match parse_content_hash(wire: alias_value) { Present { value: _ } => false Absent => match parse_content_hash(wire: canon) { diff --git a/dag/test/claim/repository_convergence_witness_test.dag b/dag/test/claim/repository_convergence_witness_test.dag index 59476ad8244..2658d20a22b 100644 --- a/dag/test/claim/repository_convergence_witness_test.dag +++ b/dag/test/claim/repository_convergence_witness_test.dag @@ -240,10 +240,10 @@ test fn a_ref_added_during_transition_refuses() -> Bool { } test fn a_symref_retargeted_at_the_same_object_refuses() -> Bool { - let alias = "refs/alias/release" + let alias_value = "refs/alias/release" let before = transition_state_with_refs( refs: refs_wire(records: [ - symref_record(name: alias, oid: dispatch_sha, target: "refs/heads/dispatch/attempt-a"), + symref_record(name: alias_value, oid: dispatch_sha, target: "refs/heads/dispatch/attempt-a"), dispatch_ref_record(), heads_dispatch_record(), heads_main_record(oid: old_sha), @@ -254,7 +254,7 @@ test fn a_symref_retargeted_at_the_same_object_refuses() -> Bool { ) let after = transition_state_with_refs( refs: refs_wire(records: [ - symref_record(name: alias, oid: dispatch_sha, target: "refs/dispatch/attempt-a"), + symref_record(name: alias_value, oid: dispatch_sha, target: "refs/dispatch/attempt-a"), dispatch_ref_record(), heads_dispatch_record(), heads_main_record(oid: new_sha), @@ -265,7 +265,7 @@ test fn a_symref_retargeted_at_the_same_object_refuses() -> Bool { ) match repository_convergence_verdict(before: before, after: after, candidate: new_sha, base_ref: base_ref) { ConvergenceRefRebound { refname: r, before_object: bo, after_object: ao, before_target: bt, after_target: at } => - r == alias + r == alias_value && bo == dispatch_sha && ao == dispatch_sha && bt == "refs/heads/dispatch/attempt-a" @@ -658,10 +658,10 @@ test fn a_symref_targeting_the_base_ref_follows_the_transition() -> Bool { // THE CONTROL: a symref whose target is NOT the base ref, whose object nevertheless moved, is still // a rebind -- nothing in this transition moved its target, so something else did. test fn a_symref_targeting_another_ref_that_moved_still_refuses() -> Bool { - let alias = "refs/alias/release" + let alias_value = "refs/alias/release" let before = transition_state_with_refs( refs: refs_wire(records: [ - symref_record(name: alias, oid: dispatch_sha, target: "refs/heads/dispatch/attempt-a"), + symref_record(name: alias_value, oid: dispatch_sha, target: "refs/heads/dispatch/attempt-a"), dispatch_ref_record(), heads_dispatch_record(), heads_main_record(oid: old_sha), @@ -672,7 +672,7 @@ test fn a_symref_targeting_another_ref_that_moved_still_refuses() -> Bool { ) let after = transition_state_with_refs( refs: refs_wire(records: [ - symref_record(name: alias, oid: new_sha, target: "refs/heads/dispatch/attempt-a"), + symref_record(name: alias_value, oid: new_sha, target: "refs/heads/dispatch/attempt-a"), dispatch_ref_record(), heads_dispatch_record(), heads_main_record(oid: new_sha), @@ -682,7 +682,7 @@ test fn a_symref_targeting_another_ref_that_moved_still_refuses() -> Bool { reflog: reflog_after(oid: new_sha), ) match repository_convergence_verdict(before: before, after: after, candidate: new_sha, base_ref: base_ref) { - ConvergenceRefRebound { refname: r, before_object: _, after_object: _, before_target: _, after_target: _ } => r == alias + ConvergenceRefRebound { refname: r, before_object: _, after_object: _, before_target: _, after_target: _ } => r == alias_value _ => false } } diff --git a/dag/test/claim/runner/runner_microvm_attempt_witness_test.dag b/dag/test/claim/runner/runner_microvm_attempt_witness_test.dag index 442ae7a1f8d..950dae488b2 100644 --- a/dag/test/claim/runner/runner_microvm_attempt_witness_test.dag +++ b/dag/test/claim/runner/runner_microvm_attempt_witness_test.dag @@ -126,7 +126,7 @@ test fn an_attempt_id_that_could_leave_its_own_directory_is_refused() -> Bool { AttemptSegmentRefused { refusal: AttemptSegmentContainsSeparator { spelling: _ } } => true _ => false } - let alias = match attempt_segment(spelling: "a/../b") { + let alias_value = match attempt_segment(spelling: "a/../b") { AttemptSegmentRefused { refusal: AttemptSegmentContainsSeparator { spelling: _ } } => true _ => false } @@ -138,7 +138,7 @@ test fn an_attempt_id_that_could_leave_its_own_directory_is_refused() -> Bool { AttemptSegmentRefused { refusal: AttemptSegmentEmpty } => true _ => false } - parent && here && traversal && alias && absolute && empty + parent && here && traversal && alias_value && absolute && empty } // AND AN ORDINARY ID STILL PASSES. Without this the refusal could be satisfied by refusing diff --git a/dag/test/claim/secret_ref_credential_identity_join_witness_test.dag b/dag/test/claim/secret_ref_credential_identity_join_witness_test.dag index e69314a7e01..a24179a81f0 100644 --- a/dag/test/claim/secret_ref_credential_identity_join_witness_test.dag +++ b/dag/test/claim/secret_ref_credential_identity_join_witness_test.dag @@ -53,8 +53,8 @@ fn join_is_alias_serving( ) { SecretRefVersionResolutionRefused { requested: _, returned: _ } => false SecretRefVersionResolvedExact { version: _ } => false - SecretRefVersionResolvedAlias { alias: alias, version: v } => - (v as String) == served && (alias as String) == (latest_alias_literal as String) + SecretRefVersionResolvedAlias { alias: resolved_alias, version: v } => + (v as String) == served && (resolved_alias as String) == (latest_alias_literal as String) } } diff --git a/dag/test/claim/spark/execution_cell_witness_test.dag b/dag/test/claim/spark/execution_cell_witness_test.dag index f5ae6449d46..db98fa2169c 100644 --- a/dag/test/claim/spark/execution_cell_witness_test.dag +++ b/dag/test/claim/spark/execution_cell_witness_test.dag @@ -465,7 +465,7 @@ test fn w_one_generation_identity_appears_on_every_member_unit() -> Bool { Absent => false Present { value: executable } => let expected = execution_generation_of_intent(intent_key: serving_launch_profile_key(p: executable.profile)) - let alias = executable.profile.served_alias as String + let alias_value = executable.profile.served_alias as String match spark_experiment_members(hosts: glm_native_ranked_hosts(), renders: glm_native_experiment_all_unit_renders()) { Absent => false Present { value: members } => @@ -475,7 +475,7 @@ test fn w_one_generation_identity_appears_on_every_member_unit() -> Bool { length(cohort.members) == 4 && length(filter(cohort.members, m => (m.unit_name as String) == (glm_native_head_unit_name as String))) == 1 && execution_generation_eq(a: cohort.generation, b: expected) - && all(cohort.members, m => string_contains(s: m.unit_text, pattern: alias)) + && all(cohort.members, m => string_contains(s: m.unit_text, pattern: alias_value)) } } } diff --git a/dag/test/claim/spark/spark_llama_cpp_rpc_witness_test.dag b/dag/test/claim/spark/spark_llama_cpp_rpc_witness_test.dag index 42373f52cf1..7df80186f80 100644 --- a/dag/test/claim/spark/spark_llama_cpp_rpc_witness_test.dag +++ b/dag/test/claim/spark/spark_llama_cpp_rpc_witness_test.dag @@ -109,7 +109,7 @@ test fn a_deployment_whose_two_ends_are_one_host_refuses() -> Bool { Absent => false Present { value: e } => match llama_cpp_rpc_construct( - alias: "x" as NonEmptyStr, + served_alias: "x" as NonEmptyStr, front_door: llama_cpp_rpc_front_door( host: operator_host_srv8, client_address: ipv4_address(octet1: 192, octet2: 168, octet3: 1, octet4: 233), @@ -132,7 +132,7 @@ test fn a_peer_addressed_off_the_fabric_refuses() -> Bool { { let link = llama_cpp_rpc_observed_fabric match llama_cpp_rpc_construct( - alias: "x" as NonEmptyStr, + served_alias: "x" as NonEmptyStr, front_door: llama_cpp_rpc_front_door( host: operator_host_srv7, client_address: ipv4_address(octet1: 192, octet2: 168, octet3: 1, octet4: 232), @@ -375,7 +375,7 @@ test fn a_unit_whose_ends_share_an_address_and_port_has_no_constructor() -> Bool Absent => false Present { value: e } => match llama_cpp_rpc_construct( - alias: "fixture" as NonEmptyStr, + served_alias: "fixture" as NonEmptyStr, front_door: llama_cpp_rpc_front_door( host: operator_host_srv7, client_address: e.address, port: 50052), weights_peer: llama_cpp_rpc_weights_peer( diff --git a/dag/test/claim/v1_interpreter_primitive_surface_witness_test.dag b/dag/test/claim/v1_interpreter_primitive_surface_witness_test.dag index ae1269880af..ffcd82ce880 100644 --- a/dag/test/claim/v1_interpreter_primitive_surface_witness_test.dag +++ b/dag/test/claim/v1_interpreter_primitive_surface_witness_test.dag @@ -133,11 +133,11 @@ test fn shadow_detector_catches_a_planted_duplicate() -> Bool { } test fn shadow_detector_admits_a_real_alias_pair() -> Bool { - let alias = [ + let alias_value = [ planted_row(identity: "planted.shared", spelling: "alpha", symbol: "planted_dispatch"), planted_row(identity: "planted.shared", spelling: "beta", symbol: "planted_dispatch"), ] - form_has_no_shadowed_spelling(rows: alias) + form_has_no_shadowed_spelling(rows: alias_value) } test fn lookup_is_dispatched_under_more_than_one_site() -> Bool { diff --git a/src/v2/compiler/body_lowering_fold.dag b/src/v2/compiler/body_lowering_fold.dag index ce5cedaed6e..1ac3d9a6902 100644 --- a/src/v2/compiler/body_lowering_fold.dag +++ b/src/v2/compiler/body_lowering_fold.dag @@ -11769,10 +11769,10 @@ fn body_lower_exit_walk_children(node: Node, tail: Bool, arm_tail: Bool) -> Opti }) } -fn body_lower_exit_first(first: Optional>, then: Node, tail: Bool) -> Optional> { +fn body_lower_exit_first(first: Optional>, next_arm: Node, tail: Bool) -> Optional> { match first { Present { value: _ } => first - Absent => body_lower_exit_walk(node: then, tail: tail, arm_tail: false) + Absent => body_lower_exit_walk(node: next_arm, tail: tail, arm_tail: false) } } @@ -11865,11 +11865,11 @@ fn body_lower_exit_walk_if_valued(shell: Node, tail: Bool) -> Optional body_lower_exit_walk_children(node: shell, tail: false, arm_tail: false) Present { value: condition } => let after_condition = match body_lower_if_then_arm_optional(captured: captured) { - Present { value: arm } => body_lower_exit_first(first: body_lower_exit_walk(node: condition, tail: false, arm_tail: false), then: body_lower_if_arm_as_node(arm: arm), tail: tail) + Present { value: arm } => body_lower_exit_first(first: body_lower_exit_walk(node: condition, tail: false, arm_tail: false), next_arm: body_lower_if_arm_as_node(arm: arm), tail: tail) Absent => body_lower_exit_walk_children(node: shell, tail: false, arm_tail: false) } match body_lower_if_else_capture_optional(captured: captured) { - Present { value: arm } => body_lower_exit_first(first: after_condition, then: body_lower_if_arm_as_node(arm: arm), tail: tail) + Present { value: arm } => body_lower_exit_first(first: after_condition, next_arm: body_lower_if_arm_as_node(arm: arm), tail: tail) Absent => after_condition } } @@ -11904,7 +11904,7 @@ fn body_lower_exit_walk_spine(spine: Node, tail: Bool) -> Optional let here = match body_lower_admitted_guard_optional(stmt: head) { Present { value: guard } => if tail { - body_lower_exit_first(first: body_lower_exit_walk(node: guard.condition, tail: false, arm_tail: false), then: guard.arm, tail: true) + body_lower_exit_first(first: body_lower_exit_walk(node: guard.condition, tail: false, arm_tail: false), next_arm: guard.arm, tail: true) } else { body_lower_exit_walk(node: head, tail: false, arm_tail: false) } diff --git a/src/v2/extdeps/languages/dag.dag b/src/v2/extdeps/languages/dag.dag index 90ea36af5e5..43751e8c7fb 100644 --- a/src/v2/extdeps/languages/dag.dag +++ b/src/v2/extdeps/languages/dag.dag @@ -22,7 +22,7 @@ import v2.std.optional { optional_absent, optional_present } -import v2.std.parse_refusal_reason { DataValueMissingAfterEq, DeclarationMarkerNotTest, FnExpressionBodyMissingAfterEq, KeywordAsPathSegment, LetInExpressionDropped, NewlineBeforeDualRoleOperator, ParseRefusalReason } +import v2.std.parse_refusal_reason { DataValueMissingAfterEq, DeclarationMarkerNotTest, FnExpressionBodyMissingAfterEq, KeywordAsPathSegment, KeywordAsValueName, LetInExpressionDropped, NewlineBeforeDualRoleOperator, ParseRefusalReason } import v2.std.grammar { GrammarEmitClassTerminal, GrammarEmitLexemeTerminal, @@ -889,9 +889,114 @@ fn dag_grammar_keyword_terminal() -> GrammarExpr { ) } +// A KEYWORD IS NOT A VALUE NAME, AND A KEYWORD WHERE ONE IS INTRODUCED REFUSES BY NAME (operator ruling +// via the N7 manager, 2026-10-03: close the binding/reference asymmetry from the BINDER side). Every +// position that introduces a value name -- a parameter, a `let` binder, a `node NAME` / `NAME =` binder, +// a field-pattern binder -- consumes exactly what a value REFERENCE admits (dag_grammar_primary_name_expr: +// an identifier, the two type-declaration modifiers, and the declared contextual set +// dag_contextual_value_name_keywords), so a name is declarable exactly when it is referenceable. Any other +// keyword there refuses as KeywordAsValueName, located at the keyword, rather than as the generic +// leftover parse_g0_tokens_remain at its first USE. +// A field LABEL is not a value name and still admits a keyword (dag_grammar_binding_name_terminal: +// `x.module`, `Rec { module: e }`, `{ module: m }`), and so do the statement and argument guards that +// read it. +// +// THE REFUSAL IS A LEADING GUARD, NEVER A CHOICE ARM. grammar_expr_not_predicate around +// grammar_expr_refuse_on_match captures nothing (v2.compiler.parse parse_sequence_capture answers the +// other side of the sequence), so the name still captures as ONE identifier atom -- the shape the binder +// readers take as pair.left -- and no choice row is added beside the name (the overlap roster those +// productions were cleared to stays at zero). +// +// THE BARE `NAME =` SUGAR CARRIES NO GUARD, AND THE REASON IS MEASURED. A statement's alternatives are +// dispatched by FIRST set, and a not-predicate is transparent to that set, so the let_sugar alternative's +// first set is the value-name tokens and a statement that begins with a keyword never reaches it: a guard +// there could not fire (a bare `loop = 1` refuses as parse_g0_tokens_remain at the keyword, measured). +// It still refuses -- the binder reads the reference production, which admits no other keyword -- but +// unnamed. NEXT TRIGGER, the capability: FIRST-set computation that sees through a refusal guard, at which +// point this form takes dag_grammar_value_name_before(follow: `=`) like the others. +// +// IT FIRES ONLY WHERE THE KEYWORD CAN ONLY BE A BINDER. RefuseOnMatch stops the whole parse, and a pattern +// is probed ahead of every match-arm statement and a `node NAME` sugar ahead of an expression statement, +// so each position names the token that makes the keyword a binder: `:` after a parameter name, `:` or +// `=` after `node NAME`, `,` or `}` after a field-pattern binder. After `let` +// nothing else can follow, so that guard is unconditional. `true` and `false` are literal PATTERNS, so the +// field-pattern guard does not refuse them. +fn dag_grammar_value_name_keyword_terminal(admit_bool_literals: Bool) -> GrammarExpr { + fold_list( + xs: dag_binding_name_keyword_tokens(), + empty: dag_grammar_terminal(token_class: ^dag_token_kw_import), + cons: fn(acc, tok) { + if (tok == ^dag_token_kw_import) || dag_keyword_is_reference_value_name(tok: tok) { + acc + } else if admit_bool_literals && ((tok == ^dag_token_kw_true) || (tok == ^dag_token_kw_false)) { + acc + } else { + dag_grammar_choice(left: acc, right: dag_grammar_terminal(token_class: tok)) + } + } + ) +} + +// A keyword the REFERENCE production admits as a value name (dag_grammar_primary_name_expr): the +// declared contextual set and the two type-declaration modifiers dag_grammar_ident_or_type_decl_modifier_name +// reads. The binder guard refuses exactly the binding keywords this answers false for. +fn dag_keyword_is_reference_value_name(tok: Symbol) -> Bool { + (tok == ^dag_token_kw_nominal_opaque) + || (tok == ^dag_token_kw_sole_constructor) + || fold_list(xs: dag_contextual_value_name_keywords(), empty: false, cons: fn(acc, k) { acc || (k == tok) }) +} + +fn dag_grammar_value_name_guard(binder: GrammarExpr) -> GrammarExpr { + grammar_expr_not_predicate( + element: grammar_expr_refuse_on_match(element: binder, reason: KeywordAsValueName) + ) +} + +// A value name whose binder role is fixed by the token after it. +fn dag_grammar_value_name_before(follow: GrammarExpr) -> GrammarExpr { + dag_grammar_sequence( + left: dag_grammar_value_name_guard( + binder: dag_grammar_sequence(left: dag_grammar_value_name_keyword_terminal(admit_bool_literals: false), right: follow) + ), + right: dag_grammar_primary_name_expr() + ) +} + +// A value name whose position alone makes it a binder (after `let`). +fn dag_grammar_value_name_unconditional() -> GrammarExpr { + dag_grammar_sequence( + left: dag_grammar_value_name_guard(binder: dag_grammar_value_name_keyword_terminal(admit_bool_literals: false)), + right: dag_grammar_primary_name_expr() + ) +} + +// A field-pattern binder: refuses a keyword that ends the field (`,` or `}`). After `:` the position is a +// pattern, where `true` / `false` are literal patterns, so they are admitted there (admit_bool_literals: true). +// Before the field name a keyword ending the field is a PUN -- `R { true }` binds a value named `true`, which +// no reference can name -- so there they refuse like every other keyword (admit_bool_literals: false). +fn dag_grammar_field_pattern_binder_guard(admit_bool_literals: Bool) -> GrammarExpr { + dag_grammar_value_name_guard( + binder: dag_grammar_sequence( + left: dag_grammar_value_name_keyword_terminal(admit_bool_literals: admit_bool_literals), + right: dag_grammar_choice( + left: dag_grammar_terminal(token_class: ^dag_token_comma), + right: dag_grammar_terminal(token_class: ^dag_token_rbrace) + ) + ) + ) +} + +// THE FIRST SEGMENT IS A VALUE NAME, SO IT READS THE ONE VALUE-NAME PRODUCTION. A pattern's bare binder is a +// one-segment qualified name (dag_grammar_constructor_pattern_expr), so a pattern binds exactly the names a +// reference reads only if this head is dag_grammar_primary_name_expr -- the identifier, the two +// type-declaration modifiers and the contextual set dag_contextual_value_name_keywords. Without it +// `{ module: module }` declared nothing a later `module` could name. The cost is stated: a type, a declared +// path, an alias or a service head may now also begin with `module` / `data`, which nothing declares, so it +// refuses at resolve; no overlap row is added, because neither keyword shares a first token with an +// identifier. Later segments are unchanged, so `rt.match` still refuses as KeywordAsPathSegment. fn dag_grammar_qualified_name_expr() -> GrammarExpr { dag_grammar_sequence( - left: dag_grammar_ident_or_type_decl_modifier_name(), + left: dag_grammar_primary_name_expr(), right: dag_grammar_repeat( element: dag_grammar_sequence( left: dag_grammar_terminal(token_class: ^dag_token_dot), @@ -923,7 +1028,7 @@ fn dag_grammar_generic_params_expr() -> GrammarExpr { // onto the parameter's binder (XL-2 PR2c-ii). fn dag_grammar_typed_param_expr() -> GrammarExpr { dag_grammar_sequence( - left: dag_grammar_binding_name_terminal(), + left: dag_grammar_value_name_before(follow: dag_grammar_terminal(token_class: ^dag_token_colon)), right: dag_grammar_sequence( left: dag_grammar_terminal(token_class: ^dag_token_colon), right: dag_grammar_sequence( @@ -1290,7 +1395,7 @@ fn dag_grammar_let_expr() -> GrammarExpr { left: dag_grammar_sequence( left: dag_grammar_terminal(token_class: ^dag_token_kw_let), right: dag_grammar_sequence( - left: dag_grammar_binding_name_terminal(), + left: dag_grammar_value_name_unconditional(), right: dag_grammar_choice( left: dag_grammar_sequence( left: dag_grammar_terminal(token_class: ^dag_token_colon), @@ -1326,7 +1431,12 @@ fn dag_grammar_let_sugar_expr() -> GrammarExpr { left: dag_grammar_sequence( left: dag_grammar_literal_terminal(token_class: ^dag_token_ident, lexeme: symbol_intern_lexeme(lexeme: "node")), right: dag_grammar_sequence( - left: dag_grammar_binding_name_terminal(), + left: dag_grammar_value_name_before( + follow: dag_grammar_choice( + left: dag_grammar_terminal(token_class: ^dag_token_colon), + right: dag_grammar_terminal(token_class: ^dag_token_eq) + ) + ), right: dag_grammar_sequence( left: dag_grammar_choice( left: dag_grammar_terminal(token_class: ^dag_token_colon), @@ -1337,7 +1447,7 @@ fn dag_grammar_let_sugar_expr() -> GrammarExpr { ) ), right: dag_grammar_sequence( - left: dag_grammar_binding_name_terminal(), + left: dag_grammar_primary_name_expr(), right: dag_grammar_sequence( left: dag_grammar_terminal(token_class: ^dag_token_eq), right: dag_grammar_nonterminal(production: ^dag_production_expr) @@ -1745,15 +1855,26 @@ fn dag_grammar_primary_expr_expr() -> GrammarExpr { // could begin a new statement where the grammar expects the clause. `if`, `match` and `let` head // expressions of their own and stay out. fn dag_grammar_primary_name_expr() -> GrammarExpr { - dag_grammar_choice( - left: dag_grammar_ident_or_type_decl_modifier_name(), - right: dag_grammar_choice( - left: dag_grammar_terminal_lexeme(token_class: ^dag_token_kw_module), - right: dag_grammar_terminal_lexeme(token_class: ^dag_token_kw_data) - ) + fold_list( + xs: dag_contextual_value_name_keywords(), + empty: dag_grammar_ident_or_type_decl_modifier_name(), + cons: fn(acc, tok) { dag_grammar_choice(left: acc, right: dag_grammar_terminal_lexeme(token_class: tok)) } ) } +// THE KEYWORDS THAT ARE ALSO VALUE NAMES, DECLARED ONCE. `module` and `data` head declarations only, so +// neither can continue or begin an expression of its own, and the corpus names values with them +// (`SourceRootBinding { module: module }`, 136 parameters named `module`). They are admitted as value +// names at BOTH ends: a reference reads them through dag_grammar_primary_name_expr, and a binder IS that +// same production behind the keyword guard (dag_grammar_value_name_before / _unconditional), so a name +// can be declared exactly when it can be referenced -- no declare-but-cannot-use asymmetry. Every other +// keyword at a value-binder position refuses as KeywordAsValueName (operator ruling via the N7 manager, +// 2026-10-03: contextual, symmetric, one set). Adding a keyword here is a language decision: it must +// head nothing that can follow an expression. +fn dag_contextual_value_name_keywords() -> List { + [^dag_token_kw_module, ^dag_token_kw_data] +} + fn dag_grammar_primary_expr_core() -> GrammarExpr { dag_grammar_choice( left: dag_grammar_sequence( @@ -2004,11 +2125,17 @@ fn dag_grammar_pattern_expr() -> GrammarExpr { // choice of the two forms, both led by the same name). A punned field captures `(name, )`. fn dag_grammar_field_pattern_expr() -> GrammarExpr { dag_grammar_sequence( - left: dag_grammar_binding_name_terminal(), - right: dag_grammar_optional( - element: dag_grammar_sequence( - left: dag_grammar_terminal(token_class: ^dag_token_colon), - right: dag_grammar_nonterminal(production: ^dag_production_pattern) + left: dag_grammar_field_pattern_binder_guard(admit_bool_literals: false), + right: dag_grammar_sequence( + left: dag_grammar_binding_name_terminal(), + right: dag_grammar_optional( + element: dag_grammar_sequence( + left: dag_grammar_terminal(token_class: ^dag_token_colon), + right: dag_grammar_sequence( + left: dag_grammar_field_pattern_binder_guard(admit_bool_literals: true), + right: dag_grammar_nonterminal(production: ^dag_production_pattern) + ) + ) ) ) ) diff --git a/src/v2/extdeps/languages/java.dag b/src/v2/extdeps/languages/java.dag index b83466f344b..7fb2f806773 100644 --- a/src/v2/extdeps/languages/java.dag +++ b/src/v2/extdeps/languages/java.dag @@ -1338,7 +1338,7 @@ fn java_grammar_root() -> GrammarRoot { expression: java_grammar_result_expr(), emitted: ^java_surface_result ) - let type = java_grammar_production( + let type_production = java_grammar_production( name: ^java_production_type, expression: java_grammar_type_expr(), emitted: ^java_surface_type @@ -1418,7 +1418,7 @@ fn java_grammar_root() -> GrammarRoot { field_declaration, primitive_type, result, - type, + type_production, formal_parameter_list, method_declarator, block, diff --git a/src/v2/lens/complexity_accumulator_copy/corpus_gate.dag b/src/v2/lens/complexity_accumulator_copy/corpus_gate.dag index 8cd05cf885d..d858fe4d8c1 100644 --- a/src/v2/lens/complexity_accumulator_copy/corpus_gate.dag +++ b/src/v2/lens/complexity_accumulator_copy/corpus_gate.dag @@ -391,8 +391,8 @@ fn newly_red_walk( newly: newly, unmeasured: Cons { head: a.path, tail: unmeasured } ) - CorpusFileScanned { suspects: as, refusals: _, causes: _ } => - if (as > 0) && (bs == 0) { + CorpusFileScanned { suspects: after_suspects, refusals: _, causes: _ } => + if (after_suspects > 0) && (bs == 0) { newly_red_walk( before: bt, after: at, diff --git a/src/v2/std/parse_refusal_reason.dag b/src/v2/std/parse_refusal_reason.dag index 85841502553..c6cf80eaddc 100644 --- a/src/v2/std/parse_refusal_reason.dag +++ b/src/v2/std/parse_refusal_reason.dag @@ -30,6 +30,11 @@ import v2.std.node { Symbol } // DeclarationMarkerNotTest -- an identifier other than `test` stands where the declaration // marker goes, before `fn` or `data` (`probe fn ..`); located at // the marker and the keyword after it. +// KeywordAsValueName -- a keyword stands where a VALUE NAME is introduced: a parameter +// (`then: Node`), a `let` binder, a `node NAME` / `NAME =` binder, +// or a field-pattern binder (`{ module: module }`, `{ module }`). +// A keyword is not an identifier; a field LABEL may still be one +// (`x.module`, `Rec { module: e }`). Located at the keyword. // TokenStartsNotIncreasing -- the token stream handed to the parse does not have strictly // increasing token starts. A stream position IS its token's // start (v2.compiler.parse parse_current_position keys the memo @@ -45,6 +50,7 @@ type ParseRefusalReason = | NewlineBeforeDualRoleOperator | LetInExpressionDropped | DeclarationMarkerNotTest + | KeywordAsValueName | TokenStartsNotIncreasing // The diagnostic identity each reason refuses under (`v2.std.diagnostic` `Diagnostic.reason`). @@ -57,6 +63,7 @@ fn parse_refusal_reason_symbol(reason: ParseRefusalReason) -> Symbol { NewlineBeforeDualRoleOperator => ^parse_newline_before_dual_role_operator LetInExpressionDropped => ^parse_let_in_expression_dropped DeclarationMarkerNotTest => ^parse_declaration_marker_not_test + KeywordAsValueName => ^parse_keyword_as_value_name TokenStartsNotIncreasing => ^parse_token_starts_not_increasing } } diff --git a/src/v2/test/claim/parse/keyword_value_name_parse_test.dag b/src/v2/test/claim/parse/keyword_value_name_parse_test.dag new file mode 100644 index 00000000000..782b1dbca74 --- /dev/null +++ b/src/v2/test/claim/parse/keyword_value_name_parse_test.dag @@ -0,0 +1,644 @@ +module v2.test.parse.keyword_value_name_parse + +import v2.compiler.tokenize { tokenize } +import v2.extdeps.languages.dag { dag_lex } +import v2.std.compilers.lexing { StreamLayout, Token, TokenStream, stream_layout_empty, stream_layout_with_break, token_stream_lexed } +import v2.test.parse.expression_bodied_fn_decl_parse { g_fatal_at, g_tokenize_parse } +import v2.test.parse.supplied_token_stream_support { supplied_stream_parse } +import v2.std.algebra { Cons, Empty } +import v2.std.collection { List } +import v2.std.diagnostic { Accepted, Outcome, Rejected } +import v2.std.node { Symbol } +import v2.std.optional { Absent, Optional, Present } +import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly } +import v2.std.logic { Bool } +import v2.std.parse_refusal_reason { KeywordAsValueName } +import v2.std.text { String } + +data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly + +// A KEYWORD IS NOT A VALUE NAME, AND SAYING SO IS A LOCATED REFUSAL AT THE BINDER. Every position that +// introduces a value name reads exactly what a value reference reads (v2.extdeps.languages.dag +// dag_grammar_primary_name_expr: an identifier, the two type-declaration modifiers, and the contextual set +// dag_contextual_value_name_keywords = module, data), behind a guard that refuses any other keyword as +// KeywordAsValueName (dag_grammar_value_name_before / _unconditional / dag_grammar_field_pattern_binder_guard). +// Before the guard the binder parsed and the program refused at the keyword's first USE as the generic +// parse_g0_tokens_remain (gunbc.recurring_failure_mode seed_admits_a_keyword_as_a_pattern_binder); that +// leftover reason as the fatal, or an accept, reds the subjects. +// +// THE CONTROLS ARE THE PROBED POSITIONS THE GUARD MUST NOT FIRE IN: keyword LABELS (a field decl, a record +// init, a projection, a field-pattern label), the contextual value names declared and used, `true` / `false` +// as literal patterns, and a match arm led by `true`. A statement value named `node` followed by an `if` is the same +// probed position, and it is already enrolled as v2.test.parse.bare_node_statement_route +// bare_node_statement_before_an_if_takes_the_expression_route (the same fixture), so it is not repeated here. +// Each would refuse if a guard were unconditional or its follow set too wide. + +data kvn_param_source: String = "module m.t\nfn f(then: Int) -> Int {\n 0\n}\n" + +// a parameter named by a keyword refuses at the keyword: `then` is bytes 16..20 of kvn_param_source. +test fn kvn_param_refuses_at_the_keyword_holds() -> Bool { + g_fatal_at( + parsed: g_tokenize_parse(text: kvn_param_source, file: ^probe_kvn_param), + reason: KeywordAsValueName, + file: ^probe_kvn_param, + start: 16, + end: 20 + ) +} + +data kvn_let_source: String = "module m.t\nfn f() -> Int {\n let alias = 1\n 0\n}\n" + +// a let binder named by a keyword refuses at the keyword: `alias` is bytes 33..38 of kvn_let_source. +test fn kvn_let_refuses_at_the_keyword_holds() -> Bool { + g_fatal_at( + parsed: supplied_stream_parse(tokens: kvn_let_stream()), + reason: KeywordAsValueName, + file: ^probe_kvn_let, + start: 33, + end: 38 + ) +} + +data kvn_node_sugar_source: String = "module m.t\nfn f() -> Int {\n node then = 1\n 0\n}\n" + +// a `node NAME =` binder named by a keyword refuses at the keyword: `then` is bytes 34..38 of kvn_node_sugar_source. +test fn kvn_node_sugar_refuses_at_the_keyword_holds() -> Bool { + g_fatal_at( + parsed: supplied_stream_parse(tokens: kvn_node_sugar_stream()), + reason: KeywordAsValueName, + file: ^probe_kvn_node_sugar, + start: 34, + end: 38 + ) +} + +data kvn_bare_eq_source: String = "module m.t\nfn f() -> Int {\n loop = 1\n 0\n}\n" + +// A bare `NAME =` binder named by a keyword still REFUSES, but unnamed: statements dispatch by FIRST set and the +// guard is transparent to it, so the let_sugar alternative is never reached for a keyword (the declared limit on +// gunbc.recurring_failure_mode seed_admits_a_keyword_as_a_pattern_binder). The claim holds the floor that matters -- +// the keyword is never ACCEPTED as a binder -- and reds if it ever parses. +test fn kvn_bare_eq_keyword_binder_still_refuses_holds() -> Bool { + match supplied_stream_parse(tokens: kvn_bare_eq_stream()) { + Accepted { value: _, diagnostics: _ } => false + Rejected { diagnostics: _ } => true + } +} + +data kvn_pattern_value_source: String = "module m.t\ndata d: Int = match r {\n R { a: as } => 0\n}\n" + +// a field-pattern binder named by a keyword refuses at the keyword: `as` is bytes 44..46 of kvn_pattern_value_source. +test fn kvn_pattern_value_refuses_at_the_keyword_holds() -> Bool { + g_fatal_at( + parsed: supplied_stream_parse(tokens: kvn_pattern_value_stream()), + reason: KeywordAsValueName, + file: ^probe_kvn_pattern_value, + start: 44, + end: 46 + ) +} + +data kvn_pattern_pun_source: String = "module m.t\ndata d: Int = match r {\n R { then } => 0\n}\n" + +// a punned field-pattern binder named by a keyword refuses at the keyword: `then` is bytes 41..45 of kvn_pattern_pun_source. +test fn kvn_pattern_pun_refuses_at_the_keyword_holds() -> Bool { + g_fatal_at( + parsed: supplied_stream_parse(tokens: kvn_pattern_pun_stream()), + reason: KeywordAsValueName, + file: ^probe_kvn_pattern_pun, + start: 41, + end: 45 + ) +} + +data kvn_pattern_pun_true_source: String = "module m.t\ndata d: Int = match r {\n R { true } => 0\n}\n" + +// A PUNNED field pattern named `true` is a value BINDER, not a literal pattern (the field pattern is +// `name [":" pattern]`), and a binder named `true` is unreferenceable, so it refuses at the keyword: +// bytes 41..45. Only the position after `:` reads `true` / `false` as literals. +test fn kvn_pattern_pun_true_refuses_at_the_keyword_holds() -> Bool { + g_fatal_at( + parsed: supplied_stream_parse(tokens: kvn_pattern_pun_true_stream()), + reason: KeywordAsValueName, + file: ^probe_kvn_pattern_pun_true, + start: 41, + end: 45 + ) +} + +data kvn_pattern_pun_false_source: String = "module m.t\ndata d: Int = match r {\n R { false } => 0\n}\n" + +// The same for `false`: bytes 41..46. +test fn kvn_pattern_pun_false_refuses_at_the_keyword_holds() -> Bool { + g_fatal_at( + parsed: supplied_stream_parse(tokens: kvn_pattern_pun_false_stream()), + reason: KeywordAsValueName, + file: ^probe_kvn_pattern_pun_false, + start: 41, + end: 46 + ) +} + +data kvn_bool_label_source: String = "module m.t\ndata d: Int = match r {\n R { true: x } => 0\n}\n" + +// Control: `true` as an explicit field-pattern LABEL is a label, not a binder, so it still parses. +test fn kvn_bool_label_control_holds() -> Bool { + match supplied_stream_parse(tokens: kvn_bool_label_stream()) { + Accepted { value: _, diagnostics: _ } => true + Rejected { diagnostics: _ } => false + } +} + +data kvn_label_keywords_source: String = "module m.t\ndata d: R = R { module: r.then }\n" + +// Control: keyword LABELS still parse: a record-init label and a projection (a field-pattern label is in +// the contextual control, a field-declaration label in kvn_field_decl_label). +test fn kvn_label_keywords_control_holds() -> Bool { + match supplied_stream_parse(tokens: kvn_label_keywords_stream()) { + Accepted { value: _, diagnostics: _ } => true + Rejected { diagnostics: _ } => false + } +} + +data kvn_contextual_module_data_source: String = "module m.t\nfn f(module: Int, data: Int) -> Int {\n module\n}\n" + +// Control: the contextual value names module and data are declarable as parameters and referenceable (the +// pattern-binder half is kvn_contextual_pattern_binder). +test fn kvn_contextual_module_data_control_holds() -> Bool { + match supplied_stream_parse(tokens: kvn_contextual_module_data_stream()) { + Accepted { value: _, diagnostics: _ } => true + Rejected { diagnostics: _ } => false + } +} + +data kvn_bool_literal_pattern_source: String = "module m.t\ndata d: Int = match r {\n R { ok: true } => 0\n}\n" + +// Control: true and false stay literal patterns in a field pattern. +test fn kvn_bool_literal_pattern_control_holds() -> Bool { + match supplied_stream_parse(tokens: kvn_bool_literal_pattern_stream()) { + Accepted { value: _, diagnostics: _ } => true + Rejected { diagnostics: _ } => false + } +} + +data kvn_match_arm_true_source: String = "module m.t\ndata d: Int = match b {\n true => 1\n}\n" + +// Control: a match arm led by true is not a lambda binder. +test fn kvn_match_arm_true_control_holds() -> Bool { + match supplied_stream_parse(tokens: kvn_match_arm_true_stream()) { + Accepted { value: _, diagnostics: _ } => true + Rejected { diagnostics: _ } => false + } +} + +data kvn_field_decl_label_source: String = "module m.t\ntype R = R { then: Int }\n" + +// Control: a field DECLARATION label is a label, not a value name, so it still admits a keyword. +test fn kvn_field_decl_label_control_holds() -> Bool { + match supplied_stream_parse(tokens: kvn_field_decl_label_stream()) { + Accepted { value: _, diagnostics: _ } => true + Rejected { diagnostics: _ } => false + } +} + +data kvn_contextual_pattern_binder_source: String = "module m.t\ndata d: Int = match r {\n R { module: module } => 0\n}\n" + +// Control: a contextual value name binds in a field pattern (its reference half is kvn_contextual_module_data). +test fn kvn_contextual_pattern_binder_control_holds() -> Bool { + match supplied_stream_parse(tokens: kvn_contextual_pattern_binder_stream()) { + Accepted { value: _, diagnostics: _ } => true + Rejected { diagnostics: _ } => false + } +} + +// THE INPUT IS SUPPLIED AT THE PARSE INTERFACE, AND THE TEXT ROUTE STILL RUNS ONCE. Every claim above +// except kvn_param_refuses_at_the_keyword parses a SUPPLIED token stream (v2.test.parse.supplied_token_stream_support +// supplied_stream_parse), because its subject is the grammar's binder guard, not the tokenizer: deriving the +// stream re-ran tokenize in every claim, and the floor's enrolment margin refused seven of them on that cost. +// kvn_param_refuses_at_the_keyword stays on the real text route (tokenize, prepared parse) as the +// inhabitance claim, and it asserts the ROUTE as well as the answer: the fatal must be KeywordAsValueName +// at the keyword's bytes, which the leftover parse_g0_tokens_remain route cannot produce. +// +// EACH SUPPLIED STREAM IS PROVEN TO BE THE TOKENIZER'S OUTPUT, POSITIONS AND LAYOUT INCLUDED. The located +// claims assert byte ranges and the statement claims depend on line breaks, so the shared class-and-lexeme +// projection is not enough here: kvn_stream_matches_tokenize compares every token's class, lexeme, start and +// end, and the recorded layout's digest, against the real tokenizer over the same source text. +fn kvn_tokens_agree(left: List, right: List) -> Bool { + match left { + Empty => + match right { + Empty => true + Cons { head: _, tail: _ } => false + } + Cons { head: a, tail: rest_a } => + match right { + Empty => false + Cons { head: b, tail: rest_b } => + (a.class == b.class) && (a.lexeme == b.lexeme) && (a.start == b.start) && (a.end == b.end) + && kvn_tokens_agree(left: rest_a, right: rest_b) + } + } +} + +fn kvn_layouts_agree(left: Optional, right: Optional) -> Bool { + match left { + Absent => false + Present { value: l } => + match right { + Absent => false + Present { value: r } => l.digest == r.digest + } + } +} + +fn kvn_stream_matches_tokenize(text: String, file: Symbol, supplied: TokenStream) -> Bool { + match tokenize(text: text, file: file, rules: dag_lex()) { + Rejected { diagnostics: _ } => false + Accepted { value: real, diagnostics: _ } => + kvn_tokens_agree(left: real.all, right: supplied.all) && kvn_layouts_agree(left: real.layout, right: supplied.layout) + } +} + +test fn kvn_let_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_let_source, file: ^probe_kvn_let, supplied: kvn_let_stream()) +} + +test fn kvn_node_sugar_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_node_sugar_source, file: ^probe_kvn_node_sugar, supplied: kvn_node_sugar_stream()) +} + +test fn kvn_bare_eq_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_bare_eq_source, file: ^probe_kvn_bare_eq, supplied: kvn_bare_eq_stream()) +} + +test fn kvn_pattern_value_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_pattern_value_source, file: ^probe_kvn_pattern_value, supplied: kvn_pattern_value_stream()) +} + +test fn kvn_pattern_pun_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_pattern_pun_source, file: ^probe_kvn_pattern_pun, supplied: kvn_pattern_pun_stream()) +} + +test fn kvn_label_keywords_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_label_keywords_source, file: ^probe_kvn_label_keywords, supplied: kvn_label_keywords_stream()) +} + +test fn kvn_contextual_module_data_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_contextual_module_data_source, file: ^probe_kvn_contextual_module_data, supplied: kvn_contextual_module_data_stream()) +} + +test fn kvn_bool_literal_pattern_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_bool_literal_pattern_source, file: ^probe_kvn_bool_literal_pattern, supplied: kvn_bool_literal_pattern_stream()) +} + +test fn kvn_match_arm_true_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_match_arm_true_source, file: ^probe_kvn_match_arm_true, supplied: kvn_match_arm_true_stream()) +} + +test fn kvn_field_decl_label_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_field_decl_label_source, file: ^probe_kvn_field_decl_label, supplied: kvn_field_decl_label_stream()) +} + +test fn kvn_contextual_pattern_binder_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_contextual_pattern_binder_source, file: ^probe_kvn_contextual_pattern_binder, supplied: kvn_contextual_pattern_binder_stream()) +} + +fn kvn_let_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_let, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_let, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_let, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_let, start: 9, end: 10 }, + Token { class: ^dag_token_kw_fn, lexeme: "fn", file: ^probe_kvn_let, start: 11, end: 13 }, + Token { class: ^dag_token_ident, lexeme: "f", file: ^probe_kvn_let, start: 14, end: 15 }, + Token { class: ^dag_token_lparen, lexeme: "(", file: ^probe_kvn_let, start: 15, end: 16 }, + Token { class: ^dag_token_rparen, lexeme: ")", file: ^probe_kvn_let, start: 16, end: 17 }, + Token { class: ^dag_token_arrow, lexeme: "->", file: ^probe_kvn_let, start: 18, end: 20 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_let, start: 21, end: 24 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_let, start: 25, end: 26 }, + Token { class: ^dag_token_kw_let, lexeme: "let", file: ^probe_kvn_let, start: 29, end: 32 }, + Token { class: ^dag_token_kw_alias, lexeme: "alias", file: ^probe_kvn_let, start: 33, end: 38 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_let, start: 39, end: 40 }, + Token { class: ^dag_token_int_literal, lexeme: "1", file: ^probe_kvn_let, start: 41, end: 42 }, + Token { class: ^dag_token_int_literal, lexeme: "0", file: ^probe_kvn_let, start: 45, end: 46 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_let, start: 47, end: 48 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 29, gap_start: 26), token_start: 45, gap_start: 42), token_start: 47, gap_start: 46)) +} + +fn kvn_node_sugar_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_node_sugar, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_node_sugar, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_node_sugar, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_node_sugar, start: 9, end: 10 }, + Token { class: ^dag_token_kw_fn, lexeme: "fn", file: ^probe_kvn_node_sugar, start: 11, end: 13 }, + Token { class: ^dag_token_ident, lexeme: "f", file: ^probe_kvn_node_sugar, start: 14, end: 15 }, + Token { class: ^dag_token_lparen, lexeme: "(", file: ^probe_kvn_node_sugar, start: 15, end: 16 }, + Token { class: ^dag_token_rparen, lexeme: ")", file: ^probe_kvn_node_sugar, start: 16, end: 17 }, + Token { class: ^dag_token_arrow, lexeme: "->", file: ^probe_kvn_node_sugar, start: 18, end: 20 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_node_sugar, start: 21, end: 24 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_node_sugar, start: 25, end: 26 }, + Token { class: ^dag_token_ident, lexeme: "node", file: ^probe_kvn_node_sugar, start: 29, end: 33 }, + Token { class: ^dag_token_kw_then, lexeme: "then", file: ^probe_kvn_node_sugar, start: 34, end: 38 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_node_sugar, start: 39, end: 40 }, + Token { class: ^dag_token_int_literal, lexeme: "1", file: ^probe_kvn_node_sugar, start: 41, end: 42 }, + Token { class: ^dag_token_int_literal, lexeme: "0", file: ^probe_kvn_node_sugar, start: 45, end: 46 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_node_sugar, start: 47, end: 48 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 29, gap_start: 26), token_start: 45, gap_start: 42), token_start: 47, gap_start: 46)) +} + +fn kvn_bare_eq_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_bare_eq, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_bare_eq, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_bare_eq, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_bare_eq, start: 9, end: 10 }, + Token { class: ^dag_token_kw_fn, lexeme: "fn", file: ^probe_kvn_bare_eq, start: 11, end: 13 }, + Token { class: ^dag_token_ident, lexeme: "f", file: ^probe_kvn_bare_eq, start: 14, end: 15 }, + Token { class: ^dag_token_lparen, lexeme: "(", file: ^probe_kvn_bare_eq, start: 15, end: 16 }, + Token { class: ^dag_token_rparen, lexeme: ")", file: ^probe_kvn_bare_eq, start: 16, end: 17 }, + Token { class: ^dag_token_arrow, lexeme: "->", file: ^probe_kvn_bare_eq, start: 18, end: 20 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_bare_eq, start: 21, end: 24 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_bare_eq, start: 25, end: 26 }, + Token { class: ^dag_token_kw_loop, lexeme: "loop", file: ^probe_kvn_bare_eq, start: 29, end: 33 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_bare_eq, start: 34, end: 35 }, + Token { class: ^dag_token_int_literal, lexeme: "1", file: ^probe_kvn_bare_eq, start: 36, end: 37 }, + Token { class: ^dag_token_int_literal, lexeme: "0", file: ^probe_kvn_bare_eq, start: 40, end: 41 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_bare_eq, start: 42, end: 43 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 29, gap_start: 26), token_start: 40, gap_start: 37), token_start: 42, gap_start: 41)) +} + +fn kvn_pattern_value_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_pattern_value, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_pattern_value, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_pattern_value, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_pattern_value, start: 9, end: 10 }, + Token { class: ^dag_token_kw_data, lexeme: "data", file: ^probe_kvn_pattern_value, start: 11, end: 15 }, + Token { class: ^dag_token_ident, lexeme: "d", file: ^probe_kvn_pattern_value, start: 16, end: 17 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_pattern_value, start: 17, end: 18 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_pattern_value, start: 19, end: 22 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_pattern_value, start: 23, end: 24 }, + Token { class: ^dag_token_kw_match, lexeme: "match", file: ^probe_kvn_pattern_value, start: 25, end: 30 }, + Token { class: ^dag_token_ident, lexeme: "r", file: ^probe_kvn_pattern_value, start: 31, end: 32 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_pattern_value, start: 33, end: 34 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_pattern_value, start: 37, end: 38 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_pattern_value, start: 39, end: 40 }, + Token { class: ^dag_token_ident, lexeme: "a", file: ^probe_kvn_pattern_value, start: 41, end: 42 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_pattern_value, start: 42, end: 43 }, + Token { class: ^dag_token_kw_as, lexeme: "as", file: ^probe_kvn_pattern_value, start: 44, end: 46 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_pattern_value, start: 47, end: 48 }, + Token { class: ^dag_token_fat_arrow, lexeme: "=>", file: ^probe_kvn_pattern_value, start: 49, end: 51 }, + Token { class: ^dag_token_int_literal, lexeme: "0", file: ^probe_kvn_pattern_value, start: 52, end: 53 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_pattern_value, start: 54, end: 55 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 37, gap_start: 34), token_start: 54, gap_start: 53)) +} + +fn kvn_pattern_pun_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_pattern_pun, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_pattern_pun, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_pattern_pun, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_pattern_pun, start: 9, end: 10 }, + Token { class: ^dag_token_kw_data, lexeme: "data", file: ^probe_kvn_pattern_pun, start: 11, end: 15 }, + Token { class: ^dag_token_ident, lexeme: "d", file: ^probe_kvn_pattern_pun, start: 16, end: 17 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_pattern_pun, start: 17, end: 18 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_pattern_pun, start: 19, end: 22 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_pattern_pun, start: 23, end: 24 }, + Token { class: ^dag_token_kw_match, lexeme: "match", file: ^probe_kvn_pattern_pun, start: 25, end: 30 }, + Token { class: ^dag_token_ident, lexeme: "r", file: ^probe_kvn_pattern_pun, start: 31, end: 32 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_pattern_pun, start: 33, end: 34 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_pattern_pun, start: 37, end: 38 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_pattern_pun, start: 39, end: 40 }, + Token { class: ^dag_token_kw_then, lexeme: "then", file: ^probe_kvn_pattern_pun, start: 41, end: 45 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_pattern_pun, start: 46, end: 47 }, + Token { class: ^dag_token_fat_arrow, lexeme: "=>", file: ^probe_kvn_pattern_pun, start: 48, end: 50 }, + Token { class: ^dag_token_int_literal, lexeme: "0", file: ^probe_kvn_pattern_pun, start: 51, end: 52 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_pattern_pun, start: 53, end: 54 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 37, gap_start: 34), token_start: 53, gap_start: 52)) +} + +fn kvn_label_keywords_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_label_keywords, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_label_keywords, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_label_keywords, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_label_keywords, start: 9, end: 10 }, + Token { class: ^dag_token_kw_data, lexeme: "data", file: ^probe_kvn_label_keywords, start: 11, end: 15 }, + Token { class: ^dag_token_ident, lexeme: "d", file: ^probe_kvn_label_keywords, start: 16, end: 17 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_label_keywords, start: 17, end: 18 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_label_keywords, start: 19, end: 20 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_label_keywords, start: 21, end: 22 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_label_keywords, start: 23, end: 24 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_label_keywords, start: 25, end: 26 }, + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_label_keywords, start: 27, end: 33 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_label_keywords, start: 33, end: 34 }, + Token { class: ^dag_token_ident, lexeme: "r", file: ^probe_kvn_label_keywords, start: 35, end: 36 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_label_keywords, start: 36, end: 37 }, + Token { class: ^dag_token_kw_then, lexeme: "then", file: ^probe_kvn_label_keywords, start: 37, end: 41 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_label_keywords, start: 42, end: 43 } + ], layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10)) +} + +fn kvn_contextual_module_data_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_contextual_module_data, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_contextual_module_data, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_contextual_module_data, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_contextual_module_data, start: 9, end: 10 }, + Token { class: ^dag_token_kw_fn, lexeme: "fn", file: ^probe_kvn_contextual_module_data, start: 11, end: 13 }, + Token { class: ^dag_token_ident, lexeme: "f", file: ^probe_kvn_contextual_module_data, start: 14, end: 15 }, + Token { class: ^dag_token_lparen, lexeme: "(", file: ^probe_kvn_contextual_module_data, start: 15, end: 16 }, + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_contextual_module_data, start: 16, end: 22 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_contextual_module_data, start: 22, end: 23 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_contextual_module_data, start: 24, end: 27 }, + Token { class: ^dag_token_comma, lexeme: ",", file: ^probe_kvn_contextual_module_data, start: 27, end: 28 }, + Token { class: ^dag_token_kw_data, lexeme: "data", file: ^probe_kvn_contextual_module_data, start: 29, end: 33 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_contextual_module_data, start: 33, end: 34 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_contextual_module_data, start: 35, end: 38 }, + Token { class: ^dag_token_rparen, lexeme: ")", file: ^probe_kvn_contextual_module_data, start: 38, end: 39 }, + Token { class: ^dag_token_arrow, lexeme: "->", file: ^probe_kvn_contextual_module_data, start: 40, end: 42 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_contextual_module_data, start: 43, end: 46 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_contextual_module_data, start: 47, end: 48 }, + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_contextual_module_data, start: 51, end: 57 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_contextual_module_data, start: 58, end: 59 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 51, gap_start: 48), token_start: 58, gap_start: 57)) +} + +fn kvn_bool_literal_pattern_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_bool_literal_pattern, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_bool_literal_pattern, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_bool_literal_pattern, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_bool_literal_pattern, start: 9, end: 10 }, + Token { class: ^dag_token_kw_data, lexeme: "data", file: ^probe_kvn_bool_literal_pattern, start: 11, end: 15 }, + Token { class: ^dag_token_ident, lexeme: "d", file: ^probe_kvn_bool_literal_pattern, start: 16, end: 17 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_bool_literal_pattern, start: 17, end: 18 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_bool_literal_pattern, start: 19, end: 22 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_bool_literal_pattern, start: 23, end: 24 }, + Token { class: ^dag_token_kw_match, lexeme: "match", file: ^probe_kvn_bool_literal_pattern, start: 25, end: 30 }, + Token { class: ^dag_token_ident, lexeme: "r", file: ^probe_kvn_bool_literal_pattern, start: 31, end: 32 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_bool_literal_pattern, start: 33, end: 34 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_bool_literal_pattern, start: 37, end: 38 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_bool_literal_pattern, start: 39, end: 40 }, + Token { class: ^dag_token_ident, lexeme: "ok", file: ^probe_kvn_bool_literal_pattern, start: 41, end: 43 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_bool_literal_pattern, start: 43, end: 44 }, + Token { class: ^dag_token_kw_true, lexeme: "true", file: ^probe_kvn_bool_literal_pattern, start: 45, end: 49 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_bool_literal_pattern, start: 50, end: 51 }, + Token { class: ^dag_token_fat_arrow, lexeme: "=>", file: ^probe_kvn_bool_literal_pattern, start: 52, end: 54 }, + Token { class: ^dag_token_int_literal, lexeme: "0", file: ^probe_kvn_bool_literal_pattern, start: 55, end: 56 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_bool_literal_pattern, start: 57, end: 58 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 37, gap_start: 34), token_start: 57, gap_start: 56)) +} + +fn kvn_match_arm_true_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_match_arm_true, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_match_arm_true, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_match_arm_true, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_match_arm_true, start: 9, end: 10 }, + Token { class: ^dag_token_kw_data, lexeme: "data", file: ^probe_kvn_match_arm_true, start: 11, end: 15 }, + Token { class: ^dag_token_ident, lexeme: "d", file: ^probe_kvn_match_arm_true, start: 16, end: 17 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_match_arm_true, start: 17, end: 18 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_match_arm_true, start: 19, end: 22 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_match_arm_true, start: 23, end: 24 }, + Token { class: ^dag_token_kw_match, lexeme: "match", file: ^probe_kvn_match_arm_true, start: 25, end: 30 }, + Token { class: ^dag_token_ident, lexeme: "b", file: ^probe_kvn_match_arm_true, start: 31, end: 32 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_match_arm_true, start: 33, end: 34 }, + Token { class: ^dag_token_kw_true, lexeme: "true", file: ^probe_kvn_match_arm_true, start: 37, end: 41 }, + Token { class: ^dag_token_fat_arrow, lexeme: "=>", file: ^probe_kvn_match_arm_true, start: 42, end: 44 }, + Token { class: ^dag_token_int_literal, lexeme: "1", file: ^probe_kvn_match_arm_true, start: 45, end: 46 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_match_arm_true, start: 47, end: 48 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 37, gap_start: 34), token_start: 47, gap_start: 46)) +} + +fn kvn_field_decl_label_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_field_decl_label, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_field_decl_label, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_field_decl_label, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_field_decl_label, start: 9, end: 10 }, + Token { class: ^dag_token_kw_type, lexeme: "type", file: ^probe_kvn_field_decl_label, start: 11, end: 15 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_field_decl_label, start: 16, end: 17 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_field_decl_label, start: 18, end: 19 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_field_decl_label, start: 20, end: 21 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_field_decl_label, start: 22, end: 23 }, + Token { class: ^dag_token_kw_then, lexeme: "then", file: ^probe_kvn_field_decl_label, start: 24, end: 28 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_field_decl_label, start: 28, end: 29 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_field_decl_label, start: 30, end: 33 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_field_decl_label, start: 34, end: 35 } + ], layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10)) +} + +fn kvn_contextual_pattern_binder_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_contextual_pattern_binder, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_contextual_pattern_binder, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_contextual_pattern_binder, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_contextual_pattern_binder, start: 9, end: 10 }, + Token { class: ^dag_token_kw_data, lexeme: "data", file: ^probe_kvn_contextual_pattern_binder, start: 11, end: 15 }, + Token { class: ^dag_token_ident, lexeme: "d", file: ^probe_kvn_contextual_pattern_binder, start: 16, end: 17 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_contextual_pattern_binder, start: 17, end: 18 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_contextual_pattern_binder, start: 19, end: 22 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_contextual_pattern_binder, start: 23, end: 24 }, + Token { class: ^dag_token_kw_match, lexeme: "match", file: ^probe_kvn_contextual_pattern_binder, start: 25, end: 30 }, + Token { class: ^dag_token_ident, lexeme: "r", file: ^probe_kvn_contextual_pattern_binder, start: 31, end: 32 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_contextual_pattern_binder, start: 33, end: 34 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_contextual_pattern_binder, start: 37, end: 38 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_contextual_pattern_binder, start: 39, end: 40 }, + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_contextual_pattern_binder, start: 41, end: 47 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_contextual_pattern_binder, start: 47, end: 48 }, + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_contextual_pattern_binder, start: 49, end: 55 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_contextual_pattern_binder, start: 56, end: 57 }, + Token { class: ^dag_token_fat_arrow, lexeme: "=>", file: ^probe_kvn_contextual_pattern_binder, start: 58, end: 60 }, + Token { class: ^dag_token_int_literal, lexeme: "0", file: ^probe_kvn_contextual_pattern_binder, start: 61, end: 62 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_contextual_pattern_binder, start: 63, end: 64 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 37, gap_start: 34), token_start: 63, gap_start: 62)) +} + +test fn kvn_pattern_pun_true_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_pattern_pun_true_source, file: ^probe_kvn_pattern_pun_true, supplied: kvn_pattern_pun_true_stream()) +} + +test fn kvn_pattern_pun_false_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_pattern_pun_false_source, file: ^probe_kvn_pattern_pun_false, supplied: kvn_pattern_pun_false_stream()) +} + +test fn kvn_bool_label_stream_is_the_tokenizer_output_holds() -> Bool { + kvn_stream_matches_tokenize(text: kvn_bool_label_source, file: ^probe_kvn_bool_label, supplied: kvn_bool_label_stream()) +} + +fn kvn_pattern_pun_true_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_pattern_pun_true, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_pattern_pun_true, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_pattern_pun_true, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_pattern_pun_true, start: 9, end: 10 }, + Token { class: ^dag_token_kw_data, lexeme: "data", file: ^probe_kvn_pattern_pun_true, start: 11, end: 15 }, + Token { class: ^dag_token_ident, lexeme: "d", file: ^probe_kvn_pattern_pun_true, start: 16, end: 17 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_pattern_pun_true, start: 17, end: 18 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_pattern_pun_true, start: 19, end: 22 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_pattern_pun_true, start: 23, end: 24 }, + Token { class: ^dag_token_kw_match, lexeme: "match", file: ^probe_kvn_pattern_pun_true, start: 25, end: 30 }, + Token { class: ^dag_token_ident, lexeme: "r", file: ^probe_kvn_pattern_pun_true, start: 31, end: 32 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_pattern_pun_true, start: 33, end: 34 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_pattern_pun_true, start: 37, end: 38 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_pattern_pun_true, start: 39, end: 40 }, + Token { class: ^dag_token_kw_true, lexeme: "true", file: ^probe_kvn_pattern_pun_true, start: 41, end: 45 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_pattern_pun_true, start: 46, end: 47 }, + Token { class: ^dag_token_fat_arrow, lexeme: "=>", file: ^probe_kvn_pattern_pun_true, start: 48, end: 50 }, + Token { class: ^dag_token_int_literal, lexeme: "0", file: ^probe_kvn_pattern_pun_true, start: 51, end: 52 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_pattern_pun_true, start: 53, end: 54 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 37, gap_start: 34), token_start: 53, gap_start: 52)) +} + +fn kvn_pattern_pun_false_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_pattern_pun_false, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_pattern_pun_false, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_pattern_pun_false, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_pattern_pun_false, start: 9, end: 10 }, + Token { class: ^dag_token_kw_data, lexeme: "data", file: ^probe_kvn_pattern_pun_false, start: 11, end: 15 }, + Token { class: ^dag_token_ident, lexeme: "d", file: ^probe_kvn_pattern_pun_false, start: 16, end: 17 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_pattern_pun_false, start: 17, end: 18 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_pattern_pun_false, start: 19, end: 22 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_pattern_pun_false, start: 23, end: 24 }, + Token { class: ^dag_token_kw_match, lexeme: "match", file: ^probe_kvn_pattern_pun_false, start: 25, end: 30 }, + Token { class: ^dag_token_ident, lexeme: "r", file: ^probe_kvn_pattern_pun_false, start: 31, end: 32 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_pattern_pun_false, start: 33, end: 34 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_pattern_pun_false, start: 37, end: 38 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_pattern_pun_false, start: 39, end: 40 }, + Token { class: ^dag_token_kw_false, lexeme: "false", file: ^probe_kvn_pattern_pun_false, start: 41, end: 46 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_pattern_pun_false, start: 47, end: 48 }, + Token { class: ^dag_token_fat_arrow, lexeme: "=>", file: ^probe_kvn_pattern_pun_false, start: 49, end: 51 }, + Token { class: ^dag_token_int_literal, lexeme: "0", file: ^probe_kvn_pattern_pun_false, start: 52, end: 53 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_pattern_pun_false, start: 54, end: 55 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 37, gap_start: 34), token_start: 54, gap_start: 53)) +} + +fn kvn_bool_label_stream() -> TokenStream { + token_stream_lexed(all: [ + Token { class: ^dag_token_kw_module, lexeme: "module", file: ^probe_kvn_bool_label, start: 0, end: 6 }, + Token { class: ^dag_token_ident, lexeme: "m", file: ^probe_kvn_bool_label, start: 7, end: 8 }, + Token { class: ^dag_token_dot, lexeme: ".", file: ^probe_kvn_bool_label, start: 8, end: 9 }, + Token { class: ^dag_token_ident, lexeme: "t", file: ^probe_kvn_bool_label, start: 9, end: 10 }, + Token { class: ^dag_token_kw_data, lexeme: "data", file: ^probe_kvn_bool_label, start: 11, end: 15 }, + Token { class: ^dag_token_ident, lexeme: "d", file: ^probe_kvn_bool_label, start: 16, end: 17 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_bool_label, start: 17, end: 18 }, + Token { class: ^dag_token_ident, lexeme: "Int", file: ^probe_kvn_bool_label, start: 19, end: 22 }, + Token { class: ^dag_token_eq, lexeme: "=", file: ^probe_kvn_bool_label, start: 23, end: 24 }, + Token { class: ^dag_token_kw_match, lexeme: "match", file: ^probe_kvn_bool_label, start: 25, end: 30 }, + Token { class: ^dag_token_ident, lexeme: "r", file: ^probe_kvn_bool_label, start: 31, end: 32 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_bool_label, start: 33, end: 34 }, + Token { class: ^dag_token_ident, lexeme: "R", file: ^probe_kvn_bool_label, start: 37, end: 38 }, + Token { class: ^dag_token_lbrace, lexeme: "{", file: ^probe_kvn_bool_label, start: 39, end: 40 }, + Token { class: ^dag_token_kw_true, lexeme: "true", file: ^probe_kvn_bool_label, start: 41, end: 45 }, + Token { class: ^dag_token_colon, lexeme: ":", file: ^probe_kvn_bool_label, start: 45, end: 46 }, + Token { class: ^dag_token_ident, lexeme: "x", file: ^probe_kvn_bool_label, start: 47, end: 48 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_bool_label, start: 49, end: 50 }, + Token { class: ^dag_token_fat_arrow, lexeme: "=>", file: ^probe_kvn_bool_label, start: 51, end: 53 }, + Token { class: ^dag_token_int_literal, lexeme: "0", file: ^probe_kvn_bool_label, start: 54, end: 55 }, + Token { class: ^dag_token_rbrace, lexeme: "}", file: ^probe_kvn_bool_label, start: 56, end: 57 } + ], layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_with_break(layout: stream_layout_empty(), token_start: 11, gap_start: 10), token_start: 37, gap_start: 34), token_start: 56, gap_start: 55)) +} + diff --git a/src/v2/test/claim/parse/newline_dual_role_operator_mutation_test.dag b/src/v2/test/claim/parse/newline_dual_role_operator_mutation_test.dag index f80f794feb5..0501dd2fa9b 100644 --- a/src/v2/test/claim/parse/newline_dual_role_operator_mutation_test.dag +++ b/src/v2/test/claim/parse/newline_dual_role_operator_mutation_test.dag @@ -32,6 +32,7 @@ import v2.std.parse_refusal_reason { DataValueMissingAfterEq, FnExpressionBodyMissingAfterEq, KeywordAsPathSegment, + KeywordAsValueName, LayoutUnknownWithoutSource, NewlineBeforeDualRoleOperator, ParseRefusalReason @@ -96,6 +97,7 @@ fn is_newline_refusal(reason: ParseRefusalReason) -> Bool { KeywordAsPathSegment => false LetInExpressionDropped => false DeclarationMarkerNotTest => false + KeywordAsValueName => false TokenStartsNotIncreasing => false } } diff --git a/src/v2/test/claim/type_param_binder_frame_test.dag b/src/v2/test/claim/type_param_binder_frame_test.dag index 165cde8cd02..d7d9c5812ef 100644 --- a/src/v2/test/claim/type_param_binder_frame_test.dag +++ b/src/v2/test/claim/type_param_binder_frame_test.dag @@ -801,9 +801,9 @@ fn tpb_index_descends(target: Node) -> Bool { // wrapper, which keeps the binders -- and does descend into a member wrapper's member // (v2.compiler.symbol_index_fill symbol_index_declared), over supplied wrappers. test fn tpb_index_declares_no_member_under_an_alias() -> Bool { - let alias = type_alias_wrapper(binders: tpb_t_binders(), aliased: dag_type_atom_node(identity: ^T)) - !tpb_index_descends(target: alias) - && (symbol_index_declared(target: alias).bound == alias) + let alias_value = type_alias_wrapper(binders: tpb_t_binders(), aliased: dag_type_atom_node(identity: ^T)) + !tpb_index_descends(target: alias_value) + && (symbol_index_declared(target: alias_value).bound == alias_value) && !tpb_index_descends(target: type_opaque_wrapper(binders: tpb_t_binders())) && tpb_index_descends(target: tpb_box_member(with_params: true)) } diff --git a/src/v2/test/std_grounding/value_carrier_laws_test.dag b/src/v2/test/std_grounding/value_carrier_laws_test.dag index 1265318932c..9fcb366e856 100644 --- a/src/v2/test/std_grounding/value_carrier_laws_test.dag +++ b/src/v2/test/std_grounding/value_carrier_laws_test.dag @@ -30,8 +30,8 @@ test fn sharing_unobservable_list_holds() -> Bool { test fn sharing_unobservable_map_holds() -> Bool { let base = empty_map() |> map_insert("k", 1) - let alias = base - alias == (empty_map() |> map_insert("k", 1)) + let alias_value = base + alias_value == (empty_map() |> map_insert("k", 1)) } test fn map_equality_insert_order_independent_holds() -> Bool {