@@ -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