1414 *
1515 */
1616
17+ import * as fs from 'fs' ;
18+ import { Utils } from 'vscode-uri' ;
1719import { CancellationToken } from 'vscode-languageserver' ;
1820import * as lsp from 'vscode-languageserver-types' ;
1921import { Disposable } from 'core' ;
2022import { Document } from 'quarto-core' ;
2123import { IWorkspace } from '../workspace' ;
2224import { MdWorkspaceInfoCache } from '../workspace-cache' ;
2325import { MdDocumentSymbolProvider } from './document-symbols' ;
26+ import { LsConfiguration } from '../config' ;
2427
2528export class MdWorkspaceSymbolProvider extends Disposable {
26-
29+ readonly #config: LsConfiguration ;
2730 readonly #cache: MdWorkspaceInfoCache < readonly lsp . SymbolInformation [ ] > ;
2831 readonly #symbolProvider: MdDocumentSymbolProvider ;
32+ readonly #workspace: IWorkspace ;
2933
3034 constructor (
3135 workspace : IWorkspace ,
36+ config : LsConfiguration ,
3237 symbolProvider : MdDocumentSymbolProvider ,
3338 ) {
3439 super ( ) ;
40+
41+ this . #workspace = workspace ;
42+ this . #config = config ;
3543 this . #symbolProvider = symbolProvider ;
3644
3745 this . #cache = this . _register ( new MdWorkspaceInfoCache ( workspace , ( doc , token ) => this . provideDocumentSymbolInformation ( doc , token ) ) ) ;
@@ -42,6 +50,12 @@ export class MdWorkspaceSymbolProvider extends Disposable {
4250 return [ ] ;
4351 }
4452
53+ switch ( this . #config. exportSymbolsToWorkspace ) {
54+ case 'all' : break ;
55+ case 'default' : if ( shouldExportSymbolsToWorkspace ( this . #workspace) ) return [ ] ; else break ;
56+ case 'none' : return [ ] ;
57+ }
58+
4559 const allSymbols = await this . #cache. values ( ) ;
4660
4761 if ( token . isCancellationRequested ) {
@@ -73,3 +87,17 @@ export class MdWorkspaceSymbolProvider extends Disposable {
7387 }
7488 }
7589}
90+
91+ function shouldExportSymbolsToWorkspace ( workspace : IWorkspace ) : boolean {
92+ return isRPackage ( workspace ) ;
93+ }
94+
95+ function isRPackage ( workspace : IWorkspace ) : boolean {
96+ if ( workspace . workspaceFolders === undefined ) {
97+ return false ;
98+ }
99+
100+ const projectPath = workspace . workspaceFolders [ 0 ] ;
101+ const descPath = Utils . joinPath ( projectPath , 'DESCRIPTION' ) ;
102+ return fs . existsSync ( descPath . fsPath ) ;
103+ }
0 commit comments