Skip to content

Commit 4d38837

Browse files
authored
Move usages tool (microsoft#295139)
* feat: add UsagesTool for finding code symbol usages and implement related tests * feat: handle late-registered tools in LanguageModelToolsExtensionPointHandler * feat: enhance UsagesTool to utilize ISearchService for symbol searches and improve reference classification
1 parent 3eb326e commit 4d38837

File tree

7 files changed

+767
-4
lines changed

7 files changed

+767
-4
lines changed

src/vs/editor/common/languageFeatureRegistry.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { Emitter } from '../../base/common/event.js';
77
import { IDisposable, toDisposable } from '../../base/common/lifecycle.js';
88
import { ITextModel, shouldSynchronizeModel } from './model.js';
9-
import { LanguageFilter, LanguageSelector, score } from './languageSelector.js';
9+
import { LanguageFilter, LanguageSelector, score, selectLanguageIds } from './languageSelector.js';
1010
import { URI } from '../../base/common/uri.js';
1111

1212
interface Entry<T> {
@@ -115,6 +115,14 @@ export class LanguageFeatureRegistry<T> {
115115
return this._entries.map(entry => entry.provider);
116116
}
117117

118+
get registeredLanguageIds(): ReadonlySet<string> {
119+
const result = new Set<string>();
120+
for (const entry of this._entries) {
121+
selectLanguageIds(entry.selector, result);
122+
}
123+
return result;
124+
}
125+
118126
ordered(model: ITextModel, recursive = false): T[] {
119127
const result: T[] = [];
120128
this._orderedForEach(model, recursive, entry => result.push(entry.provider));
@@ -226,4 +234,3 @@ function isBuiltinSelector(selector: LanguageSelector): boolean {
226234

227235
return Boolean((selector as LanguageFilter).isBuiltin);
228236
}
229-

src/vs/editor/common/languageSelector.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,3 +142,18 @@ export function targetsNotebooks(selector: LanguageSelector): boolean {
142142
return !!(<LanguageFilter>selector).notebookType;
143143
}
144144
}
145+
146+
export function selectLanguageIds(selector: LanguageSelector, into: Set<string>): void {
147+
if (typeof selector === 'string') {
148+
into.add(selector);
149+
} else if (Array.isArray(selector)) {
150+
for (const item of selector) {
151+
selectLanguageIds(item, into);
152+
}
153+
} else {
154+
const language = (<LanguageFilter>selector).language;
155+
if (language) {
156+
into.add(language);
157+
}
158+
}
159+
}

src/vs/editor/test/common/modes/languageSelector.test.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import assert from 'assert';
77
import { URI } from '../../../../base/common/uri.js';
88
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
9-
import { LanguageSelector, score } from '../../../common/languageSelector.js';
9+
import { LanguageSelector, score, selectLanguageIds } from '../../../common/languageSelector.js';
1010

1111
suite('LanguageSelector', function () {
1212

@@ -173,4 +173,27 @@ suite('LanguageSelector', function () {
173173
}, obj.uri, obj.langId, true, undefined, undefined);
174174
assert.strictEqual(value, 0);
175175
});
176+
177+
test('selectLanguageIds', function () {
178+
const result = new Set<string>();
179+
180+
selectLanguageIds('typescript', result);
181+
assert.deepStrictEqual([...result], ['typescript']);
182+
183+
result.clear();
184+
selectLanguageIds({ language: 'python', scheme: 'file' }, result);
185+
assert.deepStrictEqual([...result], ['python']);
186+
187+
result.clear();
188+
selectLanguageIds({ scheme: 'file' }, result);
189+
assert.deepStrictEqual([...result], []);
190+
191+
result.clear();
192+
selectLanguageIds(['javascript', { language: 'css' }, { scheme: 'untitled' }], result);
193+
assert.deepStrictEqual([...result].sort(), ['css', 'javascript']);
194+
195+
result.clear();
196+
selectLanguageIds('*', result);
197+
assert.deepStrictEqual([...result], ['*']);
198+
});
176199
});

src/vs/workbench/contrib/chat/browser/chat.contribution.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import { IPromptsService } from '../common/promptSyntax/service/promptsService.j
6060
import { PromptsService } from '../common/promptSyntax/service/promptsServiceImpl.js';
6161
import { LanguageModelToolsExtensionPointHandler } from '../common/tools/languageModelToolsContribution.js';
6262
import { BuiltinToolsContribution } from '../common/tools/builtinTools/tools.js';
63+
import { UsagesToolContribution } from './tools/usagesTool.js';
6364
import { IVoiceChatService, VoiceChatService } from '../common/voiceChatService.js';
6465
import { registerChatAccessibilityActions } from './actions/chatAccessibilityActions.js';
6566
import { AgentChatAccessibilityHelp, EditsChatAccessibilityHelp, PanelChatAccessibilityHelp, QuickChatAccessibilityHelp } from './actions/chatAccessibilityHelp.js';
@@ -1422,6 +1423,7 @@ registerWorkbenchContribution2(ChatSetupContribution.ID, ChatSetupContribution,
14221423
registerWorkbenchContribution2(ChatTeardownContribution.ID, ChatTeardownContribution, WorkbenchPhase.AfterRestored);
14231424
registerWorkbenchContribution2(ChatStatusBarEntry.ID, ChatStatusBarEntry, WorkbenchPhase.BlockRestore);
14241425
registerWorkbenchContribution2(BuiltinToolsContribution.ID, BuiltinToolsContribution, WorkbenchPhase.Eventually);
1426+
registerWorkbenchContribution2(UsagesToolContribution.ID, UsagesToolContribution, WorkbenchPhase.BlockRestore);
14251427
registerWorkbenchContribution2(ChatAgentSettingContribution.ID, ChatAgentSettingContribution, WorkbenchPhase.AfterRestored);
14261428
registerWorkbenchContribution2(ChatAgentActionsContribution.ID, ChatAgentActionsContribution, WorkbenchPhase.Eventually);
14271429
registerWorkbenchContribution2(ToolReferenceNamesContribution.ID, ToolReferenceNamesContribution, WorkbenchPhase.AfterRestored);

0 commit comments

Comments
 (0)