Skip to content

Commit 70a7ef1

Browse files
authored
debt - start to reduce explicit any in my code (microsoft#269479)
1 parent 8c9771f commit 70a7ef1

29 files changed

Lines changed: 217 additions & 112 deletions

File tree

eslint.config.js

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,93 @@ export default tseslint.config(
177177
]
178178
}
179179
},
180+
// vscode TS: strict no explicit `any`
181+
{
182+
files: [
183+
'src/vs/base/common/extpath.ts',
184+
'src/vs/base/common/glob.ts',
185+
'src/vs/base/common/path.ts',
186+
'src/vs/base/common/stream.ts',
187+
'src/vs/base/node/pfs.ts',
188+
'src/vs/base/parts/contextmenu/**',
189+
// 'src/vs/base/parts/ipc/**',
190+
// 'src/vs/base/parts/sandbox/**',
191+
'src/vs/base/parts/storage/**',
192+
'src/vs/platform/auxiliaryWindow/**',
193+
// 'src/vs/platform/backup/**',
194+
// 'src/vs/platform/editor/**',
195+
// 'src/vs/platform/environment/**',
196+
// 'src/vs/platform/files/**',
197+
// 'src/vs/platform/ipc/**',
198+
// 'src/vs/platform/launch/**',
199+
// 'src/vs/platform/lifecycle/**',
200+
// 'src/vs/platform/menubar/**',
201+
// 'src/vs/platform/native/**',
202+
// 'src/vs/platform/sharedProcess/**',
203+
// 'src/vs/platform/state/**',
204+
// 'src/vs/platform/storage/**',
205+
// 'src/vs/platform/utilityProcess/**',
206+
// 'src/vs/platform/window/**',
207+
// 'src/vs/platform/windows/**',
208+
// 'src/vs/platform/workspace/**',
209+
// 'src/vs/platform/workspaces/**',
210+
'src/bootstrap-cli.ts',
211+
'src/bootstrap-esm.ts',
212+
'src/bootstrap-fork.ts',
213+
'src/bootstrap-import.ts',
214+
'src/bootstrap-meta.ts',
215+
'src/bootstrap-node.ts',
216+
'src/bootstrap-server.ts',
217+
'src/cli.ts',
218+
'src/main.ts',
219+
'src/server-cli.ts',
220+
'src/server-main.ts',
221+
'src/vs/code/**',
222+
'src/vs/workbench/services/activity/**',
223+
'src/vs/workbench/services/auxiliaryWindow/**',
224+
'src/vs/workbench/services/chat/**',
225+
'src/vs/workbench/services/contextmenu/**',
226+
'src/vs/workbench/services/dialogs/**',
227+
'src/vs/workbench/services/editor/**',
228+
// 'src/vs/workbench/services/environment/**',
229+
'src/vs/workbench/services/files/**',
230+
'src/vs/workbench/services/filesConfiguration/**',
231+
'src/vs/workbench/services/history/**',
232+
'src/vs/workbench/services/host/**',
233+
'src/vs/workbench/services/label/**',
234+
'src/vs/workbench/services/layout/**',
235+
'src/vs/workbench/services/lifecycle/**',
236+
'src/vs/workbench/services/notification/**',
237+
'src/vs/workbench/services/path/**',
238+
'src/vs/workbench/services/progress/**',
239+
// 'src/vs/workbench/services/storage/**',
240+
// 'src/vs/workbench/services/textfile/**',
241+
// 'src/vs/workbench/services/textmodelResolver/**',
242+
// 'src/vs/workbench/services/untitled/**',
243+
// 'src/vs/workbench/services/utilityProcess/**',
244+
// 'src/vs/workbench/services/views/**',
245+
// 'src/vs/workbench/services/workingCopy/**',
246+
// 'src/vs/workbench/services/workspaces/**',
247+
// 'src/vs/workbench/common/**',
248+
// 'src/vs/workbench/browser/**',
249+
// 'src/vs/workbench/electron-browser/**',
250+
// 'src/vs/workbench/contrib/files/**',
251+
],
252+
languageOptions: {
253+
parser: tseslint.parser,
254+
},
255+
plugins: {
256+
'@typescript-eslint': tseslint.plugin,
257+
},
258+
rules: {
259+
'@typescript-eslint/no-explicit-any': [
260+
'warn',
261+
{
262+
'ignoreRestArgs': false
263+
}
264+
]
265+
}
266+
},
180267
// Tests
181268
{
182269
files: [

src/bootstrap-import.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export async function initialize(injectPath: string): Promise<void> {
4747
console.log(`[bootstrap-import] Initialized node_modules redirector for: ${injectPath}`);
4848
}
4949

50-
export async function resolve(specifier: string | number, context: any, nextResolve: (arg0: any, arg1: any) => any) {
50+
export async function resolve(specifier: string | number, context: unknown, nextResolve: (arg0: unknown, arg1: unknown) => unknown) {
5151

5252
const newSpecifier = _specifierToUrl[specifier];
5353
if (newSpecifier !== undefined) {

src/bootstrap-node.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export function removeGlobalNodeJsModuleLookupPaths(): void {
8383

8484
const originalResolveLookupPaths = Module._resolveLookupPaths;
8585

86-
Module._resolveLookupPaths = function (moduleName: string, parent: any): string[] {
86+
Module._resolveLookupPaths = function (moduleName: string, parent: unknown): string[] {
8787
const paths = originalResolveLookupPaths(moduleName, parent);
8888
if (Array.isArray(paths)) {
8989
let commonSuffixLength = 0;

src/main.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,7 @@ function registerListeners(): void {
582582
* the app-ready event. We listen very early for open-file and remember this upon startup as path to open.
583583
*/
584584
const macOpenFiles: string[] = [];
585-
// eslint-disable-next-line local/code-no-any-casts
586-
(globalThis as any)['macOpenFiles'] = macOpenFiles;
585+
(globalThis as { macOpenFiles?: string[] }).macOpenFiles = macOpenFiles;
587586
app.on('open-file', function (event, path) {
588587
macOpenFiles.push(path);
589588
});
@@ -603,8 +602,7 @@ function registerListeners(): void {
603602
app.on('open-url', onOpenUrl);
604603
});
605604

606-
// eslint-disable-next-line local/code-no-any-casts
607-
(globalThis as any)['getOpenUrls'] = function () {
605+
(globalThis as { getOpenUrls?: () => string[] }).getOpenUrls = function () {
608606
app.removeListener('open-url', onOpenUrl);
609607

610608
return openUrls;

src/server-main.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ import { INLSConfiguration } from './vs/nls.js';
2020
import { IServerAPI } from './vs/server/node/remoteExtensionHostAgentServer.js';
2121

2222
perf.mark('code/server/start');
23-
// eslint-disable-next-line local/code-no-any-casts
24-
(globalThis as any).vscodeServerStartTime = performance.now();
23+
(globalThis as { vscodeServerStartTime?: number }).vscodeServerStartTime = performance.now();
2524

2625
// Do a quick parse to determine if a server or the cli needs to be started
2726
const parsedArgs = minimist(process.argv.slice(2), {
@@ -139,8 +138,7 @@ if (shouldSpawnCli) {
139138
console.log(output);
140139

141140
perf.mark('code/server/started');
142-
// eslint-disable-next-line local/code-no-any-casts
143-
(globalThis as any).vscodeServerListenTime = performance.now();
141+
(globalThis as { vscodeServerListenTime?: number }).vscodeServerListenTime = performance.now();
144142

145143
await getRemoteExtensionHostAgentServer();
146144
});
@@ -153,7 +151,7 @@ if (shouldSpawnCli) {
153151
});
154152
}
155153

156-
function sanitizeStringArg(val: any): string | undefined {
154+
function sanitizeStringArg(val: unknown): string | undefined {
157155
if (Array.isArray(val)) { // if an argument is passed multiple times, minimist creates an array
158156
val = val.pop(); // take the last item
159157
}

src/vs/base/common/stream.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -331,14 +331,14 @@ class WriteableStreamImpl<T> implements WriteableStream<T> {
331331
on(event: 'data', callback: (data: T) => void): void;
332332
on(event: 'error', callback: (err: Error) => void): void;
333333
on(event: 'end', callback: () => void): void;
334-
on(event: 'data' | 'error' | 'end', callback: (arg0?: any) => void): void {
334+
on(event: 'data' | 'error' | 'end', callback: ((data: T) => void) | ((err: Error) => void) | (() => void)): void {
335335
if (this.state.destroyed) {
336336
return;
337337
}
338338

339339
switch (event) {
340340
case 'data':
341-
this.listeners.data.push(callback);
341+
this.listeners.data.push(callback as (data: T) => void);
342342

343343
// switch into flowing mode as soon as the first 'data'
344344
// listener is added and we are not yet in flowing mode
@@ -347,7 +347,7 @@ class WriteableStreamImpl<T> implements WriteableStream<T> {
347347
break;
348348

349349
case 'end':
350-
this.listeners.end.push(callback);
350+
this.listeners.end.push(callback as () => void);
351351

352352
// emit 'end' event directly if we are flowing
353353
// and the end has already been reached
@@ -360,7 +360,7 @@ class WriteableStreamImpl<T> implements WriteableStream<T> {
360360
break;
361361

362362
case 'error':
363-
this.listeners.error.push(callback);
363+
this.listeners.error.push(callback as (err: Error) => void);
364364

365365
// emit buffered 'error' events unless done already
366366
// now that we know that we have at least one listener

src/vs/base/parts/contextmenu/electron-browser/contextmenu.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@ export function popup(items: IContextMenuItem[], options?: IPopupOptions, onHide
1313

1414
const contextMenuId = contextMenuIdPool++;
1515
const onClickChannel = `vscode:onContextMenu${contextMenuId}`;
16-
const onClickChannelHandler = (event: unknown, itemId: number, context: IContextMenuEvent) => {
16+
const onClickChannelHandler = (_event: unknown, ...args: unknown[]) => {
17+
const itemId = args[0] as number;
18+
const context = args[1] as IContextMenuEvent;
1719
const item = processedItems[itemId];
1820
item.click?.(context);
1921
};
2022

2123
ipcRenderer.once(onClickChannel, onClickChannelHandler);
22-
ipcRenderer.once(CONTEXT_MENU_CLOSE_CHANNEL, (event: unknown, closedContextMenuId: number) => {
24+
ipcRenderer.once(CONTEXT_MENU_CLOSE_CHANNEL, (_event: unknown, ...args: unknown[]) => {
25+
const closedContextMenuId = args[0] as number;
2326
if (closedContextMenuId !== contextMenuId) {
2427
return;
2528
}

src/vs/base/parts/sandbox/electron-browser/electronTypes.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,17 @@ export interface IpcRenderer {
6666
* returned by `invoke` will reject. However, the `Error` object in the renderer
6767
* process will not be the same as the one thrown in the main process.
6868
*/
69-
invoke(channel: string, ...args: any[]): Promise<any>;
69+
invoke(channel: string, ...args: unknown[]): Promise<unknown>;
7070
/**
7171
* Listens to `channel`, when a new message arrives `listener` would be called with
7272
* `listener(event, args...)`.
7373
*/
74-
on(channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void): this;
74+
on(channel: string, listener: (event: IpcRendererEvent, ...args: unknown[]) => void): this;
7575
/**
7676
* Adds a one time `listener` function for the event. This `listener` is invoked
7777
* only the next time a message is sent to `channel`, after which it is removed.
7878
*/
79-
once(channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void): this;
79+
once(channel: string, listener: (event: IpcRendererEvent, ...args: unknown[]) => void): this;
8080
// Note: API with `Transferable` intentionally commented out because you
8181
// cannot transfer these when `contextIsolation: true`.
8282
// /**
@@ -92,12 +92,12 @@ export interface IpcRenderer {
9292
// * For more information on using `MessagePort` and `MessageChannel`, see the MDN
9393
// * documentation.
9494
// */
95-
// postMessage(channel: string, message: any, transfer?: MessagePort[]): void;
95+
// postMessage(channel: string, message: unknown, transfer?: MessagePort[]): void;
9696
/**
9797
* Removes the specified `listener` from the listener array for the specified
9898
* `channel`.
9999
*/
100-
removeListener(channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void): this;
100+
removeListener(channel: string, listener: (event: IpcRendererEvent, ...args: unknown[]) => void): this;
101101
/**
102102
* Send an asynchronous message to the main process via `channel`, along with
103103
* arguments. Arguments will be serialized with the Structured Clone Algorithm,
@@ -122,7 +122,7 @@ export interface IpcRenderer {
122122
* If you want to receive a single response from the main process, like the result
123123
* of a method call, consider using `ipcRenderer.invoke`.
124124
*/
125-
send(channel: string, ...args: any[]): void;
125+
send(channel: string, ...args: unknown[]): void;
126126
}
127127

128128
export interface WebFrame {

src/vs/base/parts/sandbox/electron-browser/globals.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,18 @@ export interface ISandboxContext {
115115
resolveConfiguration(): Promise<ISandboxConfiguration>;
116116
}
117117

118-
// eslint-disable-next-line local/code-no-any-casts
119-
const vscodeGlobal = (globalThis as any).vscode;
118+
interface ISandboxGlobal {
119+
vscode: {
120+
readonly ipcRenderer: IpcRenderer;
121+
readonly ipcMessagePort: IpcMessagePort;
122+
readonly webFrame: WebFrame;
123+
readonly process: ISandboxNodeProcess;
124+
readonly context: ISandboxContext;
125+
readonly webUtils: WebUtils;
126+
};
127+
}
128+
129+
const vscodeGlobal = (globalThis as unknown as ISandboxGlobal).vscode;
120130
export const ipcRenderer: IpcRenderer = vscodeGlobal.ipcRenderer;
121131
export const ipcMessagePort: IpcMessagePort = vscodeGlobal.ipcMessagePort;
122132
export const webFrame: WebFrame = vscodeGlobal.webFrame;

src/vs/base/parts/sandbox/electron-browser/preload-aux.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323
*/
2424
ipcRenderer: {
2525

26-
send(channel: string, ...args: any[]): void {
26+
send(channel: string, ...args: unknown[]): void {
2727
if (validateIPC(channel)) {
2828
ipcRenderer.send(channel, ...args);
2929
}
3030
},
3131

32-
invoke(channel: string, ...args: any[]): Promise<any> {
32+
invoke(channel: string, ...args: unknown[]): Promise<unknown> {
3333
validateIPC(channel);
3434

3535
return ipcRenderer.invoke(channel, ...args);

0 commit comments

Comments
 (0)