From 83e1ac120c5aa863b56d9724562ada423bcf017d Mon Sep 17 00:00:00 2001 From: Vigilans Date: Mon, 25 Mar 2019 21:30:27 +0800 Subject: [PATCH 1/4] Append data result to error object generated on closing childProc --- src/utils/cpUtils.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/utils/cpUtils.ts b/src/utils/cpUtils.ts index 6e265e48..59e907b6 100644 --- a/src/utils/cpUtils.ts +++ b/src/utils/cpUtils.ts @@ -5,6 +5,10 @@ import * as cp from "child_process"; import * as vscode from "vscode"; import { leetCodeChannel } from "../leetCodeChannel"; +interface IExecError extends Error { + result?: string; +} + export async function executeCommand(command: string, args: string[], options: cp.SpawnOptions = { shell: true }): Promise { return new Promise((resolve: (res: string) => void, reject: (e: Error) => void): void => { let result: string = ""; @@ -20,9 +24,14 @@ export async function executeCommand(command: string, args: string[], options: c childProc.stderr.on("data", (data: string | Buffer) => leetCodeChannel.append(data.toString())); childProc.on("error", reject); + childProc.on("close", (code: number) => { if (code !== 0 || result.indexOf("ERROR") > -1) { - reject(new Error(`Command "${command} ${args.toString()}" failed with exit code "${code}".`)); + const error: IExecError = new Error(`Command "${command} ${args.toString()}" failed with exit code "${code}".`); + if (result) { + error.result = result; // leetcode-cli may print useful content by exit with error code + } + reject(error); } else { resolve(result); } From b39ee4406e5f94afb7f30a028fe97907b44e0373 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Mon, 25 Mar 2019 21:31:02 +0800 Subject: [PATCH 2/4] Return data result if error in submitSolution contains it --- src/leetCodeExecutor.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/leetCodeExecutor.ts b/src/leetCodeExecutor.ts index 263005c9..241b6251 100644 --- a/src/leetCodeExecutor.ts +++ b/src/leetCodeExecutor.ts @@ -111,7 +111,14 @@ class LeetCodeExecutor { } public async submitSolution(filePath: string): Promise { - return await this.executeCommandWithProgressEx("Submitting to LeetCode...", "node", [await this.getLeetCodeBinaryPath(), "submit", `"${filePath}"`]); + try { + return await this.executeCommandWithProgressEx("Submitting to LeetCode...", "node", [await this.getLeetCodeBinaryPath(), "submit", `"${filePath}"`]); + } catch (error) { + if (error.result) { + return error.result; + } + throw error; + } } public async testSolution(filePath: string, testString?: string): Promise { From bc56f784c7b8e04b0ea29f74bb7ebeb33e61b09a Mon Sep 17 00:00:00 2001 From: Vigilans Date: Mon, 25 Mar 2019 21:32:08 +0800 Subject: [PATCH 3/4] Check if language is set before querying for default language --- src/commands/show.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/show.ts b/src/commands/show.ts index e4553973..24d5d745 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -68,7 +68,7 @@ async function fetchProblemLanguage(): Promise { const language: string | undefined = defaultLanguage || await vscode.window.showQuickPick(languages, { placeHolder: "Select the language you want to use" }); // fire-and-forget default language query (async (): Promise => { - if (!defaultLanguage && leetCodeConfig.get("showSetDefaultLanguageHint")) { + if (language && !defaultLanguage && leetCodeConfig.get("showSetDefaultLanguageHint")) { const choice: vscode.MessageItem | undefined = await vscode.window.showInformationMessage( `Would you like to set '${language}' as your default language?`, DialogOptions.yes, From 128f14ea0dabd4d8c7cbc8c96ebe6a41223b27f9 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Tue, 26 Mar 2019 14:29:37 +0800 Subject: [PATCH 4/4] add `ignoreFoucsOut` in `fetchProblemLanguage` --- src/commands/show.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/show.ts b/src/commands/show.ts index 24d5d745..79c0fbbf 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -65,7 +65,7 @@ async function fetchProblemLanguage(): Promise { if (defaultLanguage && languages.indexOf(defaultLanguage) < 0) { defaultLanguage = undefined; } - const language: string | undefined = defaultLanguage || await vscode.window.showQuickPick(languages, { placeHolder: "Select the language you want to use" }); + const language: string | undefined = defaultLanguage || await vscode.window.showQuickPick(languages, { placeHolder: "Select the language you want to use", ignoreFocusOut: true }); // fire-and-forget default language query (async (): Promise => { if (language && !defaultLanguage && leetCodeConfig.get("showSetDefaultLanguageHint")) {