@@ -86,8 +86,31 @@ func FormatSnapshot(
86
86
}
87
87
return formatted
88
88
}
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
+ }
89
102
i := 0
90
103
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
+
91
114
line = strings .TrimSuffix (line , "\r " )
92
115
b .WriteString (strings .Repeat (" " , len (commentSyntax )))
93
116
b .WriteString (strings .ReplaceAll (line , "\t " , " " ))
@@ -166,6 +189,15 @@ func FormatSnapshot(
166
189
b .WriteString ("\n " )
167
190
i ++
168
191
}
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
+ }
169
201
}
170
202
return b .String (), formattingError
171
203
}
@@ -216,3 +248,37 @@ func isSCIPRangeLess(a []int32, b []int32) bool {
216
248
}
217
249
return false
218
250
}
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