提交 c2114abf 编写于 作者: D Daniel Imms

Fix strict null checks in extHostTerminalService

Fixes #70415
上级 d0e0aa2d
...@@ -118,6 +118,7 @@ ...@@ -118,6 +118,7 @@
"./vs/workbench/api/node/extHostStatusBar.ts", "./vs/workbench/api/node/extHostStatusBar.ts",
"./vs/workbench/api/node/extHostStorage.ts", "./vs/workbench/api/node/extHostStorage.ts",
// "./vs/workbench/api/node/extHostTask.ts", // "./vs/workbench/api/node/extHostTask.ts",
"./vs/workbench/api/node/extHostTerminalService.ts",
"./vs/workbench/api/node/extHostTextEditor.ts", "./vs/workbench/api/node/extHostTextEditor.ts",
"./vs/workbench/api/node/extHostTextEditors.ts", "./vs/workbench/api/node/extHostTextEditors.ts",
"./vs/workbench/api/node/extHostTypeConverters.ts", "./vs/workbench/api/node/extHostTypeConverters.ts",
......
...@@ -370,7 +370,7 @@ export interface MainThreadProgressShape extends IDisposable { ...@@ -370,7 +370,7 @@ export interface MainThreadProgressShape extends IDisposable {
} }
export interface MainThreadTerminalServiceShape extends IDisposable { export interface MainThreadTerminalServiceShape extends IDisposable {
$createTerminal(name?: string, shellPath?: string, shellArgs?: string[], cwd?: string | UriComponents, env?: { [key: string]: string }, waitOnExit?: boolean, strictEnv?: boolean): Promise<{ id: number, name: string }>; $createTerminal(name?: string, shellPath?: string, shellArgs?: string[], cwd?: string | UriComponents, env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean): Promise<{ id: number, name: string }>;
$createTerminalRenderer(name: string): Promise<number>; $createTerminalRenderer(name: string): Promise<number>;
$dispose(terminalId: number): void; $dispose(terminalId: number): void;
$hide(terminalId: number): void; $hide(terminalId: number): void;
......
...@@ -74,9 +74,9 @@ export class BaseExtHostTerminal { ...@@ -74,9 +74,9 @@ export class BaseExtHostTerminal {
} }
export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Terminal { export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Terminal {
private _pidPromise: Promise<number>; private _pidPromise: Promise<number | undefined>;
private _pidPromiseComplete: (value: number) => any;
private _cols: number | undefined; private _cols: number | undefined;
private _pidPromiseComplete: ((value: number | undefined) => any) | null;
private _rows: number | undefined; private _rows: number | undefined;
private readonly _onData = new Emitter<string>(); private readonly _onData = new Emitter<string>();
...@@ -90,7 +90,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi ...@@ -90,7 +90,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi
constructor( constructor(
proxy: MainThreadTerminalServiceShape, proxy: MainThreadTerminalServiceShape,
private _name: string, private _name?: string,
id?: number, id?: number,
pid?: number pid?: number
) { ) {
...@@ -108,7 +108,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi ...@@ -108,7 +108,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi
shellPath?: string, shellPath?: string,
shellArgs?: string[], shellArgs?: string[],
cwd?: string | URI, cwd?: string | URI,
env?: { [key: string]: string }, env?: { [key: string]: string | null },
waitOnExit?: boolean, waitOnExit?: boolean,
strictEnv?: boolean strictEnv?: boolean
): void { ): void {
...@@ -119,7 +119,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi ...@@ -119,7 +119,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi
} }
public get name(): string { public get name(): string {
return this._name; return this._name || '';
} }
public set name(name: string) { public set name(name: string) {
...@@ -127,7 +127,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi ...@@ -127,7 +127,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi
} }
public get dimensions(): vscode.TerminalDimensions | undefined { public get dimensions(): vscode.TerminalDimensions | undefined {
if (this._cols === undefined && this._rows === undefined) { if (this._cols === undefined || this._rows === undefined) {
return undefined; return undefined;
} }
return { return {
...@@ -146,7 +146,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi ...@@ -146,7 +146,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi
return true; return true;
} }
public get processId(): Promise<number> { public get processId(): Promise<number | undefined> {
return this._pidPromise; return this._pidPromise;
} }
...@@ -165,7 +165,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi ...@@ -165,7 +165,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi
this._queueApiRequest(this._proxy.$hide, []); this._queueApiRequest(this._proxy.$hide, []);
} }
public _setProcessId(processId: number): void { public _setProcessId(processId: number | undefined): void {
// The event may fire 2 times when the panel is restored // The event may fire 2 times when the panel is restored
if (this._pidPromiseComplete) { if (this._pidPromiseComplete) {
this._pidPromiseComplete(processId); this._pidPromiseComplete(processId);
...@@ -203,15 +203,15 @@ export class ExtHostTerminalRenderer extends BaseExtHostTerminal implements vsco ...@@ -203,15 +203,15 @@ export class ExtHostTerminalRenderer extends BaseExtHostTerminal implements vsco
} }
private _dimensions: vscode.TerminalDimensions | undefined; private _dimensions: vscode.TerminalDimensions | undefined;
public get dimensions(): vscode.TerminalDimensions { return this._dimensions; } public get dimensions(): vscode.TerminalDimensions | undefined { return this._dimensions; }
public set dimensions(dimensions: vscode.TerminalDimensions) { public set dimensions(dimensions: vscode.TerminalDimensions | undefined) {
this._checkDisposed(); this._checkDisposed();
this._dimensions = dimensions; this._dimensions = dimensions;
this._queueApiRequest(this._proxy.$terminalRendererSetDimensions, [dimensions]); this._queueApiRequest(this._proxy.$terminalRendererSetDimensions, [dimensions]);
} }
private _maximumDimensions: vscode.TerminalDimensions; private _maximumDimensions: vscode.TerminalDimensions | undefined;
public get maximumDimensions(): vscode.TerminalDimensions { public get maximumDimensions(): vscode.TerminalDimensions | undefined {
if (!this._maximumDimensions) { if (!this._maximumDimensions) {
return undefined; return undefined;
} }
...@@ -259,20 +259,21 @@ export class ExtHostTerminalRenderer extends BaseExtHostTerminal implements vsco ...@@ -259,20 +259,21 @@ export class ExtHostTerminalRenderer extends BaseExtHostTerminal implements vsco
if (this._maximumDimensions && this._maximumDimensions.columns === columns && this._maximumDimensions.rows === rows) { if (this._maximumDimensions && this._maximumDimensions.columns === columns && this._maximumDimensions.rows === rows) {
return; return;
} }
this._maximumDimensions = { columns, rows }; const newValue = { columns, rows };
this._onDidChangeMaximumDimensions.fire(this.maximumDimensions); this._maximumDimensions = newValue;
this._onDidChangeMaximumDimensions.fire(newValue);
} }
} }
export class ExtHostTerminalService implements ExtHostTerminalServiceShape { export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
private _proxy: MainThreadTerminalServiceShape; private _proxy: MainThreadTerminalServiceShape;
private _activeTerminal: ExtHostTerminal; private _activeTerminal: ExtHostTerminal | undefined;
private _terminals: ExtHostTerminal[] = []; private _terminals: ExtHostTerminal[] = [];
private _terminalProcesses: { [id: number]: TerminalProcess } = {}; private _terminalProcesses: { [id: number]: TerminalProcess } = {};
private _terminalRenderers: ExtHostTerminalRenderer[] = []; private _terminalRenderers: ExtHostTerminalRenderer[] = [];
private _getTerminalPromises: { [id: number]: Promise<ExtHostTerminal> } = {}; private _getTerminalPromises: { [id: number]: Promise<ExtHostTerminal> } = {};
public get activeTerminal(): ExtHostTerminal { return this._activeTerminal; } public get activeTerminal(): ExtHostTerminal | undefined { return this._activeTerminal; }
public get terminals(): ExtHostTerminal[] { return this._terminals; } public get terminals(): ExtHostTerminal[] { return this._terminals; }
private readonly _onDidCloseTerminal: Emitter<vscode.Terminal> = new Emitter<vscode.Terminal>(); private readonly _onDidCloseTerminal: Emitter<vscode.Terminal> = new Emitter<vscode.Terminal>();
...@@ -326,6 +327,9 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { ...@@ -326,6 +327,9 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
} }
const terminal = this._getTerminalById(id); const terminal = this._getTerminalById(id);
if (!terminal) {
throw new Error(`Cannot resolve terminal renderer for terminal id ${id}`);
}
const renderer = new ExtHostTerminalRenderer(this._proxy, terminal.name, terminal, terminal._id); const renderer = new ExtHostTerminalRenderer(this._proxy, terminal.name, terminal, terminal._id);
this._terminalRenderers.push(renderer); this._terminalRenderers.push(renderer);
...@@ -339,6 +343,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { ...@@ -339,6 +343,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
if (original !== this._activeTerminal) { if (original !== this._activeTerminal) {
this._onDidChangeActiveTerminal.fire(this._activeTerminal); this._onDidChangeActiveTerminal.fire(this._activeTerminal);
} }
return;
} }
this._performTerminalIdAction(id, terminal => { this._performTerminalIdAction(id, terminal => {
if (terminal) { if (terminal) {
...@@ -364,7 +369,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { ...@@ -364,7 +369,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
if (terminal.setDimensions(cols, rows)) { if (terminal.setDimensions(cols, rows)) {
this._onDidChangeTerminalDimensions.fire({ this._onDidChangeTerminalDimensions.fire({
terminal: terminal, terminal: terminal,
dimensions: terminal.dimensions dimensions: terminal.dimensions as vscode.TerminalDimensions
}); });
} }
} }
...@@ -449,8 +454,8 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { ...@@ -449,8 +454,8 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
// this._configHelper.mergeDefaultShellPathAndArgs(shellLaunchConfig); // this._configHelper.mergeDefaultShellPathAndArgs(shellLaunchConfig);
const platformKey = platform.isWindows ? 'windows' : platform.isMacintosh ? 'osx' : 'linux'; const platformKey = platform.isWindows ? 'windows' : platform.isMacintosh ? 'osx' : 'linux';
const shellConfigValue: string = terminalConfig.get(`shell.${platformKey}`); const shellConfigValue: string | undefined = terminalConfig.get(`shell.${platformKey}`);
const shellArgsConfigValue: string = terminalConfig.get(`shellArgs.${platformKey}`); const shellArgsConfigValue: string | undefined = terminalConfig.get(`shellArgs.${platformKey}`);
shellLaunchConfig.executable = shellConfigValue; shellLaunchConfig.executable = shellConfigValue;
shellLaunchConfig.args = shellArgsConfigValue; shellLaunchConfig.args = shellArgsConfigValue;
...@@ -470,20 +475,24 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { ...@@ -470,20 +475,24 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
// Merge process env with the env from config // Merge process env with the env from config
const env = { ...process.env }; const env = { ...process.env };
terminalEnvironment.mergeEnvironments(env, envFromConfig); Object.keys(env).filter(k => env[k] === undefined).forEach(k => {
terminalEnvironment.mergeEnvironments(env, shellLaunchConfig.env); delete env[k];
});
const castedEnv = env as platform.IProcessEnvironment;
terminalEnvironment.mergeEnvironments(castedEnv, envFromConfig);
terminalEnvironment.mergeEnvironments(castedEnv, shellLaunchConfig.env);
// Sanitize the environment, removing any undesirable VS Code and Electron environment // Sanitize the environment, removing any undesirable VS Code and Electron environment
// variables // variables
sanitizeProcessEnvironment(env, 'VSCODE_IPC_HOOK_CLI'); sanitizeProcessEnvironment(castedEnv, 'VSCODE_IPC_HOOK_CLI');
// Continue env initialization, merging in the env from the launch // Continue env initialization, merging in the env from the launch
// config and adding keys that are needed to create the process // config and adding keys that are needed to create the process
terminalEnvironment.addTerminalEnvironmentKeys(env, pkg.version, platform.locale, terminalConfig.get('setLocaleVariables')); terminalEnvironment.addTerminalEnvironmentKeys(castedEnv, pkg.version, platform.locale, terminalConfig.get('setLocaleVariables') as boolean);
// Fork the process and listen for messages // Fork the process and listen for messages
this._logService.debug(`Terminal process launching on ext host`, shellLaunchConfig, initialCwd, cols, rows, env); this._logService.debug(`Terminal process launching on ext host`, shellLaunchConfig, initialCwd, cols, rows, castedEnv);
const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, terminalConfig.get('windowsEnableConpty')); const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, castedEnv, terminalConfig.get('windowsEnableConpty') as boolean);
p.onProcessIdReady(pid => this._proxy.$sendProcessPid(id, pid)); p.onProcessIdReady(pid => this._proxy.$sendProcessPid(id, pid));
p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title)); p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title));
p.onProcessData(data => this._proxy.$sendProcessData(id, data)); p.onProcessData(data => this._proxy.$sendProcessData(id, data));
...@@ -560,20 +569,20 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { ...@@ -560,20 +569,20 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
}); });
} }
private _getTerminalById(id: number): ExtHostTerminal { private _getTerminalById(id: number): ExtHostTerminal | null {
return this._getTerminalObjectById(this._terminals, id); return this._getTerminalObjectById(this._terminals, id);
} }
private _getTerminalRendererById(id: number): ExtHostTerminalRenderer { private _getTerminalRendererById(id: number): ExtHostTerminalRenderer | null {
return this._getTerminalObjectById(this._terminalRenderers, id); return this._getTerminalObjectById(this._terminalRenderers, id);
} }
private _getTerminalObjectById<T extends ExtHostTerminal | ExtHostTerminalRenderer>(array: T[], id: number): T { private _getTerminalObjectById<T extends ExtHostTerminal | ExtHostTerminalRenderer>(array: T[], id: number): T | null {
const index = this._getTerminalObjectIndexById(array, id); const index = this._getTerminalObjectIndexById(array, id);
return index !== null ? array[index] : null; return index !== null ? array[index] : null;
} }
private _getTerminalObjectIndexById<T extends ExtHostTerminal | ExtHostTerminalRenderer>(array: T[], id: number): number { private _getTerminalObjectIndexById<T extends ExtHostTerminal | ExtHostTerminalRenderer>(array: T[], id: number): number | null {
let index: number | null = null; let index: number | null = null;
array.some((item, i) => { array.some((item, i) => {
const thisId = item._id; const thisId = item._id;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册