Skip to content

Commit 1a009ba

Browse files
authored
Merge pull request #2487 from dmgonch/feature/minFindSymbolsFilterLength
Introduce configuration for "Go to Symbol in Workspace"
2 parents 43b6fb2 + 1c88289 commit 1a009ba

File tree

8 files changed

+91
-59
lines changed

8 files changed

+91
-59
lines changed

package.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,16 @@
587587
"default": true,
588588
"description": "Specifes whether OmniSharp should use VS Code editor settings for C# code formatting (use of tabs, indentation size)."
589589
},
590+
"omnisharp.minFindSymbolsFilterLength": {
591+
"type": "number",
592+
"default": 0,
593+
"description": "The minimum number of characters to enter before 'Go to Symbol in Workspace' operation shows any results."
594+
},
595+
"omnisharp.maxFindSymbolsItems": {
596+
"type": "number",
597+
"default": 1000,
598+
"description": "The maximum number of items that 'Go to Symbol in Workspace' operation can show. The limit is applied only when a positive number is specified here."
599+
},
590600
"omnisharp.disableMSBuildDiagnosticWarning": {
591601
"type": "boolean",
592602
"default": false,
Lines changed: 65 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,65 @@
1-
/*---------------------------------------------------------------------------------------------
2-
* Copyright (c) Microsoft Corporation. All rights reserved.
3-
* Licensed under the MIT License. See License.txt in the project root for license information.
4-
*--------------------------------------------------------------------------------------------*/
5-
6-
import AbstractSupport from './abstractProvider';
7-
import * as protocol from '../omnisharp/protocol';
8-
import * as serverUtils from '../omnisharp/utils';
9-
import {toRange} from '../omnisharp/typeConvertion';
10-
import {CancellationToken, Uri, WorkspaceSymbolProvider, SymbolInformation, SymbolKind} from 'vscode';
11-
12-
13-
export default class OmnisharpWorkspaceSymbolProvider extends AbstractSupport implements WorkspaceSymbolProvider {
14-
15-
public async provideWorkspaceSymbols(search: string, token: CancellationToken): Promise<SymbolInformation[]> {
16-
17-
return serverUtils.findSymbols(this._server, { Filter: search, FileName: '' }, token).then(res => {
18-
if (res && Array.isArray(res.QuickFixes)) {
19-
return res.QuickFixes.map(OmnisharpWorkspaceSymbolProvider._asSymbolInformation);
20-
}
21-
});
22-
}
23-
24-
private static _asSymbolInformation(symbolInfo: protocol.SymbolLocation): SymbolInformation {
25-
26-
return new SymbolInformation(symbolInfo.Text, OmnisharpWorkspaceSymbolProvider._toKind(symbolInfo),
27-
toRange(symbolInfo),
28-
Uri.file(symbolInfo.FileName));
29-
}
30-
31-
private static _toKind(symbolInfo: protocol.SymbolLocation): SymbolKind {
32-
switch (symbolInfo.Kind) {
33-
case 'Method':
34-
return SymbolKind.Method;
35-
case 'Field':
36-
return SymbolKind.Field;
37-
case 'Property':
38-
return SymbolKind.Property;
39-
case 'Interface':
40-
return SymbolKind.Interface;
41-
case 'Enum':
42-
return SymbolKind.Enum;
43-
case 'Struct':
44-
return SymbolKind.Struct;
45-
case 'Event':
46-
return SymbolKind.Event;
47-
case 'EnumMember':
48-
return SymbolKind.EnumMember;
49-
case 'Class':
50-
return SymbolKind.Class;
51-
default:
52-
return SymbolKind.Class;
53-
54-
}
55-
}
56-
}
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import AbstractSupport from './abstractProvider';
7+
import { OmniSharpServer } from '../omnisharp/server';
8+
import OptionProvider from '../observers/OptionProvider';
9+
import * as protocol from '../omnisharp/protocol';
10+
import * as serverUtils from '../omnisharp/utils';
11+
import {toRange} from '../omnisharp/typeConvertion';
12+
import {CancellationToken, Uri, WorkspaceSymbolProvider, SymbolInformation, SymbolKind} from 'vscode';
13+
14+
15+
export default class OmnisharpWorkspaceSymbolProvider extends AbstractSupport implements WorkspaceSymbolProvider {
16+
17+
constructor(server: OmniSharpServer, private optionProvider: OptionProvider) {
18+
super(server);
19+
}
20+
21+
public async provideWorkspaceSymbols(search: string, token: CancellationToken): Promise<SymbolInformation[]> {
22+
23+
let options = this.optionProvider.GetLatestOptions();
24+
let minFilterLength = options.minFindSymbolsFilterLength > 0 ? options.minFindSymbolsFilterLength : undefined;
25+
let maxItemsToReturn = options.maxFindSymbolsItems > 0 ? options.maxFindSymbolsItems : undefined;
26+
return serverUtils.findSymbols(this._server, { Filter: search, MinFilterLength: minFilterLength, MaxItemsToReturn: maxItemsToReturn, FileName: '' }, token).then(res => {
27+
if (res && Array.isArray(res.QuickFixes)) {
28+
return res.QuickFixes.map(OmnisharpWorkspaceSymbolProvider._asSymbolInformation);
29+
}
30+
});
31+
}
32+
33+
private static _asSymbolInformation(symbolInfo: protocol.SymbolLocation): SymbolInformation {
34+
35+
return new SymbolInformation(symbolInfo.Text, OmnisharpWorkspaceSymbolProvider._toKind(symbolInfo),
36+
toRange(symbolInfo),
37+
Uri.file(symbolInfo.FileName));
38+
}
39+
40+
private static _toKind(symbolInfo: protocol.SymbolLocation): SymbolKind {
41+
switch (symbolInfo.Kind) {
42+
case 'Method':
43+
return SymbolKind.Method;
44+
case 'Field':
45+
return SymbolKind.Field;
46+
case 'Property':
47+
return SymbolKind.Property;
48+
case 'Interface':
49+
return SymbolKind.Interface;
50+
case 'Enum':
51+
return SymbolKind.Enum;
52+
case 'Struct':
53+
return SymbolKind.Struct;
54+
case 'Event':
55+
return SymbolKind.Event;
56+
case 'EnumMember':
57+
return SymbolKind.EnumMember;
58+
case 'Class':
59+
return SymbolKind.Class;
60+
default:
61+
return SymbolKind.Class;
62+
63+
}
64+
}
65+
}

src/omnisharp/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export async function activate(context: vscode.ExtensionContext, packageJSON: an
7777
localDisposables.add(vscode.languages.registerOnTypeFormattingEditProvider(documentSelector, new FormatProvider(server), '}', ';'));
7878
}
7979
localDisposables.add(vscode.languages.registerCompletionItemProvider(documentSelector, new CompletionItemProvider(server), '.', ' '));
80-
localDisposables.add(vscode.languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(server)));
80+
localDisposables.add(vscode.languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(server, optionProvider)));
8181
localDisposables.add(vscode.languages.registerSignatureHelpProvider(documentSelector, new SignatureHelpProvider(server), '(', ','));
8282
const codeActionProvider = new CodeActionProvider(server, optionProvider);
8383
localDisposables.add(codeActionProvider);

