Skip to content

feat: workspace symbols support #2769

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/language-server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ Enable signature help (parameter hints) for JS/TS. _Default_: `true`

Enable semantic tokens (semantic highlight) for TypeScript. _Default_: `true`

#### `svelte.plugin.typescript.workspaceSymbols.enable`

Enable workspace symbols for TypeScript. You can disable this if the language server client you're using doesn't deduplicate results from the TSServer. _Default_: `true`.

##### `svelte.plugin.css.enable`

Enable the CSS plugin. _Default_: `true`
Expand Down
15 changes: 13 additions & 2 deletions packages/language-server/src/ls-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ const defaultLSConfig: LSConfig = {
codeActions: { enable: true },
selectionRange: { enable: true },
signatureHelp: { enable: true },
semanticTokens: { enable: true }
semanticTokens: { enable: true },
workspaceSymbols: { enable: true }
},
css: {
enable: true,
Expand Down Expand Up @@ -105,6 +106,9 @@ export interface LSTypescriptConfig {
semanticTokens: {
enable: boolean;
};
workspaceSymbols: {
enable: boolean;
};
}

export interface LSCSSConfig {
Expand Down Expand Up @@ -205,6 +209,7 @@ export interface TSUserConfig {
inlayHints?: TsInlayHintsConfig;
referencesCodeLens?: TsReferenceCodeLensConfig;
implementationsCodeLens?: TsImplementationCodeLensConfig;
workspaceSymbols?: TsWorkspaceSymbolsConfig;
}

/**
Expand Down Expand Up @@ -280,6 +285,10 @@ export interface TsImplementationCodeLensConfig {
showOnInterfaceMethods?: boolean | undefined;
}

export interface TsWorkspaceSymbolsConfig {
excludeLibrarySymbols?: boolean;
}

export type TsUserConfigLang = 'typescript' | 'javascript';

/**
Expand Down Expand Up @@ -509,7 +518,9 @@ export class LSConfigManager {
organizeImportsTypeOrder: this.withDefaultAsUndefined(
config.preferences?.organizeImports?.typeOrder,
'auto'
)
),

excludeLibrarySymbolsInNavTo: config.workspaceSymbols?.excludeLibrarySymbols ?? true
};
}

Expand Down
15 changes: 14 additions & 1 deletion packages/language-server/src/plugins/PluginHost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ import {
TextDocumentIdentifier,
TextEdit,
WorkspaceEdit,
InlayHint
InlayHint,
WorkspaceSymbol
} from 'vscode-languageserver';
import { DocumentManager, getNodeIfIsInHTMLStartTag } from '../lib/documents';
import { Logger } from '../logger';
Expand Down Expand Up @@ -697,6 +698,18 @@ export class PluginHost implements LSProvider, OnWatchFileChanges {
);
}

async getWorkspaceSymbols(
query: string,
token: CancellationToken
): Promise<WorkspaceSymbol[] | null> {
return await this.execute<WorkspaceSymbol[]>(
'getWorkspaceSymbols',
[query, token],
ExecuteMode.FirstNonNull,
'high'
);
}

onWatchFileChanges(onWatchFileChangesParas: OnWatchFileChangesPara[]): void {
for (const support of this.plugins) {
support.onWatchFileChanges?.(onWatchFileChangesParas);
Expand Down
13 changes: 11 additions & 2 deletions packages/language-server/src/plugins/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ import {
SymbolInformation,
TextDocumentIdentifier,
TextEdit,
WorkspaceEdit
WorkspaceEdit,
WorkspaceSymbol
} from 'vscode-languageserver-types';
import { Document } from '../lib/documents';

Expand Down Expand Up @@ -251,6 +252,13 @@ export interface DocumentHighlightProvider {
): Resolvable<DocumentHighlight[] | null>;
}

export interface WorkspaceSymbolsProvider {
getWorkspaceSymbols(
query: string,
cancellationToken?: CancellationToken
): Resolvable<WorkspaceSymbol[] | null>;
}

export interface OnWatchFileChanges {
onWatchFileChanges(onWatchFileChangesParas: OnWatchFileChangesPara[]): void;
}
Expand Down Expand Up @@ -282,7 +290,8 @@ type ProviderBase = DiagnosticsProvider &
CallHierarchyProvider &
FoldingRangeProvider &
CodeLensProvider &
DocumentHighlightProvider;
DocumentHighlightProvider &
WorkspaceSymbolsProvider;

export type LSProvider = ProviderBase & BackwardsCompatibleDefinitionsProvider;

Expand Down
10 changes: 10 additions & 0 deletions packages/language-server/src/plugins/typescript/SnapshotManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,16 @@ export class SnapshotManager {
}
}

allFilesAreJsOrDts() {
for (const doc of this.documents.values()) {
if (doc.scriptKind === ts.ScriptKind.TS || doc.scriptKind === ts.ScriptKind.TSX) {
return false;
}
}

return true;
}

dispose() {
this.globalSnapshotsManager.removeChangeListener(this.onSnapshotChange);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ import {
SymbolInformation,
SymbolKind,
TextDocumentContentChangeEvent,
WorkspaceEdit
WorkspaceEdit,
WorkspaceSymbol
} from 'vscode-languageserver';
import {
Document,
Expand Down Expand Up @@ -65,7 +66,8 @@ import {
SignatureHelpProvider,
TypeDefinitionProvider,
UpdateImportsProvider,
UpdateTsOrJsFile
UpdateTsOrJsFile,
WorkspaceSymbolsProvider
} from '../interfaces';
import { LSAndTSDocResolver } from './LSAndTSDocResolver';
import { ignoredBuildDirectories } from './SnapshotManager';
Expand Down Expand Up @@ -103,6 +105,7 @@ import {
} from './utils';
import { CallHierarchyProviderImpl } from './features/CallHierarchyProvider';
import { CodeLensProviderImpl } from './features/CodeLensProvider';
import { WorkspaceSymbolsProviderImpl } from './features/WorkspaceSymbolProvider';

export class TypeScriptPlugin
implements
Expand All @@ -126,6 +129,7 @@ export class TypeScriptPlugin
CallHierarchyProvider,
FoldingRangeProvider,
CodeLensProvider,
WorkspaceSymbolsProvider,
OnWatchFileChanges,
CompletionsProvider<CompletionResolveInfo>,
UpdateTsOrJsFile
Expand Down Expand Up @@ -154,6 +158,7 @@ export class TypeScriptPlugin
private readonly callHierarchyProvider: CallHierarchyProviderImpl;
private readonly codLensProvider: CodeLensProviderImpl;
private readonly documentHeightProvider: DocumentHighlightProviderImpl;
private readonly workspaceSymbolsProvider: WorkspaceSymbolsProvider;

constructor(
configManager: LSConfigManager,
Expand Down Expand Up @@ -214,6 +219,10 @@ export class TypeScriptPlugin
this.configManager
);
this.documentHeightProvider = new DocumentHighlightProviderImpl(this.lsAndTsDocResolver);
this.workspaceSymbolsProvider = new WorkspaceSymbolsProviderImpl(
this.lsAndTsDocResolver,
configManager
);
}

async getDiagnostics(
Expand Down Expand Up @@ -701,6 +710,16 @@ export class TypeScriptPlugin
return this.documentHeightProvider.findDocumentHighlight(document, position);
}

async getWorkspaceSymbols(
query: string,
cancellationToken?: CancellationToken
): Promise<WorkspaceSymbol[] | null> {
if (!this.featureEnabled('workspaceSymbols')) {
return null;
}
return this.workspaceSymbolsProvider.getWorkspaceSymbols(query, cancellationToken);
}

private featureEnabled(feature: keyof LSTypescriptConfig) {
return (
this.configManager.enabled('typescript.enable') &&
Expand Down
Loading