diff --git a/.gitignore b/.gitignore index 003c719..ee8071b 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,5 @@ out # Mac .DS_Store +nls.js +nls.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 11cf33e..fa1b34c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## version 2.17.1 + +- 增加调试需要参数快速选择按钮 + ## version 2.16.1 - 增加中英文多语言的配置 diff --git a/nls.ts b/nls.ts index 20a26fb..a8f1f09 100644 --- a/nls.ts +++ b/nls.ts @@ -44,8 +44,11 @@ function check_key(object, father: Array) { if (result_json[key]) { console.log("重复", key); } - result_json[key] = object["enumDescriptions"]; - object["enumDescriptions"] = `%${key}%`; + for (let e_index = 0; e_index < object["enumDescriptions"].length; e_index++) { + let b_key = key + `.${e_index}`; + result_json[b_key] = object["enumDescriptions"][e_index]; + } + // object["enumDescriptions"] = `%${key}%`; } } diff --git a/package.json b/package.json index a9f956f..851004e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-leetcode-problem-rating", "displayName": "LeetCode", "description": "%main.description%", - "version": "2.16.1", + "version": "2.17.1", "author": "ccagml", "publisher": "ccagml", "license": "MIT", @@ -1034,13 +1034,13 @@ "allcase" ], "enumDescriptions": [ - "Submit your answer to LeetCode.", - "Test your answer with customized test cases.", - "Star or unstar the current problem.", - "Show the top voted solution for the current problem.", - "Show the problem description page.", - "Test default case", - "Test all default case" + "%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.0%", + "%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.1%", + "%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.2%", + "%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.3%", + "%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.4%", + "%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.5%", + "%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.6%" ] }, "description": "%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.description%" @@ -1075,6 +1075,14 @@ "Score (Descending)", "ID (Descending)" ], + "enumDescriptions": [ + "%main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.0%", + "%main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.1%", + "%main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.2%", + "%main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.3%", + "%main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.4%", + "%main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.5%" + ], "description": "%main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.description%" }, "leetcode-problem-rating.pickOneByRankRangeMin": { @@ -1099,10 +1107,10 @@ "ScoreRange" ], "enumDescriptions": [ - "Don't hide", - "Hide questions with scores", - "Hide questions with no scores", - "Hide questions outside the range of scores [pickOneByRankRangeMin, pickOneByRankRangeMax]" + "%main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.0%", + "%main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.1%", + "%main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.2%", + "%main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.3%" ], "scope": "application", "description": "%main.contributes.configuration.properties.leetcode-problem-rating.hideScore.description%" @@ -1127,8 +1135,8 @@ "clang" ], "enumDescriptions": [ - "gdb compiler", - "clang compiler" + "%main.contributes.configuration.properties.leetcode-problem-rating.cppCompiler.enumDescriptions.0%", + "%main.contributes.configuration.properties.leetcode-problem-rating.cppCompiler.enumDescriptions.1%" ], "scope": "resource" } diff --git a/package.nls.json b/package.nls.json index f720e9f..b58d669 100644 --- a/package.nls.json +++ b/package.nls.json @@ -98,5 +98,24 @@ "main.contributes.configuration.properties.leetcode-problem-rating.cppCompiler.enumDescriptions": [ "gdb compiler", "clang compiler" - ] + ], + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.0": "None", + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.1": "Acceptance Rate (Ascending)", + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.2": "Acceptance Rate (Descending)", + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.3": "Score (Ascending)", + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.4": "Score (Descending)", + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.5": "ID (Descending)", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.0": "Submit your answer to LeetCode.", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.1": "Test your answer with customized test cases.", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.2": "Star or unstar the current problem.", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.3": "Show the top voted solution for the current problem.", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.4": "Show the problem description page.", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.5": "Test default case", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.6": "Test all default case", + "main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.0": "Don't hide", + "main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.1": "Hide questions with scores", + "main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.2": "Hide questions with no scores", + "main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.3": "Hide questions outside the range of scores [pickOneByRankRangeMin, pickOneByRankRangeMax]", + "main.contributes.configuration.properties.leetcode-problem-rating.cppCompiler.enumDescriptions.0": "gdb compiler", + "main.contributes.configuration.properties.leetcode-problem-rating.cppCompiler.enumDescriptions.1": "clang compiler" } diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index bfc334c..84887c3 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -98,5 +98,24 @@ "main.contributes.configuration.properties.leetcode-problem-rating.cppCompiler.enumDescriptions": [ "gdb compiler", "clang compiler" - ] + ], + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.0": "默认题目编号排序", + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.1": "通过率升序", + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.2": "通过率降序", + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.3": "分数升序", + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.4": "分数降序", + "main.contributes.configuration.properties.leetcode-problem-rating.problems.sortStrategy.enumDescriptions.5": "题目编号降序", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.0": "提交代码", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.1": "测试代码", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.2": "题目加喜爱", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.3": "获取题解", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.4": "展示题目介绍", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.5": "测试默认用例", + "main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.6": "测试所有用例", + "main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.0": "不处理", + "main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.1": "隐藏有分数的题目", + "main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.2": "隐藏没有分数的题目", + "main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.3": "隐藏分数在配置[pickOneByRankRangeMin, pickOneByRankRangeMax]范围外的题目", + "main.contributes.configuration.properties.leetcode-problem-rating.cppCompiler.enumDescriptions.0": "gdb编译", + "main.contributes.configuration.properties.leetcode-problem-rating.cppCompiler.enumDescriptions.1": "clang编译" } diff --git a/src/controller/DebugController.ts b/src/controller/DebugController.ts index c37fe81..29e9a9a 100644 --- a/src/controller/DebugController.ts +++ b/src/controller/DebugController.ts @@ -7,7 +7,7 @@ * Copyright (c) 2023 ccagml . All rights reserved */ -import { TextDocument, window } from "vscode"; +import { TextDocument, window, Range } from "vscode"; import { getTextEditorFilePathByUri } from "../utils/SystemUtils"; import * as fs from "fs"; import { fileMeta, ProblemMeta, supportDebugLanguages } from "../utils/problemUtils"; @@ -15,6 +15,8 @@ import { fileMeta, ProblemMeta, supportDebugLanguages } from "../utils/problemUt import { debugService } from "../service/DebugService"; import { debugArgDao } from "../dao/debugArgDao"; +import { IQuickItemEx } from "../model/Model"; + // 做杂活 class DebugContorller { constructor() {} @@ -66,6 +68,122 @@ class DebugContorller { // } } + + public async addDebugType(document: TextDocument, addType) { + const picks: Array> = [ + { label: "number", detail: "类型说明:数字", value: "number" }, + { label: "number[]", detail: "类型说明:数字数组", value: "number[]" }, + { label: "number[][]", detail: "类型说明:数字二维数组", value: "number[][]" }, + { label: "string", detail: "类型说明:字符串", value: "string" }, + { label: "string[]", detail: "类型说明:字符串数组", value: "string[]" }, + { label: "string[][]", detail: "类型说明:字符串二维数组", value: "string[][]" }, + { label: "ListNode", detail: "类型说明:链表", value: "ListNode" }, + { label: "ListNode[]", detail: "类型说明:链表数组", value: "ListNode[]" }, + { label: "character", detail: "类型说明:字节", value: "character" }, + { label: "character[]", detail: "类型说明:字节数组", value: "character[]" }, + { label: "character[][]", detail: "类型说明:字节二维数组", value: "character[][]" }, + { label: "NestedInteger[]", detail: "类型说明:数组", value: "NestedInteger[]" }, + { label: "MountainArray", detail: "类型说明:数组", value: "MountainArray" }, + { label: "TreeNode", detail: "类型说明:树节点", value: "TreeNode" }, + ]; + + const choice: IQuickItemEx | undefined = await window.showQuickPick(picks, { + title: "添加调试需要的参数", + matchOnDescription: false, + matchOnDetail: false, + placeHolder: "选择要添加的分类", + canPickMany: false, + }); + if (!choice) { + return; + } + + const content: string = document.getText(); + const matchResult: RegExpMatchArray | null = content.match(/@lc app=.* id=(.*) lang=(.*)/); + if (!matchResult || !matchResult[2]) { + return undefined; + } + // 搜集所有debug + let debugFlag: boolean = false; + for (let i: number = 0; i < document.lineCount; i++) { + const lineContent: string = document.lineAt(i).text; + + // 收集所有用例 + if (lineContent.indexOf("@lcpr-div-debug-arg-end") >= 0) { + debugFlag = false; + } + + if (debugFlag) { + let equal_index = lineContent.indexOf("="); + const last_index = document.lineAt(i).range.end.character; + if (addType == "paramTypes" && lineContent.indexOf("paramTypes=") >= 0) { + window.activeTextEditor?.edit((edit) => { + // 参数是个数组; + // edit.replace(new Position(i, equal_index + 1), choice.value); + let cur_param_str = lineContent.substring(equal_index + 1); + let cur_param_array: any = []; + try { + cur_param_array = JSON.parse(cur_param_str); + } catch (error) { + cur_param_array = []; + } + + cur_param_array.push(choice.value); + + edit.replace(new Range(i, equal_index + 1, i, last_index), JSON.stringify(cur_param_array)); + }); + } else if (addType == "returnType" && lineContent.indexOf("returnType=") >= 0) { + window.activeTextEditor?.edit((edit) => { + edit.replace(new Range(i, equal_index + 1, i, last_index), choice.value); + }); + } + } + + // 收集所有用例 + if (lineContent.indexOf("@lcpr-div-debug-arg-start") >= 0) { + debugFlag = true; + } + } + return; + } + public async resetDebugType(document: TextDocument, addType) { + const content: string = document.getText(); + const matchResult: RegExpMatchArray | null = content.match(/@lc app=.* id=(.*) lang=(.*)/); + if (!matchResult || !matchResult[2]) { + return undefined; + } + // 搜集所有debug + let debugFlag: boolean = false; + for (let i: number = 0; i < document.lineCount; i++) { + const lineContent: string = document.lineAt(i).text; + + // 收集所有用例 + if (lineContent.indexOf("@lcpr-div-debug-arg-end") >= 0) { + debugFlag = false; + } + + if (debugFlag) { + let equal_index = lineContent.indexOf("="); + const last_index = document.lineAt(i).range.end.character; + if (addType == "paramTypes" && lineContent.indexOf("paramTypes=") >= 0) { + window.activeTextEditor?.edit((edit) => { + let cur_param_array: any = []; + edit.replace(new Range(i, equal_index + 1, i, last_index), JSON.stringify(cur_param_array)); + }); + } else if (addType == "returnType" && lineContent.indexOf("returnType=") >= 0) { + window.activeTextEditor?.edit((edit) => { + edit.replace(new Range(i, equal_index + 1, i, last_index), ""); + }); + } + } + + // 收集所有用例 + if (lineContent.indexOf("@lcpr-div-debug-arg-start") >= 0) { + debugFlag = true; + } + } + return; + } } export const debugContorller: DebugContorller = new DebugContorller(); diff --git a/src/extension.ts b/src/extension.ts index 1a88131..a593c5b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -141,6 +141,12 @@ export async function activate(context: ExtensionContext): Promise { }), commands.registerCommand("lcpr.simpleDebug", (document: TextDocument, testCase?) => debugContorller.startDebug(document, testCase) + ), + commands.registerCommand("lcpr.addDebugType", (document: TextDocument, addType) => + debugContorller.addDebugType(document, addType) + ), + commands.registerCommand("lcpr.resetDebugType", (document: TextDocument, addType) => + debugContorller.resetDebugType(document, addType) ) ); diff --git a/src/service/FileButtonService.ts b/src/service/FileButtonService.ts index cee4d1f..5f9cc72 100644 --- a/src/service/FileButtonService.ts +++ b/src/service/FileButtonService.ts @@ -209,6 +209,51 @@ export class FileButtonService implements vscode.CodeLensProvider { return lineContent.substring(cut_pos); } + public createDebugButton(codeLensLine, document, lineContent): vscode.CodeLens[] { + // const last_index = document.lineAt(codeLensLine).range.end.character; + + const range: vscode.Range = new vscode.Range(codeLensLine + 1, 0, codeLensLine + 1, 0); + const temp_result: vscode.CodeLens[] = []; + + // paramTypes= [] + // returnType= + + if (lineContent.indexOf("paramTypes=") >= 0) { + temp_result.push( + new vscode.CodeLens(range, { + title: "addParam", + command: "lcpr.addDebugType", + arguments: [document, "paramTypes"], + }) + ); + temp_result.push( + new vscode.CodeLens(range, { + title: "resetParam", + command: "lcpr.resetDebugType", + arguments: [document, "paramTypes"], + }) + ); + } + + if (lineContent.indexOf("returnType=") >= 0) { + temp_result.push( + new vscode.CodeLens(range, { + title: "addReturn", + command: "lcpr.addDebugType", + arguments: [document, "returnType"], + }) + ); + temp_result.push( + new vscode.CodeLens(range, { + title: "resetReturn", + command: "lcpr.resetDebugType", + arguments: [document, "returnType"], + }) + ); + } + return temp_result; + } + public provideCodeLenses(document: vscode.TextDocument): vscode.ProviderResult { const content: string = document.getText(); const matchResult: RegExpMatchArray | null = content.match(/@lc app=.* id=(.*) lang=(.*)/); @@ -225,6 +270,8 @@ export class FileButtonService implements vscode.CodeLensProvider { const codeLens: vscode.CodeLens[] = []; let caseFlag: boolean = false; let curCase = ""; + // 搜集所有debug + let debugFlag: boolean = false; for (let i: number = 0; i < document.lineCount; i++) { const lineContent: string = document.lineAt(i).text; if (lineContent.indexOf("@lc code=end") >= 0) { @@ -248,6 +295,20 @@ export class FileButtonService implements vscode.CodeLensProvider { curCase = ""; caseFlag = false; } + + // 收集所有用例 + if (lineContent.indexOf("@lcpr-div-debug-arg-end") >= 0) { + debugFlag = false; + } + + if (debugFlag) { + this.createDebugButton(i, document, lineContent).forEach((x) => codeLens.push(x)); + } + + // 收集所有用例 + if (lineContent.indexOf("@lcpr-div-debug-arg-start") >= 0) { + debugFlag = true; + } } return codeLens;