Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
f624295
feat: 添加强制关闭功能,优化终端显示和日志处理
BernardXiong Aug 26, 2025
bcb0083
feat: 增加分析elf文件功能
Sep 1, 2025
d873b80
feat: git忽略测试文件
Sep 2, 2025
3c6e37e
删除rtthread.elf
Sep 2, 2025
207a88c
删除rtthread.map
Sep 2, 2025
99d358a
feat: 增加分析elf文件功能
Sep 2, 2025
bb7b298
Merge branch 'sunxianfu' into 'dev'
BernardXiong Sep 2, 2025
e51b5a4
Merge branch 'dev' of https://support.rt-thread.com/cooperation/vscod…
BernardXiong Sep 2, 2025
7f062ea
fix: 修复路径问题
Sep 3, 2025
729b101
Merge branch 'sunxianfu' of https://support.rt-thread.com/cooperation…
Sep 3, 2025
80872f5
feat: 优化交互
Sep 4, 2025
81e754d
Merge remote-tracking branch 'origin/dev' into sunxianfu
Sep 4, 2025
076c91c
Merge branch 'sunxianfu' into 'dev'
BernardXiong Sep 4, 2025
5403efa
Merge branch 'dev' of https://support.rt-thread.com/cooperation/vscod…
BernardXiong Sep 4, 2025
8ea6046
feat: 1.增加banner主题切换 2.优化表格滚动 3. 优化图标
Sep 5, 2025
6802bcd
Merge branch 'dev' of https://support.rt-thread.com/cooperation/vscod…
BernardXiong Sep 5, 2025
3f3c19e
Merge branch 'sunxianfu' into 'dev'
BernardXiong Sep 5, 2025
09f122c
feat: Enhance ELF symbol handling and UI improvements
BernardXiong Sep 6, 2025
3e9f209
feat: Implement DWARF parsing and integrate symbol debug info retrieval
BernardXiong Sep 6, 2025
e953d62
feat: Enhance symbol handling by excluding OBJECT types from source n…
BernardXiong Sep 6, 2025
6334a52
feat: Implement theme variables and apply consistent styling across c…
BernardXiong Sep 6, 2025
8232ce4
feat: Adjust table max-height and update Banner component styles for …
BernardXiong Sep 6, 2025
92b8b5e
Merge remote-tracking branch 'bernard/dev' into dev
BernardXiong Sep 6, 2025
c0d434f
feat: 添加 XTerminal 组件并在环境和 SDK 页面中集成
BernardXiong Sep 8, 2025
01fb094
Refactor styles to use LESS for improved maintainability and consiste…
BernardXiong Sep 8, 2025
1753a14
更新 CLAUDE.md,添加 SDK 配置文件说明并调整重要说明部分的格式
BernardXiong Sep 8, 2025
8701e14
Merge branch 'dev' of https://support.rt-thread.com/cooperation/vscod…
BernardXiong Sep 8, 2025
9a33a64
feat: 处理主题色
Sep 13, 2025
33cc918
Merge branch 'sunxianfu' into 'dev'
BernardXiong Sep 13, 2025
737533c
Merge branch 'dev' of https://support.rt-thread.com/cooperation/vscod…
BernardXiong Sep 13, 2025
ac1727d
修正代码规范,确保符合TS的规范
BernardXiong Oct 2, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,6 @@ ref/
# Auto-generated type declaration files
src/vue/auto-imports.d.ts
src/vue/components.d.ts

rtthread.elf
rtthread.map
14 changes: 8 additions & 6 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,13 @@ npm run build # Production build

4. **虚拟环境** (`src/venv.ts`):
- Windows 特定的 Python 虚拟环境设置
- 管理 env 脚本安装

### 配置文件
- **`.vscode/workspace.json`**: 多 BSP 工作区配置
- **`.vscode/project.json`**: 单个项目文件结构(由 scons 生成)
- **`~/.env/cfg.json`**: RT-Thread 源码路径配置
- **`~/.env/tools/scripts/sdk_cfg.json`**: 工具链配置
- **`~/.env/tools/scripts/.config`**: SDK的配置情况,指示出来哪些SDK包安装了

### 构建系统
- TypeScript 编译为 CommonJS 用于 VS Code 扩展
Expand All @@ -84,8 +84,10 @@ npm run build # Production build

## 重要说明