src/omnisharp/options.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export class Options {
2020
public showTestsCodeLens: boolean,
2121
public disableCodeActions: boolean,
2222
public disableMSBuildDiagnosticWarning: boolean,
23+
public minFindSymbolsFilterLength: number,
24+
public maxFindSymbolsItems: number,
2325
public defaultLaunchSolution?: string,
2426
public monoPath?: string) { }
2527

@@ -63,6 +65,9 @@ export class Options {
6365

6466
const disableMSBuildDiagnosticWarning = omnisharpConfig.get<boolean>('disableMSBuildDiagnosticWarning', false);
6567

68+
const minFindSymbolsFilterLength = omnisharpConfig.get<number>('minFindSymbolsFilterLength', 0);
69+
const maxFindSymbolsItems = omnisharpConfig.get<number>('maxFindSymbolsItems', 1000); // The limit is applied only when this setting is set to a number greater than zero
70+
6671
return new Options(
6772
path,
6873
useGlobalMono,
@@ -77,6 +82,8 @@ export class Options {
7782
showTestsCodeLens,
7883
disableCodeActions,
7984
disableMSBuildDiagnosticWarning,
85+
minFindSymbolsFilterLength,
86+
maxFindSymbolsItems,
8087
defaultLaunchSolution,
8188
monoPath,
8289
);

src/omnisharp/protocol.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ export interface FindUsagesRequest extends Request {
128128

129129
export interface FindSymbolsRequest extends Request {
130130
Filter: string;
131+
MinFilterLength?: number;
132+
MaxItemsToReturn?: number;
131133
}
132134

133135
export interface FormatRequest extends Request {

test/unitTests/Fakes/FakeOptions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
import { Options } from "../../../src/omnisharp/options";
77

88
export function getEmptyOptions(): Options {
9-
return new Options("", "", false, "", false, 0, 0, false, false, false, false, false, false, "", "");
9+
return new Options("", "", false, "", false, 0, 0, false, false, false, false, false, false, 0, 0, "", "");
1010
}

test/unitTests/optionStream.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ suite('OptionStream', () => {
4949
options.showReferencesCodeLens.should.equal(true);
5050
options.showTestsCodeLens.should.equal(true);
5151
options.disableCodeActions.should.equal(false);
52-
expect(options.defaultLaunchSolution).to.be.undefined;
52+
options.minFindSymbolsFilterLength.should.equal(0);
53+
options.maxFindSymbolsItems.should.equal(1000);
54+
expect(options.defaultLaunchSolution).to.be.undefined;
5355
});
5456

5557
test('Gives the changed option when the omnisharp config changes', () => {

test/unitTests/options.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ suite("Options tests", () => {
2828
options.showTestsCodeLens.should.equal(true);
2929
options.disableCodeActions.should.equal(false);
3030
options.disableCodeActions.should.equal(false);
31+
options.minFindSymbolsFilterLength.should.equal(0);
32+
options.maxFindSymbolsItems.should.equal(1000);
3133
expect(options.defaultLaunchSolution).to.be.undefined;
3234
});
3335

0 commit comments

Comments
 (0)