Skip to content

Commit 75e68ad

Browse files
Support enclosing ranges for Go snapshots (#343)
1 parent a671e10 commit 75e68ad

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,21 @@ func FormatSnapshot(
8686
}
8787
return formatted
8888
}
89+
enclosingRanges := enclosingRanges(document.Occurrences)
90+
enclosingByStartLine := enclosingRangesByStartLine(enclosingRanges)
91+
enclosingByEndLine := enclosingRangesByEndLine(enclosingRanges)
8992
i := 0
9093
for lineNumber, line := range strings.Split(string(data), "\n") {
94+
for _, er := range enclosingByStartLine[int32(lineNumber)] {
95+
b.WriteString(commentSyntax)
96+
for indent := int32(0); indent < er.Range.Start.Character; indent++ {
97+
b.WriteRune(' ')
98+
}
99+
b.WriteString("⌄ enclosing_range_start ")
100+
b.WriteString(formatSymbol(er.Symbol))
101+
b.WriteString("\n")
102+
}
103+
91104
line = strings.TrimSuffix(line, "\r")
92105
b.WriteString(strings.Repeat(" ", len(commentSyntax)))
93106
b.WriteString(strings.ReplaceAll(line, "\t", " "))
@@ -166,6 +179,15 @@ func FormatSnapshot(
166179
b.WriteString("\n")
167180
i++
168181
}
182+
for _, er := range enclosingByEndLine[int32(lineNumber)] {
183+
b.WriteString(commentSyntax)
184+
for indent := int32(0); indent < er.Range.End.Character-1; indent++ {
185+
b.WriteRune(' ')
186+
}
187+
b.WriteString("⌃ enclosing_range_end ")
188+
b.WriteString(formatSymbol(er.Symbol))
189+
b.WriteString("\n")
190+
}
169191
}
170192
return b.String(), formattingError
171193
}
@@ -216,3 +238,47 @@ func isSCIPRangeLess(a []int32, b []int32) bool {
216238
}
217239
return false
218240
}
241+
242+
type enclosingRange struct {
243+
Range scip.Range
244+
Symbol string
245+
}
246+
247+
func enclosingRanges(occurrences []*scip.Occurrence) []enclosingRange {
248+
var enclosingRanges []enclosingRange
249+
for _, occ := range occurrences {
250+
if len(occ.EnclosingRange) > 0 {
251+
enclosingRanges = append(enclosingRanges, enclosingRange{
252+
Range: scip.NewRangeUnchecked(occ.EnclosingRange),
253+
Symbol: occ.Symbol,
254+
})
255+
}
256+
}
257+
return enclosingRanges
258+
}
259+
260+
func enclosingRangesByStartLine(ranges []enclosingRange) map[int32][]enclosingRange {
261+
result := map[int32][]enclosingRange{}
262+
for _, r := range ranges {
263+
result[r.Range.Start.Line] = append(result[r.Range.Start.Line], r)
264+
}
265+
for _, ers := range result {
266+
sort.SliceStable(ers, func(i, j int) bool {
267+
return ers[i].Range.Start.Character < ers[j].Range.Start.Character
268+
})
269+
}
270+
return result
271+
}
272+
273+
func enclosingRangesByEndLine(ranges []enclosingRange) map[int32][]enclosingRange {
274+
result := map[int32][]enclosingRange{}
275+
for _, r := range ranges {
276+
result[r.Range.End.Line] = append(result[r.Range.End.Line], r)
277+
}
278+
for _, ers := range result {
279+
sort.SliceStable(ers, func(i, j int) bool {
280+
return ers[i].Range.End.Character < ers[j].Range.End.Character
281+
})
282+
}
283+
return result
284+
}

0 commit comments

Comments
 (0)