From 27c9da47d49c5a40c945b82883a614e120f0f292 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Fri, 26 Apr 2019 21:13:18 +0800 Subject: [PATCH 1/8] Add problem pool to tree provider --- src/explorer/LeetCodeTreeDataProvider.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/explorer/LeetCodeTreeDataProvider.ts b/src/explorer/LeetCodeTreeDataProvider.ts index 09f47530..3cbc2584 100644 --- a/src/explorer/LeetCodeTreeDataProvider.ts +++ b/src/explorer/LeetCodeTreeDataProvider.ts @@ -14,6 +14,8 @@ import { LeetCodeNode } from "./LeetCodeNode"; export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider { + private problemPool: Map; // maintains the ownership of all problems. + private treeData: { Difficulty: Map, Tag: Map, @@ -32,6 +34,10 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider { if (element.id === "notSignIn") { return { @@ -102,6 +108,7 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider { // clear cache + this.problemPool = new Map(); this.treeData = { Difficulty: new Map(), Tag: new Map(), @@ -109,6 +116,8 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider Date: Fri, 26 Apr 2019 22:44:09 +0800 Subject: [PATCH 2/8] Make `LeetCodeTreeDataProvider` global variable pattern --- ...deTreeDataProvider.ts => leetCodeTreeDataProvider.ts} | 9 +++++++-- src/extension.ts | 6 +++--- 2 files changed, 10 insertions(+), 5 deletions(-) rename src/explorer/{LeetCodeTreeDataProvider.ts => leetCodeTreeDataProvider.ts} (97%) diff --git a/src/explorer/LeetCodeTreeDataProvider.ts b/src/explorer/leetCodeTreeDataProvider.ts similarity index 97% rename from src/explorer/LeetCodeTreeDataProvider.ts rename to src/explorer/leetCodeTreeDataProvider.ts index 3cbc2584..b4c95e57 100644 --- a/src/explorer/LeetCodeTreeDataProvider.ts +++ b/src/explorer/leetCodeTreeDataProvider.ts @@ -12,8 +12,9 @@ import { Category, defaultProblem, IProblem, ProblemState } from "../shared"; import { getWorkspaceConfiguration } from "../utils/workspaceUtils"; import { LeetCodeNode } from "./LeetCodeNode"; -export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider { +class LeetCodeTreeDataProvider implements vscode.TreeDataProvider { + private context: vscode.ExtensionContext; private problemPool: Map; // maintains the ownership of all problems. private treeData: { @@ -27,7 +28,9 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider = this.onDidChangeTreeDataEvent.event; - constructor(private context: vscode.ExtensionContext) { } + public initialize(context: vscode.ExtensionContext): void { + this.context = context; + } public async refresh(): Promise { await this.getProblemData(); @@ -274,3 +277,5 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider throw new Error("The environment doesn't meet requirements."); } + leetCodeTreeDataProvider.initialize(context); + leetCodeManager.on("statusChanged", () => { leetCodeStatusBarController.updateStatusBar(leetCodeManager.getStatus(), leetCodeManager.getUser()); leetCodeTreeDataProvider.refresh(); }); - const leetCodeTreeDataProvider: LeetCodeTreeDataProvider = new LeetCodeTreeDataProvider(context); - context.subscriptions.push( leetCodeStatusBarController, leetCodeChannel, From 0c6f73399e38179204571016d4b09f5164a438f6 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sat, 27 Apr 2019 00:13:15 +0800 Subject: [PATCH 3/8] Support showing description and solution from text document --- package.json | 12 ++++- src/codelens/CustomCodeLensProvider.ts | 8 +++ src/commands/show.ts | 67 ++++++++++++++++++-------- src/extension.ts | 5 +- src/leetCodeExecutor.ts | 12 +++-- 5 files changed, 75 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 7f8d6368..97f04c70 100644 --- a/package.json +++ b/package.json @@ -215,12 +215,20 @@ ], "editor/context": [ { - "command": "leetcode.testSolution", + "command": "leetcode.previewProblem", "group": "leetcode@1" }, { - "command": "leetcode.submitSolution", + "command": "leetcode.showSolution", "group": "leetcode@2" + }, + { + "command": "leetcode.testSolution", + "group": "leetcode@3" + }, + { + "command": "leetcode.submitSolution", + "group": "leetcode@4" } ] }, diff --git a/src/codelens/CustomCodeLensProvider.ts b/src/codelens/CustomCodeLensProvider.ts index 001ccc0b..af122ba7 100644 --- a/src/codelens/CustomCodeLensProvider.ts +++ b/src/codelens/CustomCodeLensProvider.ts @@ -25,6 +25,14 @@ export class CustomCodeLensProvider implements vscode.CodeLensProvider { title: "Test", command: "leetcode.testSolution", }), + new vscode.CodeLens(range, { + title: "Solution", + command: "leetcode.showSolution", + }), + new vscode.CodeLens(range, { + title: "Description", + command: "leetcode.previewProblem", + }), ]; } } diff --git a/src/commands/show.ts b/src/commands/show.ts index 1f7b7e52..ff2c34f0 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -6,20 +6,57 @@ import * as path from "path"; import * as unescapeJS from "unescape-js"; import * as vscode from "vscode"; import { LeetCodeNode } from "../explorer/LeetCodeNode"; +import { leetCodeTreeDataProvider } from "../explorer/LeetCodeTreeDataProvider"; import { leetCodeChannel } from "../leetCodeChannel"; import { leetCodeExecutor } from "../leetCodeExecutor"; import { leetCodeManager } from "../leetCodeManager"; import { IProblem, IQuickItemEx, languages, ProblemState } from "../shared"; import { DialogOptions, DialogType, promptForOpenOutputChannel, promptForSignIn } from "../utils/uiUtils"; -import { selectWorkspaceFolder } from "../utils/workspaceUtils"; +import { selectWorkspaceFolder, getActiveFilePath } from "../utils/workspaceUtils"; import * as wsl from "../utils/wslUtils"; import { leetCodePreviewProvider } from "../webview/leetCodePreviewProvider"; import { leetCodeSolutionProvider } from "../webview/leetCodeSolutionProvider"; import * as list from "./list"; -export async function previewProblem(node: IProblem, isSideMode: boolean = false): Promise { - const descString: string = await leetCodeExecutor.getDescription(node); - leetCodePreviewProvider.show(descString, node, isSideMode); +export async function previewProblem(source: IProblem | vscode.Uri | undefined, isSideMode: boolean = false): Promise { + try { + let problem: IProblem; + let descString: string; + if (source && "difficulty" in source) { + problem = source; + descString = await leetCodeExecutor.getDescription(problem.id); + } else { + const filename: string = (await getActiveFilePath(source))!; + const [meta, desc] = splitMetaOutput(await leetCodeExecutor.getDescription(filename)); + problem = leetCodeTreeDataProvider.getProblem(meta.id)!; + descString = desc; + isSideMode = true; + } + leetCodePreviewProvider.show(descString, problem, isSideMode); + } catch (error) { + leetCodeChannel.appendLine(error.toString()); + await promptForOpenOutputChannel("Failed to preview the problem. Please open the output channel for details.", DialogType.error); + } +} + +export async function showSolution(source: IProblem | vscode.Uri | undefined): Promise { + try { + let problem: IProblem; + let solutionString: string; + if (source && "difficulty" in source) { + problem = source; + solutionString = await leetCodeExecutor.showSolution(problem.id, await fetchProblemLanguage()); + } else { + const filename: string = (await getActiveFilePath(source))!; + const [meta] = splitMetaOutput(await leetCodeExecutor.getDescription(filename)); + problem = leetCodeTreeDataProvider.getProblem(meta.id)!; + solutionString = await leetCodeExecutor.showSolution(meta.id, meta.lang); + } + leetCodeSolutionProvider.show(unescapeJS(solutionString), problem); + } catch (error) { + leetCodeChannel.appendLine(error.toString()); + await promptForOpenOutputChannel("Failed to fetch the top voted solution. Please open the output channel for details.", DialogType.error); + } } export async function showProblem(node?: LeetCodeNode): Promise { @@ -47,23 +84,6 @@ export async function searchProblem(): Promise { await showProblemInternal(choice.value); } -export async function showSolution(node?: LeetCodeNode): Promise { - if (!node) { - return; - } - const language: string | undefined = await fetchProblemLanguage(); - if (!language) { - return; - } - try { - const solution: string = await leetCodeExecutor.showSolution(node, language); - leetCodeSolutionProvider.show(unescapeJS(solution), node); - } catch (error) { - leetCodeChannel.appendLine(error.toString()); - await promptForOpenOutputChannel("Failed to fetch the top voted solution. Please open the output channel for details.", DialogType.error); - } -} - // SUGGESTION: group config retriving into one file async function fetchProblemLanguage(): Promise { const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); @@ -146,6 +166,11 @@ async function parseProblemsToPicks(p: Promise): Promise vscode.commands.registerCommand("leetcode.signout", () => leetCodeManager.signOut()), vscode.commands.registerCommand("leetcode.selectSessions", () => session.selectSession()), vscode.commands.registerCommand("leetcode.createSession", () => session.createSession()), - vscode.commands.registerCommand("leetcode.previewProblem", (node: LeetCodeNode) => show.previewProblem(node)), + vscode.commands.registerCommand("leetcode.previewProblem", (source: IProblem | vscode.Uri) => show.previewProblem(source)), vscode.commands.registerCommand("leetcode.showProblem", (node: LeetCodeNode) => show.showProblem(node)), vscode.commands.registerCommand("leetcode.searchProblem", () => show.searchProblem()), - vscode.commands.registerCommand("leetcode.showSolution", (node: LeetCodeNode) => show.showSolution(node)), + vscode.commands.registerCommand("leetcode.showSolution", (source: IProblem | vscode.Uri) => show.showSolution(source)), vscode.commands.registerCommand("leetcode.refreshExplorer", () => leetCodeTreeDataProvider.refresh()), vscode.commands.registerCommand("leetcode.testSolution", (uri?: vscode.Uri) => test.testSolution(uri)), vscode.commands.registerCommand("leetcode.submitSolution", (uri?: vscode.Uri) => submit.submitSolution(uri)), diff --git a/src/leetCodeExecutor.ts b/src/leetCodeExecutor.ts index a142fbf2..f314976a 100644 --- a/src/leetCodeExecutor.ts +++ b/src/leetCodeExecutor.ts @@ -106,13 +106,17 @@ class LeetCodeExecutor implements Disposable { return filePath; } - public async showSolution(problemNode: IProblem, language: string): Promise { - const solution: string = await this.executeCommandWithProgressEx("Fetching top voted solution from discussions...", this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "show", problemNode.id, "--solution", "-l", language]); + public async showSolution(keyword: string, language?: string): Promise { + const args: string[] = [await this.getLeetCodeBinaryPath(), "show", keyword, "--solution"]; + if (language) { + args.push("-l", language); + } + const solution: string = await this.executeCommandWithProgressEx("Fetching top voted solution from discussions...", this.nodeExecutable, args); return solution; } - public async getDescription(problemNode: IProblem): Promise { - return await this.executeCommandWithProgressEx("Fetching problem description...", this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "show", problemNode.id, "-x"]); + public async getDescription(keyword: string): Promise { + return await this.executeCommandWithProgressEx("Fetching problem description...", this.nodeExecutable, [await this.getLeetCodeBinaryPath(), "show", keyword, "-x"]); } public async listSessions(): Promise { From 86b8d3622ea35017d83179563cee90c3ef1a6c20 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sat, 27 Apr 2019 00:20:48 +0800 Subject: [PATCH 4/8] Fix lint --- 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 ff2c34f0..ab1e0598 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -12,7 +12,7 @@ import { leetCodeExecutor } from "../leetCodeExecutor"; import { leetCodeManager } from "../leetCodeManager"; import { IProblem, IQuickItemEx, languages, ProblemState } from "../shared"; import { DialogOptions, DialogType, promptForOpenOutputChannel, promptForSignIn } from "../utils/uiUtils"; -import { selectWorkspaceFolder, getActiveFilePath } from "../utils/workspaceUtils"; +import { getActiveFilePath, selectWorkspaceFolder } from "../utils/workspaceUtils"; import * as wsl from "../utils/wslUtils"; import { leetCodePreviewProvider } from "../webview/leetCodePreviewProvider"; import { leetCodeSolutionProvider } from "../webview/leetCodeSolutionProvider"; From c230f752abdea8dddfcc0f86939709352334d7ec Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sat, 27 Apr 2019 00:29:11 +0800 Subject: [PATCH 5/8] Fix start case error --- src/commands/show.ts | 2 +- src/extension.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/show.ts b/src/commands/show.ts index ab1e0598..99f74f7c 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -6,7 +6,7 @@ import * as path from "path"; import * as unescapeJS from "unescape-js"; import * as vscode from "vscode"; import { LeetCodeNode } from "../explorer/LeetCodeNode"; -import { leetCodeTreeDataProvider } from "../explorer/LeetCodeTreeDataProvider"; +import { leetCodeTreeDataProvider } from "../explorer/leetCodeTreeDataProvider"; import { leetCodeChannel } from "../leetCodeChannel"; import { leetCodeExecutor } from "../leetCodeExecutor"; import { leetCodeManager } from "../leetCodeManager"; diff --git a/src/extension.ts b/src/extension.ts index ca281753..ec2d8520 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -11,7 +11,7 @@ import * as show from "./commands/show"; import * as submit from "./commands/submit"; import * as test from "./commands/test"; import { LeetCodeNode } from "./explorer/LeetCodeNode"; -import { leetCodeTreeDataProvider } from "./explorer/LeetCodeTreeDataProvider"; +import { leetCodeTreeDataProvider } from "./explorer/leetCodeTreeDataProvider"; import { leetCodeChannel } from "./leetCodeChannel"; import { leetCodeExecutor } from "./leetCodeExecutor"; import { leetCodeManager } from "./leetCodeManager"; From 23e5247ad8f337faff8f7dba38696fbfb87f72e5 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sat, 27 Apr 2019 17:54:04 +0800 Subject: [PATCH 6/8] Revert solution part --- package.json | 8 ++---- src/codelens/CustomCodeLensProvider.ts | 4 --- src/commands/show.ts | 38 ++++++++++++-------------- src/extension.ts | 2 +- src/leetCodeExecutor.ts | 8 ++---- 5 files changed, 23 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 97f04c70..62165b73 100644 --- a/package.json +++ b/package.json @@ -218,17 +218,13 @@ "command": "leetcode.previewProblem", "group": "leetcode@1" }, - { - "command": "leetcode.showSolution", - "group": "leetcode@2" - }, { "command": "leetcode.testSolution", - "group": "leetcode@3" + "group": "leetcode@2" }, { "command": "leetcode.submitSolution", - "group": "leetcode@4" + "group": "leetcode@3" } ] }, diff --git a/src/codelens/CustomCodeLensProvider.ts b/src/codelens/CustomCodeLensProvider.ts index af122ba7..405b0728 100644 --- a/src/codelens/CustomCodeLensProvider.ts +++ b/src/codelens/CustomCodeLensProvider.ts @@ -25,10 +25,6 @@ export class CustomCodeLensProvider implements vscode.CodeLensProvider { title: "Test", command: "leetcode.testSolution", }), - new vscode.CodeLens(range, { - title: "Solution", - command: "leetcode.showSolution", - }), new vscode.CodeLens(range, { title: "Description", command: "leetcode.previewProblem", diff --git a/src/commands/show.ts b/src/commands/show.ts index 99f74f7c..569448f8 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -39,26 +39,6 @@ export async function previewProblem(source: IProblem | vscode.Uri | undefined, } } -export async function showSolution(source: IProblem | vscode.Uri | undefined): Promise { - try { - let problem: IProblem; - let solutionString: string; - if (source && "difficulty" in source) { - problem = source; - solutionString = await leetCodeExecutor.showSolution(problem.id, await fetchProblemLanguage()); - } else { - const filename: string = (await getActiveFilePath(source))!; - const [meta] = splitMetaOutput(await leetCodeExecutor.getDescription(filename)); - problem = leetCodeTreeDataProvider.getProblem(meta.id)!; - solutionString = await leetCodeExecutor.showSolution(meta.id, meta.lang); - } - leetCodeSolutionProvider.show(unescapeJS(solutionString), problem); - } catch (error) { - leetCodeChannel.appendLine(error.toString()); - await promptForOpenOutputChannel("Failed to fetch the top voted solution. Please open the output channel for details.", DialogType.error); - } -} - export async function showProblem(node?: LeetCodeNode): Promise { if (!node) { return; @@ -84,6 +64,24 @@ export async function searchProblem(): Promise { await showProblemInternal(choice.value); } +export async function showSolution(node?: LeetCodeNode): Promise { + if (!node) { + return; + } + const language: string | undefined = await fetchProblemLanguage(); + if (!language) { + return; + } + try { + let solution: string = await leetCodeExecutor.showSolution(node, language); + // remove backslash in espaced \'...\'(generated by leetcode's database) + solution = solution.replace(/\\'/g, "'"); + await leetCodeSolutionProvider.show(solution, node); + } catch (error) { + await promptForOpenOutputChannel("Failed to fetch the top voted solution. Please open the output channel for details.", DialogType.error); + } +} + // SUGGESTION: group config retriving into one file async function fetchProblemLanguage(): Promise { const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); diff --git a/src/extension.ts b/src/extension.ts index ec2d8520..58ed0d7c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -55,7 +55,7 @@ export async function activate(context: vscode.ExtensionContext): Promise vscode.commands.registerCommand("leetcode.previewProblem", (source: IProblem | vscode.Uri) => show.previewProblem(source)), vscode.commands.registerCommand("leetcode.showProblem", (node: LeetCodeNode) => show.showProblem(node)), vscode.commands.registerCommand("leetcode.searchProblem", () => show.searchProblem()), - vscode.commands.registerCommand("leetcode.showSolution", (source: IProblem | vscode.Uri) => show.showSolution(source)), + vscode.commands.registerCommand("leetcode.showSolution", (node: IProblem) => show.showSolution(node)), vscode.commands.registerCommand("leetcode.refreshExplorer", () => leetCodeTreeDataProvider.refresh()), vscode.commands.registerCommand("leetcode.testSolution", (uri?: vscode.Uri) => test.testSolution(uri)), vscode.commands.registerCommand("leetcode.submitSolution", (uri?: vscode.Uri) => submit.submitSolution(uri)), diff --git a/src/leetCodeExecutor.ts b/src/leetCodeExecutor.ts index f314976a..77f44274 100644 --- a/src/leetCodeExecutor.ts +++ b/src/leetCodeExecutor.ts @@ -106,12 +106,8 @@ class LeetCodeExecutor implements Disposable { return filePath; } - public async showSolution(keyword: string, language?: string): Promise { - const args: string[] = [await this.getLeetCodeBinaryPath(), "show", keyword, "--solution"]; - if (language) { - args.push("-l", language); - } - const solution: string = await this.executeCommandWithProgressEx("Fetching top voted solution from discussions...", this.nodeExecutable, args); + public async showSolution(problemNode: IProblem, language: string): Promise { + const solution: string = await this.executeCommandWithProgressEx("Fetching top voted solution from discussions...", "node", [await this.getLeetCodeBinaryPath(), "show", problemNode.id, "--solution", "-l", language]); return solution; } From 92353489b6aa05329390d37c81e41f3c9296d820 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sat, 27 Apr 2019 17:57:36 +0800 Subject: [PATCH 7/8] Type correction --- src/extension.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 58ed0d7c..b0be5abd 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -52,10 +52,10 @@ export async function activate(context: vscode.ExtensionContext): Promise vscode.commands.registerCommand("leetcode.signout", () => leetCodeManager.signOut()), vscode.commands.registerCommand("leetcode.selectSessions", () => session.selectSession()), vscode.commands.registerCommand("leetcode.createSession", () => session.createSession()), - vscode.commands.registerCommand("leetcode.previewProblem", (source: IProblem | vscode.Uri) => show.previewProblem(source)), + vscode.commands.registerCommand("leetcode.previewProblem", (source: LeetCodeNode | vscode.Uri) => show.previewProblem(source)), vscode.commands.registerCommand("leetcode.showProblem", (node: LeetCodeNode) => show.showProblem(node)), vscode.commands.registerCommand("leetcode.searchProblem", () => show.searchProblem()), - vscode.commands.registerCommand("leetcode.showSolution", (node: IProblem) => show.showSolution(node)), + vscode.commands.registerCommand("leetcode.showSolution", (node: LeetCodeNode) => show.showSolution(node)), vscode.commands.registerCommand("leetcode.refreshExplorer", () => leetCodeTreeDataProvider.refresh()), vscode.commands.registerCommand("leetcode.testSolution", (uri?: vscode.Uri) => test.testSolution(uri)), vscode.commands.registerCommand("leetcode.submitSolution", (uri?: vscode.Uri) => submit.submitSolution(uri)), From f93b17b5ecf93a9ba6afdda371809536fffae646 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sat, 27 Apr 2019 18:00:03 +0800 Subject: [PATCH 8/8] Fix lint --- src/commands/show.ts | 7 +++---- src/extension.ts | 1 - 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/commands/show.ts b/src/commands/show.ts index 569448f8..3c0b5f2f 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -73,11 +73,10 @@ export async function showSolution(node?: LeetCodeNode): Promise { return; } try { - let solution: string = await leetCodeExecutor.showSolution(node, language); - // remove backslash in espaced \'...\'(generated by leetcode's database) - solution = solution.replace(/\\'/g, "'"); - await leetCodeSolutionProvider.show(solution, node); + const solution: string = await leetCodeExecutor.showSolution(node, language); + leetCodeSolutionProvider.show(unescapeJS(solution), node); } catch (error) { + leetCodeChannel.appendLine(error.toString()); await promptForOpenOutputChannel("Failed to fetch the top voted solution. Please open the output channel for details.", DialogType.error); } } diff --git a/src/extension.ts b/src/extension.ts index b0be5abd..84d83154 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -15,7 +15,6 @@ import { leetCodeTreeDataProvider } from "./explorer/leetCodeTreeDataProvider"; import { leetCodeChannel } from "./leetCodeChannel"; import { leetCodeExecutor } from "./leetCodeExecutor"; import { leetCodeManager } from "./leetCodeManager"; -import { IProblem } from "./shared"; import { leetCodeStatusBarController } from "./statusbar/leetCodeStatusBarController"; import { DialogType, promptForOpenOutputChannel } from "./utils/uiUtils"; import { leetCodePreviewProvider } from "./webview/leetCodePreviewProvider";