@@ -11,9 +11,10 @@ import { SerializableSemanticTokensParams } from './serializableSemanticTokensPa
1111import { RazorDocumentManager } from '../document/razorDocumentManager' ;
1212import { RazorDocumentSynchronizer } from '../document/razorDocumentSynchronizer' ;
1313import { RazorLogger } from '../razorLogger' ;
14+ import { SerializableRange } from '../rpc/serializableRange' ;
1415
1516export class SemanticTokensRangeHandler {
16- private static readonly getSemanticTokensRangeEndpoint = 'razor/provideSemanticTokensRange ' ;
17+ private static readonly getSemanticTokensRangeEndpoint = 'razor/provideSemanticTokensRanges ' ;
1718 private semanticTokensRequestType : RequestType <
1819 SerializableSemanticTokensParams ,
1920 ProvideSemanticTokensResponse ,
@@ -86,10 +87,13 @@ export class SemanticTokensRangeHandler {
8687 }
8788 }
8889
90+ // We get multiple ranges in semanticTokensParams.ranges, and we just want to compute one range which encompasses it all
91+ const reducedRange = this . reduceRanges ( semanticTokensParams . ranges ) ;
92+
8993 const tokens = await vscode . commands . executeCommand < vscode . SemanticTokens > (
9094 'vscode.provideDocumentRangeSemanticTokens' ,
9195 razorDocument . csharpDocument . uri ,
92- semanticTokensParams . ranges [ 0 ]
96+ reducedRange
9397 ) ;
9498
9599 return new ProvideSemanticTokensResponse (
@@ -106,6 +110,37 @@ export class SemanticTokensRangeHandler {
106110 ) ;
107111 }
108112
113+ private reduceRanges ( ranges : SerializableRange [ ] ) {
114+ if ( ! ranges || ranges . length === 0 ) {
115+ return { start : { line : 0 , character : 0 } , end : { line : 0 , character : 0 } } ;
116+ }
117+
118+ // Start with the first range's bounds
119+ let minStart = ranges [ 0 ] . start ;
120+ let maxEnd = ranges [ 0 ] . end ;
121+
122+ for ( const range of ranges ) {
123+ const s = range . start ;
124+ const e = range . end ;
125+
126+ // Update minStart if this range starts earlier
127+ if ( s . line < minStart . line || ( s . line === minStart . line && s . character < minStart . character ) ) {
128+ minStart = s ;
129+ }
130+
131+ // Update maxEnd if this range ends later
132+ if ( e . line > maxEnd . line || ( e . line === maxEnd . line && e . character > maxEnd . character ) ) {
133+ maxEnd = e ;
134+ }
135+ }
136+
137+ // Return new SerializableRange composed from the computed bounds
138+ return {
139+ start : { line : minStart . line , character : minStart . character } ,
140+ end : { line : maxEnd . line , character : maxEnd . character } ,
141+ } ;
142+ }
143+
109144 private countLines ( text : string ) {
110145 let lineCount = 0 ;
111146 for ( const i of text ) {
0 commit comments