From 19ba7350bf8deced561d659978e871f7d9a2e700 Mon Sep 17 00:00:00 2001 From: Michael Podtserkovskii Date: Tue, 7 Oct 2025 22:14:19 +0100 Subject: [PATCH] Support enclosing ranges for Go snapshots --- bindings/go/scip/testutil/format.go | 66 +++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/bindings/go/scip/testutil/format.go b/bindings/go/scip/testutil/format.go index e51db03a..73e2d8bb 100644 --- a/bindings/go/scip/testutil/format.go +++ b/bindings/go/scip/testutil/format.go @@ -86,8 +86,31 @@ func FormatSnapshot( } return formatted } + enclosingRanges := enclosingRanges(document.Occurrences) + enclosingByStartLine := enclosingRangesByStartLine(enclosingRanges) + for _, ers := range enclosingByStartLine { + sort.SliceStable(ers, func(i, j int) bool { + return ers[i].Range.Start.Character < ers[j].Range.Start.Character + }) + } + enclosingByEndLine := enclosingRangesByEndLine(enclosingRanges) + for _, ers := range enclosingByStartLine { + sort.SliceStable(ers, func(i, j int) bool { + return ers[i].Range.End.Character < ers[j].Range.End.Character + }) + } i := 0 for lineNumber, line := range strings.Split(string(data), "\n") { + for _, er := range enclosingByStartLine[int32(lineNumber)] { + b.WriteString(commentSyntax) + for indent := int32(0); indent < er.Range.Start.Character; indent++ { + b.WriteRune(' ') + } + b.WriteString("⌄ enclosing_range_start ") + b.WriteString(formatSymbol(er.Symbol)) + b.WriteString("\n") + } + line = strings.TrimSuffix(line, "\r") b.WriteString(strings.Repeat(" ", len(commentSyntax))) b.WriteString(strings.ReplaceAll(line, "\t", " ")) @@ -166,6 +189,15 @@ func FormatSnapshot( b.WriteString("\n") i++ } + for _, er := range enclosingByEndLine[int32(lineNumber)] { + b.WriteString(commentSyntax) + for indent := int32(0); indent < er.Range.End.Character-1; indent++ { + b.WriteRune(' ') + } + b.WriteString("⌃ enclosing_range_end ") + b.WriteString(formatSymbol(er.Symbol)) + b.WriteString("\n") + } } return b.String(), formattingError } @@ -216,3 +248,37 @@ func isSCIPRangeLess(a []int32, b []int32) bool { } return false } + +type enclosingRange struct { + Range scip.Range + Symbol string +} + +func enclosingRanges(occurrences []*scip.Occurrence) []enclosingRange { + var enclosingRanges []enclosingRange + for _, occ := range occurrences { + if len(occ.EnclosingRange) > 0 { + enclosingRanges = append(enclosingRanges, enclosingRange{ + Range: scip.NewRangeUnchecked(occ.EnclosingRange), + Symbol: occ.Symbol, + }) + } + } + return enclosingRanges +} + +func enclosingRangesByStartLine(ranges []enclosingRange) map[int32][]enclosingRange { + result := map[int32][]enclosingRange{} + for _, r := range ranges { + result[r.Range.Start.Line] = append(result[r.Range.Start.Line], r) + } + return result +} + +func enclosingRangesByEndLine(ranges []enclosingRange) map[int32][]enclosingRange { + result := map[int32][]enclosingRange{} + for _, r := range ranges { + result[r.Range.End.Line] = append(result[r.Range.End.Line], r) + } + return result +}