@@ -86,8 +86,24 @@ func FormatSnapshot(
86
86
}
87
87
return formatted
88
88
}
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 )
89
95
i := 0
90
96
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
+
91
107
line = strings .TrimSuffix (line , "\r " )
92
108
b .WriteString (strings .Repeat (" " , len (commentSyntax )))
93
109
b .WriteString (strings .ReplaceAll (line , "\t " , " " ))
@@ -166,6 +182,15 @@ func FormatSnapshot(
166
182
b .WriteString ("\n " )
167
183
i ++
168
184
}
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
+ }
169
194
}
170
195
return b .String (), formattingError
171
196
}
@@ -216,3 +241,37 @@ func isSCIPRangeLess(a []int32, b []int32) bool {
216
241
}
217
242
return false
218
243
}
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