Skip to content

Commit b0e9abe

Browse files
committed
✨ eslint quickfix
1 parent 9f39dec commit b0e9abe

File tree

6 files changed

+149
-3
lines changed

6 files changed

+149
-3
lines changed

build/assets/template/popup.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
margin: 0;
1919
padding: 0;
2020
border: 0;
21-
min-width: 320px;
22-
max-width: 640px;
21+
width: 320px;
2322
/* height: 500px; */
2423
min-height: 150px;
2524
max-height: 500px;

src/linter.worker.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,52 @@ const severityMap = {
1919
1: 4, // 1 for ESLint is warning
2020
};
2121

22+
function getTextBlock(
23+
text: string,
24+
startPosition: number,
25+
endPosition: number
26+
) {
27+
if (
28+
startPosition > endPosition ||
29+
startPosition < 0 ||
30+
endPosition > text.length
31+
) {
32+
throw new Error("Invalid positions provided");
33+
}
34+
35+
let startLineNumber = 1;
36+
let startColumn = 1;
37+
let endLineNumber = 1;
38+
let endColumn = 1;
39+
40+
for (let i = 0, currentLine = 1, currentColumn = 1; i < text.length; i += 1) {
41+
if (i === startPosition) {
42+
startLineNumber = currentLine;
43+
startColumn = currentColumn;
44+
}
45+
46+
if (i === endPosition) {
47+
endLineNumber = currentLine;
48+
endColumn = currentColumn;
49+
break;
50+
}
51+
52+
if (text[i] === "\n") {
53+
currentLine += 1;
54+
currentColumn = 0;
55+
}
56+
57+
currentColumn += 1;
58+
}
59+
60+
return {
61+
startLineNumber,
62+
startColumn,
63+
endLineNumber,
64+
endColumn,
65+
};
66+
}
67+
2268
self.addEventListener("message", (event) => {
2369
const { code, id, config } = event.data;
2470
const errs = linter.verify(code, config);
@@ -28,6 +74,14 @@ self.addEventListener("message", (event) => {
2874
if (rule) {
2975
target = rule.meta.docs.url;
3076
}
77+
let fix: any;
78+
if (err.fix) {
79+
fix = {
80+
range: getTextBlock(code, err.fix.range[0], err.fix.range[1]),
81+
text: err.fix.text,
82+
};
83+
}
84+
console.log(err);
3185
return {
3286
code: {
3387
value: err.ruleId || "",
@@ -42,6 +96,7 @@ self.addEventListener("message", (event) => {
4296
// @ts-ignore
4397
severity: severityMap[err.severity],
4498
source: "ESLint",
99+
fix,
45100
};
46101
});
47102
// 发回主进程

src/pages/components/CodeEditor/index.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Cache from "@App/app/cache";
12
import IoC from "@App/app/ioc";
23
import { SystemConfig } from "@App/pkg/config/config";
34
import { LinterWorker } from "@App/pkg/utils/monaco-editor";
@@ -174,6 +175,26 @@ const CodeEditor: React.ForwardRefRenderFunction<
174175
return;
175176
}
176177
editor.setModelMarkers(model, "ESLint", message.markers);
178+
const fix = new Map();
179+
// 设置fix
180+
message.markers.forEach(
181+
(val: {
182+
code: { value: any };
183+
startLineNumber: any;
184+
endLineNumber: any;
185+
startColumn: any;
186+
endColumn: any;
187+
fix: any;
188+
}) => {
189+
if (val.fix) {
190+
fix.set(
191+
`${val.code.value}|${val.startLineNumber}|${val.endLineNumber}|${val.startColumn}|${val.endColumn}`,
192+
val.fix
193+
);
194+
}
195+
}
196+
);
197+
Cache.getInstance().set("eslint-fix", fix);
177198

178199
// 在行号旁显示ESLint错误/警告图标
179200
const formatMarkers = message.markers.map(

src/pages/components/ScriptMenuList/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ const ScriptMenuList: React.FC<{
136136
overflow: "hidden",
137137
textOverflow: "ellipsis",
138138
whiteSpace: "nowrap",
139-
width: "calc(100% + 1px)",
140139
color: item.runNum === 0 ? "rgb(var(--gray-5))" : "",
141140
}}
142141
>

src/pages/options/index.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,8 @@ h6.arco-typography {
3434
background-repeat: no-repeat;
3535
background-position: center;
3636
left: 10px!important;
37+
}
38+
39+
.actionList{
40+
height: auto !important;
3741
}

src/pkg/utils/monaco-editor.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import dts from "@App/types/scriptcat";
44
import Hook from "@App/app/service/hook";
55
import { languages } from "monaco-editor";
66
import pako from "pako";
7+
import Cache from "@App/app/cache";
78

89
// 注册eslint
910
const linterWorker = new Worker("/src/linter.worker.js");
@@ -74,6 +75,73 @@ export default function registerEditor() {
7475
});
7576
},
7677
});
78+
79+
// 处理quick fix
80+
languages.registerCodeActionProvider("javascript", {
81+
provideCodeActions: (
82+
model /** ITextModel */,
83+
range /** Range */,
84+
context /** CodeActionContext */
85+
) => {
86+
const actions: languages.CodeAction[] = [];
87+
const eslintFix = <Map<string, any>>Cache.getInstance().get("eslint-fix");
88+
for (let i = 0; i < context.markers.length; i += 1) {
89+
// 判断有没有修复方案
90+
const val = context.markers[i];
91+
const code = typeof val.code === "string" ? val.code : val.code!.value;
92+
const fix = eslintFix.get(
93+
`${code}|${val.startLineNumber}|${val.endLineNumber}|${val.startColumn}|${val.endColumn}`
94+
);
95+
console.log(
96+
fix,
97+
`${code}|${val.startLineNumber}|${val.endLineNumber}|${val.startColumn}|${val.endColumn}`
98+
);
99+
if (fix) {
100+
const edit: languages.IWorkspaceTextEdit = {
101+
resource: model.uri,
102+
textEdit: {
103+
range: fix.range,
104+
text: fix.text,
105+
},
106+
versionId: undefined,
107+
};
108+
actions.push(<languages.CodeAction>{
109+
title: `修复 ${code} 问题`,
110+
diagnostics: [val],
111+
kind: "quickfix",
112+
edit: {
113+
edits: [edit],
114+
},
115+
isPreferred: true,
116+
});
117+
}
118+
}
119+
120+
// const actions = context.markers.map((error) => {
121+
// const edit: languages.IWorkspaceTextEdit = {
122+
// resource: model.uri,
123+
// textEdit: {
124+
// range,
125+
// text: "console.log(1)",
126+
// },
127+
// versionId: undefined,
128+
// };
129+
// return <languages.CodeAction>{
130+
// title: ``,
131+
// diagnostics: [error],
132+
// kind: "quickfix",
133+
// edit: {
134+
// edits: [edit],
135+
// },
136+
// isPreferred: true,
137+
// };
138+
// });
139+
return {
140+
actions,
141+
dispose: () => {},
142+
};
143+
},
144+
});
77145
}
78146

79147
export class LinterWorker {

0 commit comments

Comments
 (0)