diff --git a/internal/serialize/spans.go b/internal/serialize/spans.go index a2c5c2f4..ff0566c8 100644 --- a/internal/serialize/spans.go +++ b/internal/serialize/spans.go @@ -213,6 +213,8 @@ func BuildHighlightSpans(fileBytes []byte, actions []Action, side string, extraS lineMerged = append(lineMerged, curr) } + lineMerged = partitionLineSpans(lineMerged, side) + slices.SortFunc(lineMerged, func(a, b internalSpan) int { return cmp.Or( cmp.Compare(a.startCol, b.startCol), @@ -377,6 +379,125 @@ func nodeLen(a *Action, side string) int { return 0 } +// spanASTLength returns the AST byte range for a span on the given side. +// Falls back to column width when no AST node is attached so spans can still be compared. +func spanASTLength(sp internalSpan, side string) int { + if n := nodeLen(sp.actRef, side); n > 0 { + return n + } + return sp.endCol - sp.startCol +} + +// parseSpanActionPriority assigns tiebreaker priorities when two spans have identical AST lengths. +// Higher values win: move_update (5) > update (4) > move (3) > insert (2) > delete (1). +func parseSpanActionPriority(act string) int { + switch act { + case "move_update": + return 5 + case "update": + return 4 + case "move": + return 3 + case "insert": + return 2 + case "delete": + return 1 + default: + return 0 + } +} + +// partitionLineSpans resolves cross-action overlaps for a single line's spans. +func partitionLineSpans(spans []internalSpan, side string) []internalSpan { + if len(spans) <= 1 { + return spans + } + + var hasOverlap bool +checkOverlap: + for i := range len(spans) { + for j := i + 1; j < len(spans); j++ { + if spans[i].startCol < spans[j].endCol && spans[j].startCol < spans[i].endCol { + hasOverlap = true + break checkOverlap + } + } + } + if !hasOverlap { + return spans + } + + boundaries := make(map[int]struct{}) + for _, sp := range spans { + boundaries[sp.startCol] = struct{}{} + boundaries[sp.endCol] = struct{}{} + } + sortedBounds := slices.Sorted(maps.Keys(boundaries)) + + var segments []internalSpan + for i := range len(sortedBounds) - 1 { + segStart := sortedBounds[i] + segEnd := sortedBounds[i+1] + if segStart >= segEnd { + continue + } + + var ( + winner *internalSpan + hasMove bool + ) + for j := range spans { + sp := &spans[j] + if sp.startCol <= segStart && sp.endCol >= segEnd { + if sp.action == "move" { + hasMove = true + } + if winner == nil { + winner = sp + continue + } + wAstLen := spanASTLength(*winner, side) + sAstLen := spanASTLength(*sp, side) + candWidth := sp.endCol - sp.startCol + wCandWidth := winner.endCol - winner.startCol + if sAstLen < wAstLen || + (sAstLen == wAstLen && candWidth < wCandWidth) || + (sAstLen == wAstLen && candWidth == wCandWidth && parseSpanActionPriority(sp.action) > parseSpanActionPriority(winner.action)) { + winner = sp + } + } + } + if winner != nil { + action := winner.action + if action == "update" && hasMove { + action = "move_update" + } + segments = append(segments, internalSpan{ + startCol: segStart, + endCol: segEnd, + action: action, + actRef: winner.actRef, + }) + } + } + + if len(segments) == 0 { + return spans + } + var coalesced []internalSpan + cur := segments[0] + for i := 1; i < len(segments); i++ { + if segments[i].action == cur.action && segments[i].startCol == cur.endCol { + cur.endCol = segments[i].endCol + } else { + coalesced = append(coalesced, cur) + cur = segments[i] + } + } + coalesced = append(coalesced, cur) + return coalesced +} + // absorbSyntacticDelimiters expands a span to cover adjacent member connectors // (., ->, ::) or sequence commas so punctuation doesn't get left unhighlighted. func absorbSyntacticDelimiters(fileBytes []byte, startByte, endByte uint32, parent *NodeRef) (uint32, uint32) { diff --git a/internal/serialize/spans_test.go b/internal/serialize/spans_test.go index 4ac3c85d..8841fe80 100644 --- a/internal/serialize/spans_test.go +++ b/internal/serialize/spans_test.go @@ -90,6 +90,8 @@ func TestBuildHighlightSpansInnerSpanPreservation(t *testing.T) { fileBytes := []byte("def hello_world():\n") // Container delete covers 0..18 (astLen=18) // Inner delete covers 4..15 (astLen=11) + // Partitioner: inner wins [4,15), container gets [0,4) and [15,18). + // Same action coalesces → 1 span covering entire range. actions := []Action{ { Action: "delete", @@ -102,11 +104,15 @@ func TestBuildHighlightSpansInnerSpanPreservation(t *testing.T) { } leftSpans := BuildHighlightSpans(fileBytes, actions, "left") - if len(leftSpans) != 2 { - t.Fatalf("expected 2 delete spans (outer and inner preserved), got %d", len(leftSpans)) + if len(leftSpans) != 1 { + t.Fatalf("expected 1 coalesced delete span (same action merges), got %d: %+v", len(leftSpans), leftSpans) + } + if leftSpans[0].StartCol != 0 || leftSpans[0].EndCol != 18 { + t.Errorf("expected coalesced span [0,18), got [%d,%d)", leftSpans[0].StartCol, leftSpans[0].EndCol) } - // Also test when inner starts at same start col (e.g. 0..10 and 0..18) + // Also test when inner starts at same start col (e.g. 0..3 and 0..18) + // Partitioner: inner wins [0,3), outer wins [3,18), same action coalesces → 1 span actionsCoaligned := []Action{ { Action: "delete", @@ -119,8 +125,11 @@ func TestBuildHighlightSpansInnerSpanPreservation(t *testing.T) { } coalignedSpans := BuildHighlightSpans(fileBytes, actionsCoaligned, "left") - if len(coalignedSpans) != 2 { - t.Fatalf("expected 2 delete spans for coaligned start (inner 0..3 and outer 0..18), got %d", len(coalignedSpans)) + if len(coalignedSpans) != 1 { + t.Fatalf("expected 1 coalesced delete span for coaligned start, got %d: %+v", len(coalignedSpans), coalignedSpans) + } + if coalignedSpans[0].StartCol != 0 || coalignedSpans[0].EndCol != 18 { + t.Errorf("expected coalesced span [0,18), got [%d,%d)", coalignedSpans[0].StartCol, coalignedSpans[0].EndCol) } } @@ -447,3 +456,117 @@ func TestNestedMoveActionsKeepsOutermost(t *testing.T) { t.Fatal("expected outermost move span, got none") } } + +func TestPartitionDisjointSpans_MoveDeleteOverlap(t *testing.T) { + fileBytes := []byte("abcdef\n") + // move covers [0,6) astLen=6, delete covers [0,6) astLen=6 + // Same astLen → tiebreak by priority: move(3) > delete(2) → move wins entire range + actions := []Action{ + {Action: "move", Node: &NodeRef{Type: "stmt", StartByte: 0, EndByte: 6}}, + {Action: "delete", Node: &NodeRef{Type: "stmt", StartByte: 0, EndByte: 6}}, + } + spans := BuildHighlightSpans(fileBytes, actions, "left") + if len(spans) != 1 { + t.Fatalf("expected 1 span after partition, got %d: %+v", len(spans), spans) + } + if spans[0].Action != "move" { + t.Errorf("expected move to win tiebreak, got %s", spans[0].Action) + } +} + +func TestPartitionDisjointSpans_CoextensiveDuplicates(t *testing.T) { + fileBytes := []byte("hello world\n") + // Two identical delete spans on same bytes → inner (same astLen) wins, coalesces to 1 + actions := []Action{ + {Action: "delete", Node: &NodeRef{Type: "a", StartByte: 0, EndByte: 11}}, + {Action: "delete", Node: &NodeRef{Type: "b", StartByte: 0, EndByte: 11}}, + } + spans := BuildHighlightSpans(fileBytes, actions, "left") + if len(spans) != 1 { + t.Fatalf("expected 1 coalesced span for coextensive duplicates, got %d: %+v", len(spans), spans) + } +} + +func TestPartitionDisjointSpans_UpdateInsideMove(t *testing.T) { + fileBytes := []byte("abcdef\n") + // An update inside a move promotes to move_update, flanked by the outer move segments. + // [0,2) move, [2,4) move_update, [4,6) move. + actions := []Action{ + {Action: "move", Node: &NodeRef{Type: "stmt", StartByte: 0, EndByte: 6}}, + {Action: "update", Node: &NodeRef{Type: "id", StartByte: 2, EndByte: 4}}, + } + spans := BuildHighlightSpans(fileBytes, actions, "left") + if len(spans) != 3 { + t.Fatalf("expected 3 spans (move, move_update, move), got %d: %+v", len(spans), spans) + } + // Find the middle span + for _, s := range spans { + if s.StartCol == 2 && s.EndCol == 4 { + if s.Action != "move_update" { + t.Errorf("expected move_update for update inside move, got %s", s.Action) + } + return + } + } + t.Error("expected move_update span at [2,4)") +} + +func TestPartitionDisjointSpans_ThreeWayNesting(t *testing.T) { + fileBytes := []byte("0123456789abcdef\n") + // Three-way conflict: delete [0,16), move [0,16), and nested update [2,5). + // Move beats delete on tiebreak; update beats move on AST specificity and promotes to move_update. + actions := []Action{ + {Action: "delete", Node: &NodeRef{Type: "stmt", StartByte: 0, EndByte: 16}}, + {Action: "move", Node: &NodeRef{Type: "stmt", StartByte: 0, EndByte: 16}}, + {Action: "update", Node: &NodeRef{Type: "id", StartByte: 2, EndByte: 5}}, + } + spans := BuildHighlightSpans(fileBytes, actions, "left") + if len(spans) != 3 { + t.Fatalf("expected 3 disjoint spans, got %d: %+v", len(spans), spans) + } + // Verify update segment is promoted to moveUpdate (inside original move) + for _, s := range spans { + if s.StartCol == 2 && s.EndCol == 5 { + if s.Action != "move_update" { + t.Errorf("expected moveUpdate at [2,5) (inside move), got %s", s.Action) + } + return + } + } + t.Error("expected moveUpdate span at [2,5)") +} + +func TestPartitionDisjointSpans_NilActionRefFallback(t *testing.T) { + fileBytes := []byte("abcdef\n") + // move with ActionRef (astLen=6) vs nil-ActionRef delete (fallback=span width=6) + // Same astLen → tiebreak: move(3) > delete(2) → move wins + actions := []Action{ + {Action: "move", Node: &NodeRef{Type: "stmt", StartByte: 0, EndByte: 6}}, + {Action: "delete", Node: nil}, // nil Node → ActionRef will be nil on the span + } + spans := BuildHighlightSpans(fileBytes, actions, "left") + // The nil-Node delete won't produce a span at all (addSpan requires non-nil Node for delete) + // So only the move span survives + if len(spans) != 1 { + t.Fatalf("expected 1 span (nil-Node delete produces nothing), got %d: %+v", len(spans), spans) + } + if spans[0].Action != "move" { + t.Errorf("expected move, got %s", spans[0].Action) + } +} + +func TestPartitionDisjointSpans_DisjointSpansUnchanged(t *testing.T) { + fileBytes := []byte("hello world\n") + // Two non-overlapping spans → partitioner should not change them + actions := []Action{ + {Action: "delete", Node: &NodeRef{Type: "a", StartByte: 0, EndByte: 5}}, + {Action: "insert", Node: &NodeRef{Type: "b", StartByte: 6, EndByte: 11}}, + } + spans := BuildHighlightSpans(fileBytes, actions, "left") + if len(spans) != 1 { + t.Fatalf("expected 1 delete span (insert not on left), got %d: %+v", len(spans), spans) + } + if spans[0].StartCol != 0 || spans[0].EndCol != 5 || spans[0].Action != "delete" { + t.Errorf("expected delete [0,5), got %+v", spans[0]) + } +} diff --git a/tests/integration/pipeline_test.go b/tests/integration/pipeline_test.go index 0cab59e2..e26dafd2 100644 --- a/tests/integration/pipeline_test.go +++ b/tests/integration/pipeline_test.go @@ -334,6 +334,51 @@ func TestPipeline(t *testing.T) { } } +// TestNoOverlappingSpans verifies that highlight spans produced by BuildHighlightSpans +// are pairwise disjoint on every line: no two spans on the same line share any byte column. +func TestNoOverlappingSpans(t *testing.T) { + fixtures := allFixtures(t) + if len(fixtures) == 0 { + t.Fatal("no fixtures found in testdata/") + } + + for _, name := range fixtures { + t.Run(name, func(t *testing.T) { + t.Parallel() + f := loadFixture(t, name) + result := runPipeline(t, f) + + var uiEnv serialize.Envelope + if err := json.Unmarshal(result.UIJSON, &uiEnv); err != nil { + t.Fatalf("UI output is not valid JSON: %v", err) + } + + checkDisjoint := func(t *testing.T, spans []serialize.HighlightSpan, side string) { + t.Helper() + byLine := make(map[int][]serialize.HighlightSpan) + for _, s := range spans { + byLine[s.Line] = append(byLine[s.Line], s) + } + for line, ls := range byLine { + for i := 0; i < len(ls); i++ { + for j := i + 1; j < len(ls); j++ { + a, b := ls[i], ls[j] + if a.StartCol < b.EndCol && b.StartCol < a.EndCol { + t.Errorf("%s line %d: overlapping spans [%d,%d) %s and [%d,%d) %s", + side, line, a.StartCol, a.EndCol, a.Action, + b.StartCol, b.EndCol, b.Action) + } + } + } + } + } + + checkDisjoint(t, uiEnv.LeftHighlights, "left") + checkDisjoint(t, uiEnv.RightHighlights, "right") + }) + } +} + // TestPipelineIdenticalFiles checks that diffing a file against itself returns zero actions. func TestPipelineIdenticalFiles(t *testing.T) { fixtures := allFixtures(t) diff --git a/tests/testdata/c_curl_url_set_port/expected_ui.json.gz b/tests/testdata/c_curl_url_set_port/expected_ui.json.gz index 9dfa6ee9..e851b557 100644 Binary files a/tests/testdata/c_curl_url_set_port/expected_ui.json.gz and b/tests/testdata/c_curl_url_set_port/expected_ui.json.gz differ diff --git a/tests/testdata/c_git_strbuf_setlen/expected_ui.json.gz b/tests/testdata/c_git_strbuf_setlen/expected_ui.json.gz index dced1c31..39d36af2 100644 Binary files a/tests/testdata/c_git_strbuf_setlen/expected_ui.json.gz and b/tests/testdata/c_git_strbuf_setlen/expected_ui.json.gz differ diff --git a/tests/testdata/c_redis_adlist_insert/expected_ui.json.gz b/tests/testdata/c_redis_adlist_insert/expected_ui.json.gz index 63317a91..9c802dbe 100644 Binary files a/tests/testdata/c_redis_adlist_insert/expected_ui.json.gz and b/tests/testdata/c_redis_adlist_insert/expected_ui.json.gz differ diff --git a/tests/testdata/c_redis_crash_lua/expected_ui.json.gz b/tests/testdata/c_redis_crash_lua/expected_ui.json.gz index 6be58027..b15f4e3b 100644 Binary files a/tests/testdata/c_redis_crash_lua/expected_ui.json.gz and b/tests/testdata/c_redis_crash_lua/expected_ui.json.gz differ diff --git a/tests/testdata/c_redis_dict_resize/expected_ui.json.gz b/tests/testdata/c_redis_dict_resize/expected_ui.json.gz index 46fb5f21..3f6da618 100644 Binary files a/tests/testdata/c_redis_dict_resize/expected_ui.json.gz and b/tests/testdata/c_redis_dict_resize/expected_ui.json.gz differ diff --git a/tests/testdata/c_redis_quadratic_search/expected_ui.json.gz b/tests/testdata/c_redis_quadratic_search/expected_ui.json.gz index 17faf32f..328eceb1 100644 Binary files a/tests/testdata/c_redis_quadratic_search/expected_ui.json.gz and b/tests/testdata/c_redis_quadratic_search/expected_ui.json.gz differ diff --git a/tests/testdata/c_redis_use_after_free_handleclientsblockedonkey/expected_ui.json.gz b/tests/testdata/c_redis_use_after_free_handleclientsblockedonkey/expected_ui.json.gz index 4124efd7..62187f06 100644 Binary files a/tests/testdata/c_redis_use_after_free_handleclientsblockedonkey/expected_ui.json.gz and b/tests/testdata/c_redis_use_after_free_handleclientsblockedonkey/expected_ui.json.gz differ diff --git a/tests/testdata/cpp_pybind11_segfault_when_moving_scoped/expected_ui.json.gz b/tests/testdata/cpp_pybind11_segfault_when_moving_scoped/expected_ui.json.gz index 2a611cd1..e25d2550 100644 Binary files a/tests/testdata/cpp_pybind11_segfault_when_moving_scoped/expected_ui.json.gz and b/tests/testdata/cpp_pybind11_segfault_when_moving_scoped/expected_ui.json.gz differ diff --git a/tests/testdata/css_mdn_cool_info_box_styles/expected_ui.json.gz b/tests/testdata/css_mdn_cool_info_box_styles/expected_ui.json.gz index afeb3675..b933a8fd 100644 Binary files a/tests/testdata/css_mdn_cool_info_box_styles/expected_ui.json.gz and b/tests/testdata/css_mdn_cool_info_box_styles/expected_ui.json.gz differ diff --git a/tests/testdata/css_mdn_letterhead_paper_layout/expected_ui.json.gz b/tests/testdata/css_mdn_letterhead_paper_layout/expected_ui.json.gz index c623a33f..89a2cafa 100644 Binary files a/tests/testdata/css_mdn_letterhead_paper_layout/expected_ui.json.gz and b/tests/testdata/css_mdn_letterhead_paper_layout/expected_ui.json.gz differ diff --git a/tests/testdata/go_gin_fix_compile/expected_ui.json.gz b/tests/testdata/go_gin_fix_compile/expected_ui.json.gz index 5047308c..7fb41c90 100644 Binary files a/tests/testdata/go_gin_fix_compile/expected_ui.json.gz and b/tests/testdata/go_gin_fix_compile/expected_ui.json.gz differ diff --git a/tests/testdata/go_gin_fix_corrupted/expected_ui.json.gz b/tests/testdata/go_gin_fix_corrupted/expected_ui.json.gz index cdfd619c..cb5d34d6 100644 Binary files a/tests/testdata/go_gin_fix_corrupted/expected_ui.json.gz and b/tests/testdata/go_gin_fix_corrupted/expected_ui.json.gz differ diff --git a/tests/testdata/go_gin_fix_golint/expected_ui.json.gz b/tests/testdata/go_gin_fix_golint/expected_ui.json.gz index 5e151daf..6b8f058f 100644 Binary files a/tests/testdata/go_gin_fix_golint/expected_ui.json.gz and b/tests/testdata/go_gin_fix_golint/expected_ui.json.gz differ diff --git a/tests/testdata/go_gin_fixes_http/expected_ui.json.gz b/tests/testdata/go_gin_fixes_http/expected_ui.json.gz index 817d2bf1..57b94b7f 100644 Binary files a/tests/testdata/go_gin_fixes_http/expected_ui.json.gz and b/tests/testdata/go_gin_fixes_http/expected_ui.json.gz differ diff --git a/tests/testdata/go_gin_prevent_flush/expected_ui.json.gz b/tests/testdata/go_gin_prevent_flush/expected_ui.json.gz index 3a6fe8dd..8bd5c745 100644 Binary files a/tests/testdata/go_gin_prevent_flush/expected_ui.json.gz and b/tests/testdata/go_gin_prevent_flush/expected_ui.json.gz differ diff --git a/tests/testdata/go_gin_using_keyed/expected_ui.json.gz b/tests/testdata/go_gin_using_keyed/expected_ui.json.gz index 730cc4fc..87a6e859 100644 Binary files a/tests/testdata/go_gin_using_keyed/expected_ui.json.gz and b/tests/testdata/go_gin_using_keyed/expected_ui.json.gz differ diff --git a/tests/testdata/html_mdn_splash_page_markup/expected_ui.json.gz b/tests/testdata/html_mdn_splash_page_markup/expected_ui.json.gz index 48a9f05a..97e0b440 100644 Binary files a/tests/testdata/html_mdn_splash_page_markup/expected_ui.json.gz and b/tests/testdata/html_mdn_splash_page_markup/expected_ui.json.gz differ diff --git a/tests/testdata/html_mdn_website_structure_layout/expected_ui.json.gz b/tests/testdata/html_mdn_website_structure_layout/expected_ui.json.gz index c0f7c588..4f284ec2 100644 Binary files a/tests/testdata/html_mdn_website_structure_layout/expected_ui.json.gz and b/tests/testdata/html_mdn_website_structure_layout/expected_ui.json.gz differ diff --git a/tests/testdata/java_commons_lang_overflow_bound_direction/expected_ui.json.gz b/tests/testdata/java_commons_lang_overflow_bound_direction/expected_ui.json.gz index 11f178b2..afb285be 100644 Binary files a/tests/testdata/java_commons_lang_overflow_bound_direction/expected_ui.json.gz and b/tests/testdata/java_commons_lang_overflow_bound_direction/expected_ui.json.gz differ diff --git a/tests/testdata/java_commons_lang_reject_non_ascii/expected_ui.json.gz b/tests/testdata/java_commons_lang_reject_non_ascii/expected_ui.json.gz index 98fd1974..2e9bd60c 100644 Binary files a/tests/testdata/java_commons_lang_reject_non_ascii/expected_ui.json.gz and b/tests/testdata/java_commons_lang_reject_non_ascii/expected_ui.json.gz differ diff --git a/tests/testdata/java_commons_lang_simplify_abstractreflection_setaccessible/expected_ui.json.gz b/tests/testdata/java_commons_lang_simplify_abstractreflection_setaccessible/expected_ui.json.gz index f01eac5d..35e95fd8 100644 Binary files a/tests/testdata/java_commons_lang_simplify_abstractreflection_setaccessible/expected_ui.json.gz and b/tests/testdata/java_commons_lang_simplify_abstractreflection_setaccessible/expected_ui.json.gz differ diff --git a/tests/testdata/java_commons_lang_simplify_instants_tomillissince/expected_ui.json.gz b/tests/testdata/java_commons_lang_simplify_instants_tomillissince/expected_ui.json.gz index dac3fde4..a53ef8af 100644 Binary files a/tests/testdata/java_commons_lang_simplify_instants_tomillissince/expected_ui.json.gz and b/tests/testdata/java_commons_lang_simplify_instants_tomillissince/expected_ui.json.gz differ diff --git a/tests/testdata/java_jackson_core_handle_issue_releasing/expected_ui.json.gz b/tests/testdata/java_jackson_core_handle_issue_releasing/expected_ui.json.gz index 047a9d02..85031763 100644 Binary files a/tests/testdata/java_jackson_core_handle_issue_releasing/expected_ui.json.gz and b/tests/testdata/java_jackson_core_handle_issue_releasing/expected_ui.json.gz differ diff --git a/tests/testdata/java_mockito_non_deterministic_assertionerror/expected_ui.json.gz b/tests/testdata/java_mockito_non_deterministic_assertionerror/expected_ui.json.gz index 3e8a290f..9104e877 100644 Binary files a/tests/testdata/java_mockito_non_deterministic_assertionerror/expected_ui.json.gz and b/tests/testdata/java_mockito_non_deterministic_assertionerror/expected_ui.json.gz differ diff --git a/tests/testdata/json_schemastore_cargo_workspace_members/expected_ui.json.gz b/tests/testdata/json_schemastore_cargo_workspace_members/expected_ui.json.gz index 03e5272f..8884655f 100644 Binary files a/tests/testdata/json_schemastore_cargo_workspace_members/expected_ui.json.gz and b/tests/testdata/json_schemastore_cargo_workspace_members/expected_ui.json.gz differ diff --git a/tests/testdata/json_schemastore_hugo_theme_config/expected_ui.json.gz b/tests/testdata/json_schemastore_hugo_theme_config/expected_ui.json.gz index fa957b88..97dfe5cb 100644 Binary files a/tests/testdata/json_schemastore_hugo_theme_config/expected_ui.json.gz and b/tests/testdata/json_schemastore_hugo_theme_config/expected_ui.json.gz differ diff --git a/tests/testdata/json_schemastore_tox_env_configuration/expected_ui.json.gz b/tests/testdata/json_schemastore_tox_env_configuration/expected_ui.json.gz index 0801ebf8..d790e6c8 100644 Binary files a/tests/testdata/json_schemastore_tox_env_configuration/expected_ui.json.gz and b/tests/testdata/json_schemastore_tox_env_configuration/expected_ui.json.gz differ diff --git a/tests/testdata/json_schemastore_uv_pip_settings/expected_ui.json.gz b/tests/testdata/json_schemastore_uv_pip_settings/expected_ui.json.gz index 72d30e63..a3005f95 100644 Binary files a/tests/testdata/json_schemastore_uv_pip_settings/expected_ui.json.gz and b/tests/testdata/json_schemastore_uv_pip_settings/expected_ui.json.gz differ diff --git a/tests/testdata/jsx_react_test_add/expected_ui.json.gz b/tests/testdata/jsx_react_test_add/expected_ui.json.gz index 25793aa9..253b634e 100644 Binary files a/tests/testdata/jsx_react_test_add/expected_ui.json.gz and b/tests/testdata/jsx_react_test_add/expected_ui.json.gz differ diff --git a/tests/testdata/lua_kong_add_missing_select/expected_ui.json.gz b/tests/testdata/lua_kong_add_missing_select/expected_ui.json.gz index 03dc151d..788bba36 100644 Binary files a/tests/testdata/lua_kong_add_missing_select/expected_ui.json.gz and b/tests/testdata/lua_kong_add_missing_select/expected_ui.json.gz differ diff --git a/tests/testdata/lua_kong_check_timer_return/expected_ui.json.gz b/tests/testdata/lua_kong_check_timer_return/expected_ui.json.gz index 4ff8ca21..68e16421 100644 Binary files a/tests/testdata/lua_kong_check_timer_return/expected_ui.json.gz and b/tests/testdata/lua_kong_check_timer_return/expected_ui.json.gz differ diff --git a/tests/testdata/lua_kong_dp_status_ready_rpc/expected_ui.json.gz b/tests/testdata/lua_kong_dp_status_ready_rpc/expected_ui.json.gz index 0badfeb2..13c44c25 100644 Binary files a/tests/testdata/lua_kong_dp_status_ready_rpc/expected_ui.json.gz and b/tests/testdata/lua_kong_dp_status_ready_rpc/expected_ui.json.gz differ diff --git a/tests/testdata/lua_kong_enable_rpc_sync_tests/expected_ui.json.gz b/tests/testdata/lua_kong_enable_rpc_sync_tests/expected_ui.json.gz index 8d457e7c..788faa7b 100644 Binary files a/tests/testdata/lua_kong_enable_rpc_sync_tests/expected_ui.json.gz and b/tests/testdata/lua_kong_enable_rpc_sync_tests/expected_ui.json.gz differ diff --git a/tests/testdata/lua_kong_sync_retry_timeout/expected_ui.json.gz b/tests/testdata/lua_kong_sync_retry_timeout/expected_ui.json.gz index 0e4c9f7e..ff559878 100644 Binary files a/tests/testdata/lua_kong_sync_retry_timeout/expected_ui.json.gz and b/tests/testdata/lua_kong_sync_retry_timeout/expected_ui.json.gz differ diff --git a/tests/testdata/lua_neovim_dir_spec_change/expected_ui.json.gz b/tests/testdata/lua_neovim_dir_spec_change/expected_ui.json.gz index de4df906..b5b8f997 100644 Binary files a/tests/testdata/lua_neovim_dir_spec_change/expected_ui.json.gz and b/tests/testdata/lua_neovim_dir_spec_change/expected_ui.json.gz differ diff --git a/tests/testdata/lua_neovim_fs_api_refactor/expected_ui.json.gz b/tests/testdata/lua_neovim_fs_api_refactor/expected_ui.json.gz index 2a76ccf5..c60f105a 100644 Binary files a/tests/testdata/lua_neovim_fs_api_refactor/expected_ui.json.gz and b/tests/testdata/lua_neovim_fs_api_refactor/expected_ui.json.gz differ diff --git a/tests/testdata/lua_neovim_gen_help_html_change/expected_ui.json.gz b/tests/testdata/lua_neovim_gen_help_html_change/expected_ui.json.gz index 1c5e8afd..88e7fceb 100644 Binary files a/tests/testdata/lua_neovim_gen_help_html_change/expected_ui.json.gz and b/tests/testdata/lua_neovim_gen_help_html_change/expected_ui.json.gz differ diff --git a/tests/testdata/lua_neovim_write_spec_refactor/expected_ui.json.gz b/tests/testdata/lua_neovim_write_spec_refactor/expected_ui.json.gz index 509f068d..3e5e7697 100644 Binary files a/tests/testdata/lua_neovim_write_spec_refactor/expected_ui.json.gz and b/tests/testdata/lua_neovim_write_spec_refactor/expected_ui.json.gz differ diff --git a/tests/testdata/lua_neovim_zip_spec_change/expected_ui.json.gz b/tests/testdata/lua_neovim_zip_spec_change/expected_ui.json.gz index a1feeafe..5069ab50 100644 Binary files a/tests/testdata/lua_neovim_zip_spec_change/expected_ui.json.gz and b/tests/testdata/lua_neovim_zip_spec_change/expected_ui.json.gz differ diff --git a/tests/testdata/php_guzzle_handler_curl_multi/expected_ui.json.gz b/tests/testdata/php_guzzle_handler_curl_multi/expected_ui.json.gz index 0eb2110b..2a6df2af 100644 Binary files a/tests/testdata/php_guzzle_handler_curl_multi/expected_ui.json.gz and b/tests/testdata/php_guzzle_handler_curl_multi/expected_ui.json.gz differ diff --git a/tests/testdata/php_guzzle_response_status_reason/expected_ui.json.gz b/tests/testdata/php_guzzle_response_status_reason/expected_ui.json.gz index 96989c4d..b402d52a 100644 Binary files a/tests/testdata/php_guzzle_response_status_reason/expected_ui.json.gz and b/tests/testdata/php_guzzle_response_status_reason/expected_ui.json.gz differ diff --git a/tests/testdata/php_uuid_builder_fallback_factory/expected_ui.json.gz b/tests/testdata/php_uuid_builder_fallback_factory/expected_ui.json.gz index e91df5d8..155d5308 100644 Binary files a/tests/testdata/php_uuid_builder_fallback_factory/expected_ui.json.gz and b/tests/testdata/php_uuid_builder_fallback_factory/expected_ui.json.gz differ diff --git a/tests/testdata/php_uuid_guid_fields_extract/expected_ui.json.gz b/tests/testdata/php_uuid_guid_fields_extract/expected_ui.json.gz index d83b9c38..829cd8a1 100644 Binary files a/tests/testdata/php_uuid_guid_fields_extract/expected_ui.json.gz and b/tests/testdata/php_uuid_guid_fields_extract/expected_ui.json.gz differ diff --git a/tests/testdata/py_requests_prevent_response/expected_ui.json.gz b/tests/testdata/py_requests_prevent_response/expected_ui.json.gz index 7921df72..f02f6fe8 100644 Binary files a/tests/testdata/py_requests_prevent_response/expected_ui.json.gz and b/tests/testdata/py_requests_prevent_response/expected_ui.json.gz differ diff --git a/tests/testdata/py_requests_refactor_prefer/expected_ui.json.gz b/tests/testdata/py_requests_refactor_prefer/expected_ui.json.gz index 83584cbd..b6fc6c9a 100644 Binary files a/tests/testdata/py_requests_refactor_prefer/expected_ui.json.gz and b/tests/testdata/py_requests_refactor_prefer/expected_ui.json.gz differ diff --git a/tests/testdata/ruby_sinatra_add_regression_test_for_conten_2/expected_ui.json.gz b/tests/testdata/ruby_sinatra_add_regression_test_for_conten_2/expected_ui.json.gz index f68455b5..ee7219e0 100644 Binary files a/tests/testdata/ruby_sinatra_add_regression_test_for_conten_2/expected_ui.json.gz and b/tests/testdata/ruby_sinatra_add_regression_test_for_conten_2/expected_ui.json.gz differ diff --git a/tests/testdata/ruby_sinatra_fix_ci_failures_15/expected_ui.json.gz b/tests/testdata/ruby_sinatra_fix_ci_failures_15/expected_ui.json.gz index ce66527d..fd2e2a11 100644 Binary files a/tests/testdata/ruby_sinatra_fix_ci_failures_15/expected_ui.json.gz and b/tests/testdata/ruby_sinatra_fix_ci_failures_15/expected_ui.json.gz differ diff --git a/tests/testdata/ruby_sinatra_fix_proc_template_memory_leak_9/expected_ui.json.gz b/tests/testdata/ruby_sinatra_fix_proc_template_memory_leak_9/expected_ui.json.gz index 9f14dfc1..5844c038 100644 Binary files a/tests/testdata/ruby_sinatra_fix_proc_template_memory_leak_9/expected_ui.json.gz and b/tests/testdata/ruby_sinatra_fix_proc_template_memory_leak_9/expected_ui.json.gz differ diff --git a/tests/testdata/ruby_sinatra_use_exception_detailed_message_10/expected_ui.json.gz b/tests/testdata/ruby_sinatra_use_exception_detailed_message_10/expected_ui.json.gz index e3dc97ad..c6e157fd 100644 Binary files a/tests/testdata/ruby_sinatra_use_exception_detailed_message_10/expected_ui.json.gz and b/tests/testdata/ruby_sinatra_use_exception_detailed_message_10/expected_ui.json.gz differ diff --git a/tests/testdata/rust_tokio_task_stacked_borrows/expected_ui.json.gz b/tests/testdata/rust_tokio_task_stacked_borrows/expected_ui.json.gz index ca3eb4a2..97827382 100644 Binary files a/tests/testdata/rust_tokio_task_stacked_borrows/expected_ui.json.gz and b/tests/testdata/rust_tokio_task_stacked_borrows/expected_ui.json.gz differ diff --git a/tests/testdata/rust_tokio_time_loom_test/expected_ui.json.gz b/tests/testdata/rust_tokio_time_loom_test/expected_ui.json.gz index 90c9a877..130c99d8 100644 Binary files a/tests/testdata/rust_tokio_time_loom_test/expected_ui.json.gz and b/tests/testdata/rust_tokio_time_loom_test/expected_ui.json.gz differ diff --git a/tests/testdata/toml_poetry_dependencies_and_warnings/expected_ui.json.gz b/tests/testdata/toml_poetry_dependencies_and_warnings/expected_ui.json.gz index f8648e98..5849a604 100644 Binary files a/tests/testdata/toml_poetry_dependencies_and_warnings/expected_ui.json.gz and b/tests/testdata/toml_poetry_dependencies_and_warnings/expected_ui.json.gz differ diff --git a/tests/testdata/toml_poetry_tests_replace_with/expected_ui.json.gz b/tests/testdata/toml_poetry_tests_replace_with/expected_ui.json.gz index 659096e3..b025ffdc 100644 Binary files a/tests/testdata/toml_poetry_tests_replace_with/expected_ui.json.gz and b/tests/testdata/toml_poetry_tests_replace_with/expected_ui.json.gz differ diff --git a/tests/testdata/toml_schemastore_schema/expected_ui.json.gz b/tests/testdata/toml_schemastore_schema/expected_ui.json.gz index 80d0ee14..74a04a9c 100644 Binary files a/tests/testdata/toml_schemastore_schema/expected_ui.json.gz and b/tests/testdata/toml_schemastore_schema/expected_ui.json.gz differ diff --git a/tests/testdata/ts_zod_improve_mini/expected_ui.json.gz b/tests/testdata/ts_zod_improve_mini/expected_ui.json.gz index e7b4102b..9fdd3cd5 100644 Binary files a/tests/testdata/ts_zod_improve_mini/expected_ui.json.gz and b/tests/testdata/ts_zod_improve_mini/expected_ui.json.gz differ diff --git a/tests/testdata/yaml_k8s_examples_flower_scalar_controller/expected_ui.json.gz b/tests/testdata/yaml_k8s_examples_flower_scalar_controller/expected_ui.json.gz index fb02041a..20c8ddeb 100644 Binary files a/tests/testdata/yaml_k8s_examples_flower_scalar_controller/expected_ui.json.gz and b/tests/testdata/yaml_k8s_examples_flower_scalar_controller/expected_ui.json.gz differ diff --git a/tests/testdata/yaml_k8s_examples_persistentvolume_nfs/expected_ui.json.gz b/tests/testdata/yaml_k8s_examples_persistentvolume_nfs/expected_ui.json.gz index b2404e64..5ed33af7 100644 Binary files a/tests/testdata/yaml_k8s_examples_persistentvolume_nfs/expected_ui.json.gz and b/tests/testdata/yaml_k8s_examples_persistentvolume_nfs/expected_ui.json.gz differ diff --git a/tests/testdata/yaml_microservices_skaffold_pipeline_refactor/expected_ui.json.gz b/tests/testdata/yaml_microservices_skaffold_pipeline_refactor/expected_ui.json.gz index 1d0b0e5a..2d5d1028 100644 Binary files a/tests/testdata/yaml_microservices_skaffold_pipeline_refactor/expected_ui.json.gz and b/tests/testdata/yaml_microservices_skaffold_pipeline_refactor/expected_ui.json.gz differ diff --git a/tests/testdata/zig_clap_more_than_2/expected_ui.json.gz b/tests/testdata/zig_clap_more_than_2/expected_ui.json.gz index 0339f0ca..5e4882b4 100644 Binary files a/tests/testdata/zig_clap_more_than_2/expected_ui.json.gz and b/tests/testdata/zig_clap_more_than_2/expected_ui.json.gz differ diff --git a/tests/testdata/zig_clap_new_struct_tuple/expected_ui.json.gz b/tests/testdata/zig_clap_new_struct_tuple/expected_ui.json.gz index bd24aad9..9b11785e 100644 Binary files a/tests/testdata/zig_clap_new_struct_tuple/expected_ui.json.gz and b/tests/testdata/zig_clap_new_struct_tuple/expected_ui.json.gz differ diff --git a/tests/testdata/zig_clap_short_only_params/expected_ui.json.gz b/tests/testdata/zig_clap_short_only_params/expected_ui.json.gz index eeb85106..11db1e32 100644 Binary files a/tests/testdata/zig_clap_short_only_params/expected_ui.json.gz and b/tests/testdata/zig_clap_short_only_params/expected_ui.json.gz differ diff --git a/tests/testdata/zig_zls_build_build_gen/expected_ui.json.gz b/tests/testdata/zig_zls_build_build_gen/expected_ui.json.gz index 2fde0026..0b86e7a4 100644 Binary files a/tests/testdata/zig_zls_build_build_gen/expected_ui.json.gz and b/tests/testdata/zig_zls_build_build_gen/expected_ui.json.gz differ diff --git a/tests/testdata/zig_zls_build_log_warning/expected_ui.json.gz b/tests/testdata/zig_zls_build_log_warning/expected_ui.json.gz index 4fb93ce6..40f33d60 100644 Binary files a/tests/testdata/zig_zls_build_log_warning/expected_ui.json.gz and b/tests/testdata/zig_zls_build_log_warning/expected_ui.json.gz differ diff --git a/tests/testdata/zig_zls_unused_argument_error/expected_ui.json.gz b/tests/testdata/zig_zls_unused_argument_error/expected_ui.json.gz index 78be24ba..4e116b41 100644 Binary files a/tests/testdata/zig_zls_unused_argument_error/expected_ui.json.gz and b/tests/testdata/zig_zls_unused_argument_error/expected_ui.json.gz differ