@@ -17,7 +17,8 @@ import * as fs from "fs/promises";
1717import * as path from "path" ;
1818import { RenderNode , WebviewContent , WebviewMessage } from "./webview/WebviewMessage" ;
1919import { WorkspaceContext } from "../WorkspaceContext" ;
20- import { ConvertDocumentationRequest } from "../sourcekit-lsp/extensions/ConvertDocumentationRequest" ;
20+ import { DocCDocumentationRequest , DocCDocumentationResponse } from "../sourcekit-lsp/extensions" ;
21+ import { LSPErrorCodes , ResponseError } from "vscode-languageclient" ;
2122
2223export enum PreviewEditorConstant {
2324 VIEW_TYPE = "swift.previewDocumentationEditor" ,
@@ -185,33 +186,56 @@ export class DocumentationPreviewEditor implements vscode.Disposable {
185186 return ;
186187 }
187188
188- const response = await this . context . languageClientManager . useLanguageClient (
189- async client => {
190- return await client . sendRequest ( ConvertDocumentationRequest . type , {
191- textDocument : {
192- uri : document . uri . toString ( ) ,
193- } ,
194- position : textEditor . selection . start ,
195- } ) ;
189+ try {
190+ const response = await this . context . languageClientManager . useLanguageClient (
191+ async ( client ) : Promise < DocCDocumentationResponse > => {
192+ return await client . sendRequest ( DocCDocumentationRequest . type , {
193+ textDocument : {
194+ uri : document . uri . toString ( ) ,
195+ } ,
196+ position : textEditor . selection . start ,
197+ } ) ;
198+ }
199+ ) ;
200+ this . postMessage ( {
201+ type : "update-content" ,
202+ content : {
203+ type : "render-node" ,
204+ renderNode : this . parseRenderNode ( response . renderNode ) ,
205+ } ,
206+ } ) ;
207+ } catch ( error ) {
208+ // Update the preview editor to reflect what error occurred
209+ let livePreviewErrorMessage = "An internal error occurred" ;
210+ const baseLogErrorMessage = `SourceKit-LSP request "${ DocCDocumentationRequest . method } " failed: ` ;
211+ if ( error instanceof ResponseError ) {
212+ if ( error . code === LSPErrorCodes . RequestCancelled ) {
213+ // We can safely ignore cancellations
214+ return undefined ;
215+ }
216+ switch ( error . code ) {
217+ case LSPErrorCodes . RequestFailed :
218+ // RequestFailed response errors can be shown to the user
219+ livePreviewErrorMessage = error . message ;
220+ break ;
221+ default :
222+ // We should log additional info for other response errors
223+ this . context . outputChannel . log (
224+ baseLogErrorMessage + JSON . stringify ( error . toJson ( ) , undefined , 2 )
225+ ) ;
226+ break ;
227+ }
228+ } else {
229+ this . context . outputChannel . log ( baseLogErrorMessage + `${ error } ` ) ;
196230 }
197- ) ;
198- if ( response . type === "error" ) {
199231 this . postMessage ( {
200232 type : "update-content" ,
201233 content : {
202234 type : "error" ,
203- errorMessage : response . error . message ,
235+ errorMessage : livePreviewErrorMessage ,
204236 } ,
205237 } ) ;
206- return ;
207238 }
208- this . postMessage ( {
209- type : "update-content" ,
210- content : {
211- type : "render-node" ,
212- renderNode : this . parseRenderNode ( response . renderNode ) ,
213- } ,
214- } ) ;
215239 }
216240
217241 private parseRenderNode ( content : string ) : RenderNode {
0 commit comments