33 * Licensed under the MIT License. See License.txt in the project root for license information.
44 *--------------------------------------------------------------------------------------------*/
55
6- import { RoslynLanguageServer } from '../server/roslynLanguageServer' ;
76import * as vscode from 'vscode' ;
7+ import { RoslynLanguageServer } from '../server/roslynLanguageServer' ;
88import {
99 ColorInformation ,
1010 ColorPresentationParams ,
1111 ColorPresentationRequest ,
12+ CompletionList ,
13+ CompletionParams ,
14+ CompletionRequest ,
1215 DocumentColorParams ,
1316 DocumentColorRequest ,
17+ DocumentHighlight ,
18+ DocumentHighlightKind ,
19+ DocumentHighlightParams ,
20+ DocumentHighlightRequest ,
21+ FoldingRange ,
22+ FoldingRangeParams ,
23+ FoldingRangeRequest ,
24+ Hover ,
25+ HoverParams ,
26+ HoverRequest ,
1427 LogMessageParams ,
28+ MarkupKind ,
1529 NotificationType ,
1630 RequestType ,
1731} from 'vscode-languageclient' ;
@@ -24,51 +38,150 @@ import { DocumentColorHandler } from '../../razor/src/documentColor/documentColo
2438import { razorOptions } from '../../shared/options' ;
2539import { ColorPresentationHandler } from '../../razor/src/colorPresentation/colorPresentationHandler' ;
2640import { ColorPresentation } from 'vscode-html-languageservice' ;
41+ import { convertRangeToSerializable } from '../../razor/src/rpc/serializableRange' ;
42+ import { FoldingRangeHandler } from '../../razor/src/folding/foldingRangeHandler' ;
43+ import { CompletionHandler } from '../../razor/src/completion/completionHandler' ;
44+ import { DynamicFileInfoHandler } from '../../razor/src/dynamicFile/dynamicFileInfoHandler' ;
45+ import { ProvideDynamicFileParams } from '../../razor/src/dynamicFile/provideDynamicFileParams' ;
46+ import { ProvideDynamicFileResponse } from '../../razor/src/dynamicFile/provideDynamicFileResponse' ;
47+ import { RazorMapSpansParams } from '../../razor/src/mapping/razorMapSpansParams' ;
48+ import { RazorMapSpansResponse } from '../../razor/src/mapping/razorMapSpansResponse' ;
49+ import { MappingHandler } from '../../razor/src/mapping/mappingHandler' ;
50+ import { RazorMapTextChangesParams } from '../../razor/src/mapping/razorMapTextChangesParams' ;
51+ import { RazorMapTextChangesResponse } from '../../razor/src/mapping/razorMapTextChangesResponse' ;
2752
2853export function registerRazorEndpoints (
2954 context : vscode . ExtensionContext ,
30- languageServer : RoslynLanguageServer ,
55+ roslynLanguageServer : RoslynLanguageServer ,
3156 razorLogger : RazorLogger ,
3257 platformInfo : PlatformInformation
3358) {
3459 const logNotificationType = new NotificationType < LogMessageParams > ( 'razor/log' ) ;
35- languageServer . registerOnNotificationWithParams ( logNotificationType , ( params ) =>
60+ roslynLanguageServer . registerOnNotificationWithParams ( logNotificationType , ( params ) =>
3661 razorLogger . log ( params . message , params . type )
3762 ) ;
3863
39- if ( ! razorOptions . cohostingEnabled ) {
40- return ;
64+ if ( razorOptions . cohostingEnabled ) {
65+ registerCohostingEndpoints ( ) ;
66+ } else {
67+ registerNonCohostingEndpoints ( ) ;
4168 }
4269
43- const documentManager = new HtmlDocumentManager ( platformInfo , razorLogger ) ;
44- context . subscriptions . push ( documentManager . register ( ) ) ;
70+ return ;
4571
46- registerRequestHandler < HtmlUpdateParameters , void > ( 'razor/updateHtml' , async ( params ) => {
47- const uri = UriConverter . deserialize ( params . textDocument . uri ) ;
48- await documentManager . updateDocumentText ( uri , params . text ) ;
49- } ) ;
72+ //
73+ // Local Functions
74+ //
75+ function registerCohostingEndpoints ( ) {
76+ const documentManager = new HtmlDocumentManager ( platformInfo , razorLogger ) ;
77+ context . subscriptions . push ( documentManager . register ( ) ) ;
5078
51- registerRequestHandler < DocumentColorParams , ColorInformation [ ] > ( DocumentColorRequest . method , async ( params ) => {
52- const uri = UriConverter . deserialize ( params . textDocument . uri ) ;
53- const document = await documentManager . getDocument ( uri ) ;
79+ registerRequestHandler < HtmlUpdateParameters , void > ( 'razor/updateHtml' , async ( params ) => {
80+ const uri = UriConverter . deserialize ( params . textDocument . uri ) ;
81+ await documentManager . updateDocumentText ( uri , params . text ) ;
82+ } ) ;
5483
55- return await DocumentColorHandler . doDocumentColorRequest ( document . uri ) ;
56- } ) ;
84+ registerRequestHandler < DocumentColorParams , ColorInformation [ ] > ( DocumentColorRequest . method , async ( params ) => {
85+ const uri = UriConverter . deserialize ( params . textDocument . uri ) ;
86+ const document = await documentManager . getDocument ( uri ) ;
87+
88+ return await DocumentColorHandler . doDocumentColorRequest ( document . uri ) ;
89+ } ) ;
90+
91+ registerRequestHandler < ColorPresentationParams , ColorPresentation [ ] > (
92+ ColorPresentationRequest . method ,
93+ async ( params ) => {
94+ const uri = UriConverter . deserialize ( params . textDocument . uri ) ;
95+ const document = await documentManager . getDocument ( uri ) ;
96+
97+ return await ColorPresentationHandler . doColorPresentationRequest ( document . uri , params ) ;
98+ }
99+ ) ;
57100
58- registerRequestHandler < ColorPresentationParams , ColorPresentation [ ] > (
59- ColorPresentationRequest . method ,
60- async ( params ) => {
101+ registerRequestHandler < FoldingRangeParams , FoldingRange [ ] > ( FoldingRangeRequest . method , async ( params ) => {
61102 const uri = UriConverter . deserialize ( params . textDocument . uri ) ;
62103 const document = await documentManager . getDocument ( uri ) ;
63104
64- return await ColorPresentationHandler . doColorPresentationRequest ( document . uri , params ) ;
65- }
66- ) ;
105+ const results = await vscode . commands . executeCommand < vscode . FoldingRange [ ] > (
106+ 'vscode.executeFoldingRangeProvider' ,
107+ document . uri
108+ ) ;
109+
110+ return FoldingRangeHandler . convertFoldingRanges ( results , razorLogger ) ;
111+ } ) ;
112+
113+ registerRequestHandler < HoverParams , Hover | undefined > ( HoverRequest . method , async ( params ) => {
114+ const uri = UriConverter . deserialize ( params . textDocument . uri ) ;
115+ const document = await documentManager . getDocument ( uri ) ;
116+
117+ const results = await vscode . commands . executeCommand < vscode . Hover [ ] > (
118+ 'vscode.executeHoverProvider' ,
119+ document . uri ,
120+ params . position
121+ ) ;
122+ const applicableHover = results . filter ( ( item ) => item . range ) [ 0 ] ;
123+
124+ return rewriteHover ( applicableHover ) ;
125+ } ) ;
126+
127+ registerRequestHandler < DocumentHighlightParams , DocumentHighlight [ ] > (
128+ DocumentHighlightRequest . method ,
129+ async ( params ) => {
130+ const uri = UriConverter . deserialize ( params . textDocument . uri ) ;
131+ const document = await documentManager . getDocument ( uri ) ;
132+
133+ const results = await vscode . commands . executeCommand < vscode . DocumentHighlight [ ] > (
134+ 'vscode.executeDocumentHighlights' ,
135+ document . uri ,
136+ params . position
137+ ) ;
138+
139+ return rewriteHighlight ( results ) ;
140+ }
141+ ) ;
142+
143+ registerRequestHandler < CompletionParams , CompletionList > ( CompletionRequest . method , async ( params ) => {
144+ const uri = UriConverter . deserialize ( params . textDocument . uri ) ;
145+ const document = await documentManager . getDocument ( uri ) ;
146+
147+ return CompletionHandler . provideVscodeCompletions (
148+ document . uri ,
149+ params . position ,
150+ params . context ?. triggerCharacter
151+ ) ;
152+ } ) ;
153+ }
154+
155+ function registerNonCohostingEndpoints ( ) {
156+ registerRequestHandler < ProvideDynamicFileParams , ProvideDynamicFileResponse > (
157+ 'razor/provideDynamicFileInfo' ,
158+ async ( params ) =>
159+ vscode . commands . executeCommand ( DynamicFileInfoHandler . provideDynamicFileInfoCommand , params )
160+ ) ;
161+
162+ registerRequestHandler < ProvideDynamicFileParams , ProvideDynamicFileResponse > (
163+ 'razor/removeDynamicFileInfo' ,
164+ async ( params ) =>
165+ vscode . commands . executeCommand ( DynamicFileInfoHandler . provideDynamicFileInfoCommand , params )
166+ ) ;
167+ registerRequestHandler < RazorMapSpansParams , RazorMapSpansResponse > ( 'razor/mapSpans' , async ( params ) => {
168+ return await vscode . commands . executeCommand < RazorMapSpansResponse > ( MappingHandler . MapSpansCommand , params ) ;
169+ } ) ;
170+ registerRequestHandler < RazorMapTextChangesParams , RazorMapTextChangesResponse > (
171+ 'razor/mapTextChanges' ,
172+ async ( params ) => {
173+ return await vscode . commands . executeCommand < RazorMapTextChangesResponse > (
174+ MappingHandler . MapChangesCommand ,
175+ params
176+ ) ;
177+ }
178+ ) ;
179+ }
67180
68181 // Helper method that registers a request handler, and logs errors to the Razor logger.
69182 function registerRequestHandler < Params , Result > ( method : string , invocation : ( params : Params ) => Promise < Result > ) {
70183 const requestType = new RequestType < Params , Result , Error > ( method ) ;
71- languageServer . registerOnRequest ( requestType , async ( params ) => {
184+ roslynLanguageServer . registerOnRequest ( requestType , async ( params ) => {
72185 try {
73186 return await invocation ( params ) ;
74187 } catch ( error ) {
@@ -78,3 +191,47 @@ export function registerRazorEndpoints(
78191 } ) ;
79192 }
80193}
194+
195+ function rewriteHover ( hover : vscode . Hover ) : Hover | undefined {
196+ if ( ! hover ) {
197+ return undefined ;
198+ }
199+
200+ const markdownString = new vscode . MarkdownString ( ) ;
201+ for ( const content of hover . contents ) {
202+ if ( ( content as { language : string ; value : string } ) . language ) {
203+ const contentObject = content as { language : string ; value : string } ;
204+ markdownString . appendCodeblock ( contentObject . value , contentObject . language ) ;
205+ } else {
206+ const contentValue = ( content as vscode . MarkdownString ) . value ;
207+ markdownString . appendMarkdown ( contentValue ) ;
208+ }
209+ }
210+
211+ return {
212+ contents : { kind : MarkupKind . Markdown , value : markdownString . value } ,
213+ range : hover . range ? convertRangeToSerializable ( hover . range ) : undefined ,
214+ } ;
215+ }
216+
217+ function rewriteHighlight ( highlights : vscode . DocumentHighlight [ ] ) : DocumentHighlight [ ] {
218+ return highlights . map ( ( highlight ) => {
219+ return {
220+ range : convertRangeToSerializable ( highlight . range ) ,
221+ kind : convertHighlightKind ( highlight . kind ) ,
222+ } ;
223+ } ) ;
224+ }
225+
226+ function convertHighlightKind ( kind : vscode . DocumentHighlightKind | undefined ) : DocumentHighlightKind | undefined {
227+ switch ( kind ) {
228+ case vscode . DocumentHighlightKind . Text :
229+ return DocumentHighlightKind . Text ;
230+ case vscode . DocumentHighlightKind . Read :
231+ return DocumentHighlightKind . Read ;
232+ case vscode . DocumentHighlightKind . Write :
233+ return DocumentHighlightKind . Write ;
234+ default :
235+ return undefined ;
236+ }
237+ }
0 commit comments