Skip to content

Commit f663b42

Browse files
committed
merge main
2 parents 009208f + 41df4ce commit f663b42

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+8901
-3986
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,6 @@ ref/
1111
# Auto-generated type declaration files
1212
src/vue/auto-imports.d.ts
1313
src/vue/components.d.ts
14+
15+
rtthread.elf
16+
rtthread.map

CLAUDE.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,13 @@ npm run build # Production build
6464

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

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

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

8585
## 重要说明
8686

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

package-lock.json

Lines changed: 4506 additions & 2665 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,12 @@
186186
"test": "vscode-test"
187187
},
188188
"dependencies": {
189+
"@bugsplat/elfy": "^1.0.1",
189190
"@vue/shared": "^3.x.x",
190191
"@neilsustc/markdown-it-katex": "^1.0.0",
191192
"element-plus": "^2.4.2",
193+
"elfjs": "^2.2.0",
194+
"elfy": "^1.0.0",
192195
"highlight.js": "^11.10.0",
193196
"katex": "^0.16.11",
194197
"markdown-it": "^13.0.2",
@@ -208,8 +211,11 @@
208211
"devDependencies": {
209212
"@types/markdown-it": "^14.0.1",
210213
"@types/mocha": "^10.0.7",
211-
"@types/node": "20.x",
214+
"@types/node": "^20.19.11",
212215
"@types/vscode": "^1.96.0",
216+
"@types/jest": "^29.5.12",
217+
"jest": "^29.7.0",
218+
"ts-jest": "^29.1.2",
213219
"@typescript-eslint/eslint-plugin": "^8.3.0",
214220
"@typescript-eslint/parser": "^8.3.0",
215221
"@vitejs/plugin-vue": "^5.2.1",
@@ -219,7 +225,8 @@
219225
"less": "^4.2.2",
220226
"svgo": "^4.0.0",
221227
"terser": "^5.43.1",
222-
"typescript": "^5.5.4",
228+
"ts-node": "^10.9.2",
229+
"typescript": "^5.8.3",
223230
"unplugin-auto-import": "^19.3.0",
224231
"unplugin-vue-components": "^28.8.0",
225232
"vite": "^6.0.11",

src/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export function writeJsonObject(jsonObject: any, fn:string) {
147147
export async function openFolder(uri?: string) {
148148
let selectedFolder:vscode.Uri[] | undefined;
149149

150-
if (uri != undefined) {
150+
if (uri !== undefined) {
151151
selectedFolder = await vscode.window.showOpenDialog({
152152
defaultUri: vscode.Uri.file(uri),
153153
canSelectFolders: true,

src/cmds/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export let cmds: Object = {
3535
],
3636
name: 'Build',
3737
iconId: 'github-action',
38-
label: 'build',
38+
label: 'Build',
3939
isExpanded: true
4040
},
4141
Settings : {
@@ -84,7 +84,7 @@ export let cmds: Object = {
8484
],
8585
name: 'Settings',
8686
iconId: 'gear',
87-
label: 'settings',
87+
label: 'Settings',
8888
isExpanded: true
8989
},
9090
Packages : {
@@ -112,7 +112,7 @@ export let cmds: Object = {
112112
],
113113
name: 'Packages',
114114
iconId: 'extensions',
115-
label: 'packages',
115+
label: 'Packages',
116116
isExpanded: false
117117
}
118-
}
118+
};

src/dock.ts

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import path from 'path';
1+
import path from 'path';
22
import * as vscode from 'vscode';
33
import os from 'os';
44
import fs from 'fs';
@@ -14,24 +14,24 @@ class CmdTreeDataProvider implements vscode.TreeDataProvider<vscode.TreeItem> {
1414
getChildren(element?: vscode.TreeItem): vscode.ProviderResult<vscode.TreeItem[]> {
1515
const isRTT = isRTThreadProject();
1616
const isRTTWorksapce = isRTThreadWorksapce();
17-
if (isRTT != true && isRTTWorksapce != true) {
17+
if (isRTT !== true && isRTTWorksapce !== true) {
1818
console.log("not RT-Thread project or workspace, return empty tree item.");
1919
}
2020

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

32-
let rtSetting = new vscode.TreeItem("rt-thread setting", vscode.TreeItemCollapsibleState.None);
32+
let rtSetting = new vscode.TreeItem("RT-Thread Setting", vscode.TreeItemCollapsibleState.None);
3333
rtSetting.iconPath = new vscode.ThemeIcon("settings-gear");
34-
rtSetting.label = "rt-thread setting";
34+
rtSetting.label = "RT-Thread Setting";
3535
rtSetting.command = {
3636
command: "extension.showSetting",
3737
title: "show rt-thread setting page",
@@ -45,7 +45,7 @@ class CmdTreeDataProvider implements vscode.TreeDataProvider<vscode.TreeItem> {
4545
command: "extension.showAbout",
4646
title: "show about page",
4747
arguments: [],
48-
}
48+
};
4949

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

5656
// 添加创建工程项
57-
let createProject = new vscode.TreeItem("create project", vscode.TreeItemCollapsibleState.None);
57+
let createProject = new vscode.TreeItem("Create Project", vscode.TreeItemCollapsibleState.None);
5858
createProject.iconPath = new vscode.ThemeIcon("new-folder");
59-
createProject.label = "create project";
59+
createProject.label = "Create Project";
6060
createProject.command = {
6161
command: "extension.showCreateProject",
6262
title: "show create project page",
6363
arguments: [],
6464
};
6565
children.push(createProject);
6666

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

85+
let analyze = new vscode.TreeItem("Symbolic Analysis", vscode.TreeItemCollapsibleState.None);
86+
analyze.iconPath = new vscode.ThemeIcon("search-fuzzy");
87+
analyze.label = "Symbolic Analysis";
88+
analyze.command = {
89+
command: "extension.showAnalyze",
90+
title: "show symbolic analysis page",
91+
arguments: [],
92+
};
93+
children.push(analyze);
94+
8595
let about = new vscode.TreeItem("About", vscode.TreeItemCollapsibleState.None);
8696
about.iconPath = new vscode.ThemeIcon("info");
8797
about.label = "About";
8898
about.command = {
8999
command: "extension.showAbout",
90100
title: "show about page",
91101
arguments: [],
92-
}
102+
};
93103
children.push(about);
94104

105+
95106
return children;
96107
} else {
97108
let children:any = [];
98109

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

101112
for (const [key, value] of Object.entries(cmds)) {
102-
if (element.label == value.label) {
113+
if (element.label === value.label) {
103114
for (const cmdItem of value.subcmds) {
104115
let item = new vscode.TreeItem(cmdItem.name);
105116
item.iconPath = new vscode.ThemeIcon(cmdItem.iconId);
106-
if (cmdItem.name == 'menuconfig' && kconfig != undefined) {
117+
if (cmdItem.name === 'menuconfig' && kconfig !== undefined) {
107118
item.command = {
108119
command: "rt-thread-kconfig.menuconfig.windows",
109120
title: cmdItem.cmd.title
110-
}
121+
};
111122
}
112123
else {
113124
item.command = {
@@ -184,11 +195,11 @@ class GroupsDataProvider implements vscode.TreeDataProvider<ProjectTreeItem> {
184195
if (treeElement) {
185196
if (treeElement.length > 0) {
186197
}
187-
else if (element.contextType == "project_folder") {
198+
else if (element.contextType === "project_folder") {
188199
listFolderTreeItem(element);
189200
}
190201
}
191-
else if (element.contextType == "project_folder") {
202+
else if (element.contextType === "project_folder") {
192203
listFolderTreeItem(element);
193204
}
194205
children = element.children;
@@ -235,11 +246,11 @@ class ProjectFilesDataProvider implements vscode.TreeDataProvider<ProjectTreeIte
235246
if (treeElement) {
236247
if (treeElement.length > 0) {
237248
}
238-
else if (element.contextType == "project_folder") {
249+
else if (element.contextType === "project_folder") {
239250
listFolderTreeItem(element);
240251
}
241252
}
242-
else if (element.contextType == "project_folder") {
253+
else if (element.contextType === "project_folder") {
243254
listFolderTreeItem(element);
244255
}
245256
children = element.children;
@@ -349,3 +360,4 @@ export function initDockView(context: vscode.ExtensionContext) {
349360
const treeDataprovider = new CmdTreeDataProvider();
350361
context.subscriptions.push(vscode.window.registerTreeDataProvider("treeId", treeDataprovider));
351362
}
363+

src/extension.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as os from 'os';
77
import { openSettingWebview } from './webviews/setting';
88
import { openAboutWebview } from './webviews/about';
99
import { openCreateProjectWebview } from './webviews/create-project';
10+
import { openAnalyzeWebview } from './webviews/analyze';
1011
import { initOnDidChangeListener } from './listener';
1112
import { executeCommand, initTerminal } from './terminal';
1213
import { getMenuItems, getParallelBuildNumber } from './smart';
@@ -25,8 +26,6 @@ export function postMessageExtensionData(context: vscode.ExtensionContext, panel
2526
// 获取插件版本号(从 package.json 中读取)
2627
const extensionVersion = context.extension.packageJSON.version;
2728
const extensionNaeme = context.extension.packageJSON.name;
28-
// 例如:version 为 "1.0.0"
29-
console.log('插件版本号:', extensionVersion);
3029
panel.webview.postMessage({ version: extensionVersion, name: extensionNaeme });
3130
}
3231

@@ -125,6 +124,9 @@ export async function activate(context: vscode.ExtensionContext) {
125124
vscode.commands.registerCommand('extension.showAbout', () => {
126125
openAboutWebview(context);
127126
});
127+
vscode.commands.registerCommand('extension.showAnalyze', () => {
128+
openAnalyzeWebview(context);
129+
});
128130

129131
if (isRTThreadWorksapce) {
130132
vscode.commands.registerCommand('extension.showWorkspaceSettings', () => {

src/project/tree.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import path from 'path';
1+
import path from 'path';
22
import * as vscode from 'vscode';
33
import fs from 'fs';
44
import { getWorkspaceFolder, getExtensionPath } from '../api';
@@ -52,7 +52,7 @@ export class ProjectTreeItem extends vscode.TreeItem {
5252
}
5353
}
5454

55-
if (contextType == 'project_file') {
55+
if (contextType === 'project_file') {
5656
this.command = {
5757
title: this.name,
5858
command: 'extension.clickProject',
@@ -62,7 +62,7 @@ export class ProjectTreeItem extends vscode.TreeItem {
6262
]
6363
};
6464
}
65-
else if (contextType == 'project_bsp') {
65+
else if (contextType === 'project_bsp') {
6666
this.command = {
6767
title: this.name,
6868
command: 'extension.handleTreeItemClick',
@@ -99,7 +99,7 @@ export function getTreeIcon(isDir: boolean, value: string): string {
9999
if (isDir) {
100100
icon = "default_folder.svg";
101101
} else {
102-
if (value == "project") {
102+
if (value === "project") {
103103
icon = "chip";
104104
}
105105
else if (value.endsWith(".c")) {
@@ -109,7 +109,7 @@ export function getTreeIcon(isDir: boolean, value: string): string {
109109
} else if (value.endsWith(".h")) {
110110
icon = "file_type_cheader.svg";
111111
} else if (value.endsWith(".s") || value.endsWith(".S")) {
112-
icon = "file_type_assembly.png"
112+
icon = "file_type_assembly.png";
113113
} else if (value.endsWith(".py") || value.endsWith("SConscript") || value.endsWith("SConstruct")) {
114114
icon = "file_type_python.svg";
115115
} else if (value.endsWith(".txt")) {
@@ -304,7 +304,7 @@ export function listStarsTreeItem(bspFolder:string, node: any) {
304304
let items = item.split(/[\/\\]/);
305305
if (items.length >= 2) {
306306
for (let i = 0; i < children.length; i++) {
307-
if (children[i].label == items[0]) {
307+
if (children[i].label === items[0]) {
308308
parent = children[i].children;
309309
break;
310310
}
@@ -360,7 +360,7 @@ export function initProjectTree(context:vscode.ExtensionContext) {
360360
}
361361

362362
// double clicked
363-
if (currentSelectedBspItem && currentSelectedBspItem.fn != item.fn) {
363+
if (currentSelectedBspItem && currentSelectedBspItem.fn !== item.fn) {
364364
DecorationProvider.getInstance().unmarkFile(vscode.Uri.file(currentSelectedBspItem.fn));
365365
}
366366

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

src/utils/elf/CLAUDE.md

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

0 commit comments

Comments
 (0)