1. 扩展仅在 RT-Thread 项目中激活(包含 `rtconfig.h` 或工作区配置)
2. Windows 系统在首次运行时需要设置 Python 虚拟环境
3. 必须先构建 Vue 前端再编译扩展
4. 扩展集成了 Python 扩展(`ms-python.python`)
5. 文件装饰器在工作区模式下标记当前活动的 BSP
1. Windows 系统在首次运行时需要设置 Python 虚拟环境
2. 必须先构建 Vue 前端再编译扩展
3. 扩展集成了 Python 扩展(`ms-python.python`)
4. 文件装饰器在工作区模式下标记当前活动的 BSP
5. 代码尽可能精简,尽可能做到复用。
6. @src/vue 放置的是vscode扩展的前端页面,都是使用vue + element plus的方式实现,同时样式风格也完全使用常规意义的element plus样式风格。并且 @src/vue 的代码也完全重用根目录下的 node_modules 而不新开 node_modules。
7. @src/webviews 放置的是和vscode扩展前端页面对应的vscode扩展后端。
7,325 changes: 5,338 additions & 1,987 deletions package-lock.json

Large diffs are not rendered by default.

11 changes: 9 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,11 @@
"test": "vscode-test"
},
"dependencies": {
"@bugsplat/elfy": "^1.0.1",
"@vue/shared": "^3.x.x",
"element-plus": "^2.4.2",
"elfjs": "^2.2.0",
"elfy": "^1.0.0",
"marked": "^14.1.3",
"vue": "^3.3.8",
"vue-router": "^4.5.0"
Expand All @@ -197,8 +200,11 @@
],
"devDependencies": {
"@types/mocha": "^10.0.7",
"@types/node": "20.x",
"@types/node": "^20.19.11",
"@types/vscode": "^1.96.0",
"@types/jest": "^29.5.12",
"jest": "^29.7.0",
"ts-jest": "^29.1.2",
"@typescript-eslint/eslint-plugin": "^8.3.0",
"@typescript-eslint/parser": "^8.3.0",
"@vitejs/plugin-vue": "^5.2.1",
Expand All @@ -208,7 +214,8 @@
"less": "^4.2.2",
"svgo": "^4.0.0",
"terser": "^5.43.1",
"typescript": "^5.5.4",
"ts-node": "^10.9.2",
"typescript": "^5.8.3",
"unplugin-auto-import": "^19.3.0",
"unplugin-vue-components": "^28.8.0",
"vite": "^6.0.11",
Expand Down
2 changes: 1 addition & 1 deletion src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ export function writeJsonObject(jsonObject: any, fn:string) {
export async function openFolder(uri?: string) {
let selectedFolder:vscode.Uri[] | undefined;

if (uri != undefined) {
if (uri !== undefined) {
selectedFolder = await vscode.window.showOpenDialog({
defaultUri: vscode.Uri.file(uri),
canSelectFolders: true,
Expand Down
8 changes: 4 additions & 4 deletions src/cmds/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export let cmds: Object = {
],
name: 'Build',
iconId: 'github-action',
label: 'build',
label: 'Build',
isExpanded: true
},
Settings : {
Expand Down Expand Up @@ -84,7 +84,7 @@ export let cmds: Object = {
],
name: 'Settings',
iconId: 'gear',
label: 'settings',
label: 'Settings',
isExpanded: true
},
Packages : {
Expand Down Expand Up @@ -112,7 +112,7 @@ export let cmds: Object = {
],
name: 'Packages',
iconId: 'extensions',
label: 'packages',
label: 'Packages',
isExpanded: false
}
}
};
52 changes: 32 additions & 20 deletions src/dock.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import path from 'path';
import path from 'path';
import * as vscode from 'vscode';
import os from 'os';
import fs from 'fs';
Expand All @@ -14,24 +14,24 @@ class CmdTreeDataProvider implements vscode.TreeDataProvider<vscode.TreeItem> {
getChildren(element?: vscode.TreeItem): vscode.ProviderResult<vscode.TreeItem[]> {
const isRTT = isRTThreadProject();
const isRTTWorksapce = isRTThreadWorksapce();
if (isRTT != true && isRTTWorksapce != true) {
if (isRTT !== true && isRTTWorksapce !== true) {
console.log("not RT-Thread project or workspace, return empty tree item.");
}

if (isRTThreadProject() != true && isRTThreadWorksapce() != true) {
if (isRTThreadProject() !== true && isRTThreadWorksapce() !== true) {
// only show Create Project and RT-Thread Setting command when not in RT-Thread project
let createProject = new vscode.TreeItem("create project", vscode.TreeItemCollapsibleState.None);
let createProject = new vscode.TreeItem("Create Project", vscode.TreeItemCollapsibleState.None);
createProject.iconPath = new vscode.ThemeIcon("new-folder");
createProject.label = "create project";
createProject.label = "Create Project";
createProject.command = {
command: "extension.showCreateProject",
title: "show create project page",
arguments: [],
};

let rtSetting = new vscode.TreeItem("rt-thread setting", vscode.TreeItemCollapsibleState.None);
let rtSetting = new vscode.TreeItem("RT-Thread Setting", vscode.TreeItemCollapsibleState.None);
rtSetting.iconPath = new vscode.ThemeIcon("settings-gear");
rtSetting.label = "rt-thread setting";
rtSetting.label = "RT-Thread Setting";
rtSetting.command = {
command: "extension.showSetting",
title: "show rt-thread setting page",
Expand All @@ -45,7 +45,7 @@ class CmdTreeDataProvider implements vscode.TreeDataProvider<vscode.TreeItem> {
command: "extension.showAbout",
title: "show about page",
arguments: [],
}
};

return [createProject, rtSetting, about];
}
Expand All @@ -54,19 +54,19 @@ class CmdTreeDataProvider implements vscode.TreeDataProvider<vscode.TreeItem> {
let children = [];

// 添加创建工程项
let createProject = new vscode.TreeItem("create project", vscode.TreeItemCollapsibleState.None);
let createProject = new vscode.TreeItem("Create Project", vscode.TreeItemCollapsibleState.None);
createProject.iconPath = new vscode.ThemeIcon("new-folder");
createProject.label = "create project";
createProject.label = "Create Project";
createProject.command = {
command: "extension.showCreateProject",
title: "show create project page",
arguments: [],
};
children.push(createProject);

let rtSetting = new vscode.TreeItem("rt-thread setting", vscode.TreeItemCollapsibleState.None);
let rtSetting = new vscode.TreeItem("RT-Thread Setting", vscode.TreeItemCollapsibleState.None);
rtSetting.iconPath = new vscode.ThemeIcon("settings-gear");
rtSetting.label = "rt-thread setting";
rtSetting.label = "RT-Thread Setting";
rtSetting.command = {
command: "extension.showSetting",
title: "show rt-thread setting page",
Expand All @@ -82,32 +82,43 @@ class CmdTreeDataProvider implements vscode.TreeDataProvider<vscode.TreeItem> {
children.push(item);
};

let analyze = new vscode.TreeItem("Symbolic Analysis", vscode.TreeItemCollapsibleState.None);
analyze.iconPath = new vscode.ThemeIcon("search-fuzzy");
analyze.label = "Symbolic Analysis";
analyze.command = {
command: "extension.showAnalyze",
title: "show symbolic analysis page",
arguments: [],
};
children.push(analyze);

let about = new vscode.TreeItem("About", vscode.TreeItemCollapsibleState.None);
about.iconPath = new vscode.ThemeIcon("info");
about.label = "About";
about.command = {
command: "extension.showAbout",
title: "show about page",
arguments: [],
}
};
children.push(about);


return children;
} else {
let children:any = [];

const kconfig = vscode.extensions.getExtension('rt-thread.rt-thread-kconfig');

for (const [key, value] of Object.entries(cmds)) {
if (element.label == value.label) {
if (element.label === value.label) {
for (const cmdItem of value.subcmds) {
let item = new vscode.TreeItem(cmdItem.name);
item.iconPath = new vscode.ThemeIcon(cmdItem.iconId);
if (cmdItem.name == 'menuconfig' && kconfig != undefined) {
if (cmdItem.name === 'menuconfig' && kconfig !== undefined) {
item.command = {
command: "rt-thread-kconfig.menuconfig.windows",
title: cmdItem.cmd.title
}
};
}
else {
item.command = {
Expand Down Expand Up @@ -184,11 +195,11 @@ class GroupsDataProvider implements vscode.TreeDataProvider<ProjectTreeItem> {
if (treeElement) {
if (treeElement.length > 0) {
}
else if (element.contextType == "project_folder") {
else if (element.contextType === "project_folder") {
listFolderTreeItem(element);
}
}
else if (element.contextType == "project_folder") {
else if (element.contextType === "project_folder") {
listFolderTreeItem(element);
}
children = element.children;
Expand Down Expand Up @@ -235,11 +246,11 @@ class ProjectFilesDataProvider implements vscode.TreeDataProvider<ProjectTreeIte
if (treeElement) {
if (treeElement.length > 0) {
}
else if (element.contextType == "project_folder") {
else if (element.contextType === "project_folder") {
listFolderTreeItem(element);
}
}
else if (element.contextType == "project_folder") {
else if (element.contextType === "project_folder") {
listFolderTreeItem(element);
}
children = element.children;
Expand Down Expand Up @@ -349,3 +360,4 @@ export function initDockView(context: vscode.ExtensionContext) {
const treeDataprovider = new CmdTreeDataProvider();
context.subscriptions.push(vscode.window.registerTreeDataProvider("treeId", treeDataprovider));
}

6 changes: 4 additions & 2 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import * as os from 'os';
import { openSettingWebview } from './webviews/setting';
import { openAboutWebview } from './webviews/about';
import { openCreateProjectWebview } from './webviews/create-project';
import { openAnalyzeWebview } from './webviews/analyze';
import { initOnDidChangeListener } from './listener';
import { executeCommand, initTerminal } from './terminal';
import { getMenuItems, getParallelBuildNumber } from './smart';
Expand All @@ -25,8 +26,6 @@ export function postMessageExtensionData(context: vscode.ExtensionContext, panel
// 获取插件版本号(从 package.json 中读取)
const extensionVersion = context.extension.packageJSON.version;
const extensionNaeme = context.extension.packageJSON.name;
// 例如:version 为 "1.0.0"
console.log('插件版本号:', extensionVersion);
panel.webview.postMessage({ version: extensionVersion, name: extensionNaeme });
}

Expand Down Expand Up @@ -125,6 +124,9 @@ export async function activate(context: vscode.ExtensionContext) {
vscode.commands.registerCommand('extension.showAbout', () => {
openAboutWebview(context);
});
vscode.commands.registerCommand('extension.showAnalyze', () => {
openAnalyzeWebview(context);
});

if (isRTThreadWorksapce) {
vscode.commands.registerCommand('extension.showWorkspaceSettings', () => {
Expand Down
15 changes: 8 additions & 7 deletions src/project/tree.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import path from 'path';
import path from 'path';
import * as vscode from 'vscode';
import fs from 'fs';
import { getWorkspaceFolder, getExtensionPath } from '../api';
Expand Down Expand Up @@ -52,7 +52,7 @@ export class ProjectTreeItem extends vscode.TreeItem {
}
}

if (contextType == 'project_file') {
if (contextType === 'project_file') {
this.command = {
title: this.name,
command: 'extension.clickProject',
Expand All @@ -62,7 +62,7 @@ export class ProjectTreeItem extends vscode.TreeItem {
]
};
}
else if (contextType == 'project_bsp') {
else if (contextType === 'project_bsp') {
this.command = {
title: this.name,
command: 'extension.handleTreeItemClick',
Expand Down Expand Up @@ -99,7 +99,7 @@ export function getTreeIcon(isDir: boolean, value: string): string {
if (isDir) {
icon = "default_folder.svg";
} else {
if (value == "project") {
if (value === "project") {
icon = "chip";
}
else if (value.endsWith(".c")) {
Expand All @@ -109,7 +109,7 @@ export function getTreeIcon(isDir: boolean, value: string): string {
} else if (value.endsWith(".h")) {
icon = "file_type_cheader.svg";
} else if (value.endsWith(".s") || value.endsWith(".S")) {
icon = "file_type_assembly.png"
icon = "file_type_assembly.png";
} else if (value.endsWith(".py") || value.endsWith("SConscript") || value.endsWith("SConstruct")) {
icon = "file_type_python.svg";
} else if (value.endsWith(".txt")) {
Expand Down Expand Up @@ -304,7 +304,7 @@ export function listStarsTreeItem(bspFolder:string, node: any) {
let items = item.split(/[\/\\]/);
if (items.length >= 2) {
for (let i = 0; i < children.length; i++) {
if (children[i].label == items[0]) {
if (children[i].label === items[0]) {
parent = children[i].children;
break;
}
Expand Down Expand Up @@ -360,7 +360,7 @@ export function initProjectTree(context:vscode.ExtensionContext) {
}

// double clicked
if (currentSelectedBspItem && currentSelectedBspItem.fn != item.fn) {
if (currentSelectedBspItem && currentSelectedBspItem.fn !== item.fn) {
DecorationProvider.getInstance().unmarkFile(vscode.Uri.file(currentSelectedBspItem.fn));
}

Expand Down Expand Up @@ -388,3 +388,4 @@ export function initProjectTree(context:vscode.ExtensionContext) {
export function setTreeDataChangeEmitter(emitter: vscode.EventEmitter<ProjectTreeItem | undefined>) {
_onDidChangeTreeData = emitter;
}

1 change: 1 addition & 0 deletions src/utils/elf/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- 这是一个elf符号处理的库,使用typescript方式编写,分析rtthread.elf,rtthread.map文件,并返回相关符号信息。
Loading