Skip to content
Merged
Changes from all commits
Commits
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
273 changes: 142 additions & 131 deletions apps/oxlint/test/fixtures/fixes/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,144 +1,155 @@
import type { Diagnostic, Node, Plugin } from "#oxlint/plugins";
import type { Diagnostic, Node, Plugin, Rule } from "#oxlint/plugins";

const plugin: Plugin = {
const rule: Rule = {
meta: {
name: "fixes-plugin",
fixable: "code",
},
rules: {
fixes: {
meta: {
fixable: "code",
create(context) {
let debuggerCount = 0;
return {
DebuggerStatement(node) {
debuggerCount++;

let thisIsReport;
const report: Diagnostic = {
message: "Remove debugger statement",
node,
fix(fixer) {
thisIsReport = this === report;
if (debuggerCount === 1) return fixer.remove(node);
return fixer.removeRange([node.start, node.end]);
},
};
context.report(report);

if (!thisIsReport) {
context.report({ message: `this in fix function is not report object`, node });
}
},
create(context) {
let debuggerCount = 0;
return {
DebuggerStatement(node) {
debuggerCount++;
Identifier(node) {
switch (node.name) {
case "a":
return context.report({
message: 'Replace "a" with "daddy"',
node,
fix(fixer) {
return fixer.replaceText(node, "daddy");
},
});

let thisIsReport;
const report: Diagnostic = {
message: "Remove debugger statement",
case "b":
return context.report({
message: 'Replace "b" with "abacus"',
node,
fix(fixer) {
thisIsReport = this === report;
if (debuggerCount === 1) return fixer.remove(node);
return fixer.removeRange([node.start, node.end]);
return fixer.replaceTextRange([node.start, node.end], "abacus");
},
};
context.report(report);
});

if (!thisIsReport) {
context.report({ message: `this in fix function is not report object`, node });
}
},
Identifier(node) {
switch (node.name) {
case "a":
return context.report({
message: 'Replace "a" with "daddy"',
node,
fix(fixer) {
return fixer.replaceText(node, "daddy");
},
});
case "b":
return context.report({
message: 'Replace "b" with "abacus"',
node,
fix(fixer) {
return fixer.replaceTextRange([node.start, node.end], "abacus");
},
});
case "c":
return context.report({
message: 'Prefix "c" with "magi"',
node,
fix(fixer) {
return fixer.insertTextBefore(node, "magi");
},
});
case "d":
return context.report({
message: 'Prefix "d" with "damne"',
node,
fix(fixer) {
return fixer.insertTextBeforeRange([node.start, node.end], "damne");
},
});
case "e":
return context.report({
message: 'Postfix "e" with "lephant"',
node,
fix(fixer) {
return fixer.insertTextAfter(node, "lephant");
},
});
case "f":
return context.report({
message: 'Postfix "f" with "eck"',
node,
fix(fixer) {
return fixer.insertTextAfterRange([node.start, node.end], "eck");
},
});
case "g":
return context.report({
message: 'Replace "g" with "numpty"',
node,
fix(fixer) {
// Fixes can be in any order
return [
fixer.insertTextAfter(node, "ty"),
// Test that any object with `range` property works
fixer.replaceText({ range: [node.start, node.end] } as Node, "mp"),
fixer.insertTextBefore(node, "nu"),
];
},
});
case "h":
return context.report({
message: 'Replace "h" with "dangermouse"',
node,
fix(fixer) {
// Fixes can be in any order
const { range } = node;
return [
fixer.replaceTextRange(range, "er"),
fixer.insertTextAfterRange(range, "mouse"),
fixer.insertTextBeforeRange(range, "dang"),
];
},
});
case "i":
return context.report({
message: 'Replace "i" with "granular"',
node,
// `fix` can be a generator function
*fix(fixer) {
yield fixer.insertTextBefore(node, "gra");
yield fixer.replaceText(node, "nu");
// Test that any object with `range` property works
yield fixer.insertTextAfter({ range: [node.start, node.end] } as Node, "lar");
},
});
case "j":
return context.report({
message: 'Replace "j" with "cowabunga"',
node,
// `fix` can be a generator function
*fix(fixer) {
// Fixes can be in any order
const { range } = node;
yield fixer.insertTextAfterRange(range, "bunga");
yield fixer.replaceTextRange(range, "a");
yield fixer.insertTextBeforeRange(range, "cow");
},
});
}
},
};
case "c":
return context.report({
message: 'Prefix "c" with "magi"',
node,
fix(fixer) {
return fixer.insertTextBefore(node, "magi");
},
});

case "d":
return context.report({
message: 'Prefix "d" with "damne"',
node,
fix(fixer) {
return fixer.insertTextBeforeRange([node.start, node.end], "damne");
},
});

case "e":
return context.report({
message: 'Postfix "e" with "lephant"',
node,
fix(fixer) {
return fixer.insertTextAfter(node, "lephant");
},
});

case "f":
return context.report({
message: 'Postfix "f" with "eck"',
node,
fix(fixer) {
return fixer.insertTextAfterRange([node.start, node.end], "eck");
},
});

case "g":
return context.report({
message: 'Replace "g" with "numpty"',
node,
fix(fixer) {
// Fixes can be in any order
return [
fixer.insertTextAfter(node, "ty"),
// Test that any object with `range` property works
fixer.replaceText({ range: [node.start, node.end] } as Node, "mp"),
fixer.insertTextBefore(node, "nu"),
];
},
});

case "h":
return context.report({
message: 'Replace "h" with "dangermouse"',
node,
fix(fixer) {
// Fixes can be in any order
const { range } = node;
return [
fixer.replaceTextRange(range, "er"),
fixer.insertTextAfterRange(range, "mouse"),
fixer.insertTextBeforeRange(range, "dang"),
];
},
});

case "i":
return context.report({
message: 'Replace "i" with "granular"',
node,
// `fix` can be a generator function
*fix(fixer) {
yield fixer.insertTextBefore(node, "gra");
yield fixer.replaceText(node, "nu");
// Test that any object with `range` property works
yield fixer.insertTextAfter({ range: [node.start, node.end] } as Node, "lar");
},
});

case "j":
return context.report({
message: 'Replace "j" with "cowabunga"',
node,
// `fix` can be a generator function
*fix(fixer) {
// Fixes can be in any order
const { range } = node;
yield fixer.insertTextAfterRange(range, "bunga");
yield fixer.replaceTextRange(range, "a");
yield fixer.insertTextBeforeRange(range, "cow");
},
});
}
},
},
};
},
};

const plugin: Plugin = {
meta: {
name: "fixes-plugin",
},
rules: {
fixes: rule,
},
};

Expand Down
Loading