Skip to content

Commit 7ae6971

Browse files
kvoon3antfu
andauthored
feat(reverse-if-else): new command (#38)
Co-authored-by: Anthony Fu <github@antfu.me>
1 parent b7ea0fb commit 7ae6971

File tree

4 files changed

+142
-0
lines changed

4 files changed

+142
-0
lines changed

src/commands/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { noShorthand } from './no-shorthand'
77
import { noType } from './no-type'
88
import { noXAbove } from './no-x-above'
99
import { regex101 } from './regex101'
10+
import { reverseIfElse } from './reverse-if-else'
1011
import { toArrow } from './to-arrow'
1112
import { toDestructuring } from './to-destructuring'
1213
import { toDynamicImport } from './to-dynamic-import'
@@ -30,6 +31,7 @@ export {
3031
noType,
3132
noXAbove,
3233
regex101,
34+
reverseIfElse,
3335
toArrow,
3436
toDestructuring,
3537
toDynamicImport,
@@ -54,6 +56,7 @@ export const builtinCommands = [
5456
noType,
5557
noXAbove,
5658
regex101,
59+
reverseIfElse,
5760
toArrow,
5861
toDestructuring,
5962
toDynamicImport,

src/commands/reverse-if-else.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# `reverse-if-else`
2+
3+
Reverse the order of if-else statements and negate the condition.
4+
5+
## Triggers
6+
7+
- `/// reverse-if-else`
8+
- `/// rife`
9+
- `/// rif`
10+
11+
## Examples
12+
13+
```ts
14+
/// reverse-if-else
15+
if (a === 1) {
16+
a = 2
17+
}
18+
else {
19+
a = 3
20+
}
21+
```
22+
23+
Will be converted to:
24+
25+
```ts
26+
if (!(a === 1)) {
27+
a = 3
28+
}
29+
else {
30+
a = 2
31+
}
32+
```

src/commands/reverse-if-else.test.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { $, run } from './_test-utils'
2+
import { reverseIfElse as command } from './reverse-if-else'
3+
4+
run(
5+
command,
6+
{
7+
code: $`
8+
/// reverse-if-else
9+
const foo = 'bar'
10+
`,
11+
errors: ['command-error'],
12+
},
13+
// with else if
14+
{
15+
code: $`
16+
/// reverse-if-else
17+
if (a === 1) {
18+
a = 2
19+
}
20+
else if (a === 2) {
21+
a = 3
22+
}
23+
`,
24+
errors: ['command-error'],
25+
},
26+
{
27+
code: $`
28+
/// reverse-if-else
29+
if (a === 1) {
30+
a = 2
31+
}
32+
else {
33+
a = 3
34+
}
35+
`,
36+
output: $`
37+
if (!(a === 1)) {
38+
a = 3
39+
}
40+
else {
41+
a = 2
42+
}
43+
`,
44+
errors: ['command-fix'],
45+
},
46+
// without if
47+
{
48+
code: $`
49+
/// reverse-if-else
50+
if (a === 1 || b === 2) {
51+
a = 2
52+
}
53+
`,
54+
output: (i) => {
55+
expect(i).toMatchInlineSnapshot(`
56+
"if (!(a === 1 || b === 2)) {
57+
}
58+
else {
59+
a = 2
60+
}"
61+
`)
62+
},
63+
errors: ['command-fix'],
64+
},
65+
)

src/commands/reverse-if-else.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import type { Command } from '../types'
2+
import { AST_NODE_TYPES } from '@typescript-eslint/utils'
3+
4+
export const reverseIfElse: Command = {
5+
name: 'reverse-if-else',
6+
match: /^\s*[/:@]\s*(reverse-if-else|rife|rif)$/,
7+
action(ctx) {
8+
const node = ctx.findNodeBelow('IfStatement')
9+
10+
if (!node)
11+
return ctx.reportError('Cannot find if statement')
12+
13+
const elseNode = node.alternate
14+
15+
const isElseif = elseNode?.type === AST_NODE_TYPES.IfStatement
16+
if (isElseif)
17+
return ctx.reportError('Unable reverse when `else if` statement exist')
18+
19+
const ifNode = node.consequent
20+
21+
ctx.report({
22+
loc: node.loc,
23+
message: 'Reverse if-else',
24+
fix(fixer) {
25+
const lineIndent = ctx.getIndentOfLine(node.loc.start.line)
26+
27+
const conditionText = ctx.getTextOf(node.test)
28+
const ifText = ctx.getTextOf(ifNode)
29+
const elseText = elseNode ? ctx.getTextOf(elseNode) : '{\n}'
30+
31+
const str = [
32+
`if (!(${conditionText})) ${elseText}`,
33+
`else ${ifText}`,
34+
]
35+
.map((line, idx) => idx ? lineIndent + line : line)
36+
.join('\n')
37+
38+
return fixer.replaceText(node, str)
39+
},
40+
})
41+
},
42+
}

0 commit comments

Comments
 (0)