@@ -311,12 +311,44 @@ class HeaderNode {
311
311
}
312
312
}
313
313
314
+ class ErrorNode {
315
+ constructor (
316
+ public name : string ,
317
+ private folder : vscode . Uri
318
+ ) { }
319
+
320
+ get path ( ) : string {
321
+ return "" ;
322
+ }
323
+
324
+ toTreeItem ( ) : vscode . TreeItem {
325
+ const item = new vscode . TreeItem ( this . name , vscode . TreeItemCollapsibleState . None ) ;
326
+ item . id = `error-${ this . folder . fsPath } ` ;
327
+ item . iconPath = new vscode . ThemeIcon ( "error" , new vscode . ThemeColor ( "errorForeground" ) ) ;
328
+ item . contextValue = "error" ;
329
+ item . accessibilityInformation = { label : this . name } ;
330
+ item . tooltip =
331
+ "Could not build the Package.swift, fix the error to refresh the project panel" ;
332
+
333
+ item . command = {
334
+ command : "swift.openManifest" ,
335
+ arguments : [ this . folder ] ,
336
+ title : "Open Manifest" ,
337
+ } ;
338
+ return item ;
339
+ }
340
+
341
+ getChildren ( ) : Promise < TreeNode [ ] > {
342
+ return Promise . resolve ( [ ] ) ;
343
+ }
344
+ }
345
+
314
346
/**
315
347
* A node in the Package Dependencies {@link vscode.TreeView TreeView}.
316
348
*
317
- * Can be either a {@link PackageNode}, {@link FileNode}, {@link TargetNode}, {@link TaskNode} or {@link HeaderNode}.
349
+ * Can be either a {@link PackageNode}, {@link FileNode}, {@link TargetNode}, {@link TaskNode}, { @link ErrorNode} or {@link HeaderNode}.
318
350
*/
319
- type TreeNode = PackageNode | FileNode | HeaderNode | TaskNode | TargetNode ;
351
+ type TreeNode = PackageNode | FileNode | HeaderNode | TaskNode | TargetNode | ErrorNode ;
320
352
321
353
/**
322
354
* A {@link vscode.TreeDataProvider<T> TreeDataProvider} for project dependencies, tasks and commands {@link vscode.TreeView TreeView}.
@@ -328,6 +360,7 @@ export class ProjectPanelProvider implements vscode.TreeDataProvider<TreeNode> {
328
360
private workspaceObserver ?: vscode . Disposable ;
329
361
private disposables : vscode . Disposable [ ] = [ ] ;
330
362
private activeTasks : Set < string > = new Set ( ) ;
363
+ private lastComputedNodes : TreeNode [ ] = [ ] ;
331
364
332
365
onDidChangeTreeData = this . didChangeTreeDataEmitter . event ;
333
366
@@ -426,6 +459,24 @@ export class ProjectPanelProvider implements vscode.TreeDataProvider<TreeNode> {
426
459
return [ ] ;
427
460
}
428
461
462
+ if ( ! element && folderContext . hasResolveErrors ) {
463
+ return [
464
+ new ErrorNode ( "Error Parsing Package.swift" , folderContext . folder ) ,
465
+ ...this . lastComputedNodes ,
466
+ ] ;
467
+ }
468
+
469
+ const nodes = await this . computeChildren ( folderContext , element ) ;
470
+
471
+ // If we're fetching the root nodes then save them in case we have an error later,
472
+ // in which case we show the ErrorNode along with the last known good nodes.
473
+ if ( ! element ) {
474
+ this . lastComputedNodes = nodes ;
475
+ }
476
+ return nodes ;
477
+ }
478
+
479
+ async computeChildren ( folderContext : FolderContext , element ?: TreeNode ) : Promise < TreeNode [ ] > {
429
480
if ( element ) {
430
481
return element . getChildren ( ) ;
431
482
}
@@ -515,7 +566,7 @@ export class ProjectPanelProvider implements vscode.TreeDataProvider<TreeNode> {
515
566
) ;
516
567
}
517
568
518
- private async tasks ( folderContext : FolderContext ) : Promise < TreeNode [ ] > {
569
+ private async tasks ( folderContext : FolderContext ) : Promise < TaskNode [ ] > {
519
570
const tasks = await vscode . tasks . fetchTasks ( ) ;
520
571
521
572
return (
0 commit comments