Skip to content

Commit 19ba735

Browse files
Support enclosing ranges for Go snapshots
1 parent a671e10 commit 19ba735

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

bindings/go/scip/testutil/format.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,31 @@ func FormatSnapshot(
8686
}
8787
return formatted
8888
}
89+
enclosingRanges := enclosingRanges(document.Occurrences)
90+
enclosingByStartLine := enclosingRangesByStartLine(enclosingRanges)
91+
for _, ers := range enclosingByStartLine {
92+
sort.SliceStable(ers, func(i, j int) bool {
93+
return ers[i].Range.Start.Character < ers[j].Range.Start.Character
94+
})
95+
}
96+
enclosingByEndLine := enclosingRangesByEndLine(enclosingRanges)
97+
for _, ers := range enclosingByStartLine {
98+
sort.SliceStable(ers, func(i, j int) bool {
99+
return ers[i].Range.End.Character < ers[j].Range.End.Character
100+
})
101+
}
89102
i := 0
90103
for lineNumber, line := range strings.Split(string(data), "\n") {
104+
for _, er := range enclosingByStartLine[int32(lineNumber)] {
105+
b.WriteString(commentSyntax)
106+
for indent := int32(0); indent < er.Range.Start.Character; indent++ {
107+
b.WriteRune(' ')
108+
}
109+
b.WriteString("⌄ enclosing_range_start ")
110+
b.WriteString(formatSymbol(er.Symbol))
111+
b.WriteString("\n")
112+
}
113+
91114
line = strings.TrimSuffix(line, "\r")
92115
b.WriteString(strings.Repeat(" ", len(commentSyntax)))
93116
b.WriteString(strings.ReplaceAll(line, "\t", " "))
@@ -166,6 +189,15 @@ func FormatSnapshot(
166189
b.WriteString("\n")
167190
i++
168191
}
192+
for _, er := range enclosingByEndLine[int32(lineNumber)] {
193+
b.WriteString(commentSyntax)
194+
for indent := int32(0); indent < er.Range.End.Character-1; indent++ {
195+
b.WriteRune(' ')
196+
}
197+
b.WriteString("⌃ enclosing_range_end ")
198+
b.WriteString(formatSymbol(er.Symbol))
199+
b.WriteString("\n")
200+
}
169201
}
170202
return b.String(), formattingError
171203
}
@@ -216,3 +248,37 @@ func isSCIPRangeLess(a []int32, b []int32) bool {
216248
}
217249
return false
218250
}
251+
252+
type enclosingRange struct {
253+
Range scip.Range
254+
Symbol string
255+
}
256+
257+
func enclosingRanges(occurrences []*scip.Occurrence) []enclosingRange {
258+
var enclosingRanges []enclosingRange
259+
for _, occ := range occurrences {
260+
if len(occ.EnclosingRange) > 0 {
261+
enclosingRanges = append(enclosingRanges, enclosingRange{
262+
Range: scip.NewRangeUnchecked(occ.EnclosingRange),
263+
Symbol: occ.Symbol,
264+
})
265+
}
266+
}
267+
return enclosingRanges
268+
}
269+
270+
func enclosingRangesByStartLine(ranges []enclosingRange) map[int32][]enclosingRange {
271+
result := map[int32][]enclosingRange{}
272+
for _, r := range ranges {
273+
result[r.Range.Start.Line] = append(result[r.Range.Start.Line], r)
274+
}
275+
return result
276+
}
277+
278+
func enclosingRangesByEndLine(ranges []enclosingRange) map[int32][]enclosingRange {
279+
result := map[int32][]enclosingRange{}
280+
for _, r := range ranges {
281+
result[r.Range.End.Line] = append(result[r.Range.End.Line], r)
282+
}
283+
return result
284+
}

0 commit comments

Comments
 (0)