Skip to content

Commit a075e78

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

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

bindings/go/scip/testutil/format.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,24 @@ func FormatSnapshot(
8686
}
8787
return formatted
8888
}
89+
enclosingRanges := enclosingRanges(document.Occurrences)
90+
sort.SliceStable(enclosingRanges, func(i, j int) bool {
91+
return isSCIPRangeLess(enclosingRanges[i].Range.SCIPRange(), enclosingRanges[j].Range.SCIPRange())
92+
})
93+
enclosingByStartLine := enclosingRangesByStartLine(enclosingRanges)
94+
enclosingByEndLine := enclosingRangesByEndLine(enclosingRanges)
8995
i := 0
9096
for lineNumber, line := range strings.Split(string(data), "\n") {
97+
for _, er := range enclosingByStartLine[int32(lineNumber)] {
98+
b.WriteString(commentSyntax)
99+
for indent := int32(0); indent < er.Range.Start.Character; indent++ {
100+
b.WriteRune(' ')
101+
}
102+
b.WriteString("⌄ enclosing_range_start ")
103+
b.WriteString(formatSymbol(er.Symbol))
104+
b.WriteString("\n")
105+
}
106+
91107
line = strings.TrimSuffix(line, "\r")
92108
b.WriteString(strings.Repeat(" ", len(commentSyntax)))
93109
b.WriteString(strings.ReplaceAll(line, "\t", " "))
@@ -166,6 +182,15 @@ func FormatSnapshot(
166182
b.WriteString("\n")
167183
i++
168184
}
185+
for _, er := range enclosingByEndLine[int32(lineNumber)] {
186+
b.WriteString(commentSyntax)
187+
for indent := int32(0); indent < er.Range.End.Character-1; indent++ {
188+
b.WriteRune(' ')
189+
}
190+
b.WriteString("⌃ enclosing_range_end ")
191+
b.WriteString(formatSymbol(er.Symbol))
192+
b.WriteString("\n")
193+
}
169194
}
170195
return b.String(), formattingError
171196
}
@@ -216,3 +241,37 @@ func isSCIPRangeLess(a []int32, b []int32) bool {
216241
}
217242
return false
218243
}
244+
245+
type enclosingRange struct {
246+
Range scip.Range
247+
Symbol string
248+
}
249+
250+
func enclosingRanges(occurrences []*scip.Occurrence) []enclosingRange {
251+
var enclosingRanges []enclosingRange
252+
for _, occ := range occurrences {
253+
if len(occ.EnclosingRange) > 0 {
254+
enclosingRanges = append(enclosingRanges, enclosingRange{
255+
Range: scip.NewRangeUnchecked(occ.EnclosingRange),
256+
Symbol: occ.Symbol,
257+
})
258+
}
259+
}
260+
return enclosingRanges
261+
}
262+
263+
func enclosingRangesByStartLine(ranges []enclosingRange) map[int32][]enclosingRange {
264+
result := map[int32][]enclosingRange{}
265+
for _, r := range ranges {
266+
result[r.Range.Start.Line] = append(result[r.Range.Start.Line], r)
267+
}
268+
return result
269+
}
270+
271+
func enclosingRangesByEndLine(ranges []enclosingRange) map[int32][]enclosingRange {
272+
result := map[int32][]enclosingRange{}
273+
for _, r := range ranges {
274+
result[r.Range.End.Line] = append(result[r.Range.End.Line], r)
275+
}
276+
return result
277+
}

0 commit comments

Comments
 (0)