|
1 | 1 | // eslint-disable-next-line @typescript-eslint/no-triple-slash-reference |
2 | | -/// <reference path="../shim.d.ts" /> |
| 2 | +/// <reference path="../types.d.ts" /> |
3 | 3 |
|
4 | 4 | import { parse as esParse } from 'espree' |
5 | 5 | import remarkMdx from 'remark-mdx' |
6 | 6 | import remarkParse from 'remark-parse' |
7 | 7 | import remarkStringify from 'remark-stringify' |
8 | 8 | import unified from 'unified' |
9 | 9 |
|
| 10 | +import { traverse } from './traverse' |
| 11 | + |
10 | 12 | import { Position, Parent } from 'unist' |
11 | 13 | import { AST, Linter } from 'eslint' |
12 | | -import { Statement, ModuleDeclaration } from 'estree' |
13 | 14 |
|
14 | 15 | const transNodePos = (position: Position) => { |
15 | 16 | const start = position.start.offset |
@@ -39,73 +40,61 @@ export const parseForESLint = ( |
39 | 40 |
|
40 | 41 | const tokens: AST.Token[] = [] |
41 | 42 |
|
42 | | - return { |
43 | | - ast: { |
44 | | - ...transNodePos(root.position), |
45 | | - comments: [], |
46 | | - body: root.children.reduce<Array<Statement | ModuleDeclaration>>( |
47 | | - (nodes, { position, type }) => { |
48 | | - if (!['export', 'import', 'jsx'].includes(type)) { |
49 | | - return nodes |
50 | | - } |
51 | | - |
52 | | - const rawText = getRawText(code, position) |
| 43 | + traverse(root, { |
| 44 | + enter({ position, type }) { |
| 45 | + if (!['export', 'import', 'jsx'].includes(type)) { |
| 46 | + return |
| 47 | + } |
53 | 48 |
|
54 | | - let node = { |
55 | | - ...transNodePos(position), |
56 | | - value: rawText, |
57 | | - } |
| 49 | + const rawText = getRawText(code, position) |
58 | 50 |
|
59 | | - const { tokens: esTokens, ...AST } = esParse( |
60 | | - rawText, |
61 | | - options, |
62 | | - ) as AST.Program |
| 51 | + const node = transNodePos(position) |
63 | 52 |
|
64 | | - const offset = node.start - AST.range[0] |
| 53 | + const { tokens: esTokens, ...AST } = esParse( |
| 54 | + rawText, |
| 55 | + options, |
| 56 | + ) as AST.Program |
65 | 57 |
|
66 | | - node = { |
67 | | - ...AST, |
68 | | - ...node, |
69 | | - } |
| 58 | + const offset = node.start - AST.range[0] |
70 | 59 |
|
71 | | - nodes.push(node as any) |
72 | | - tokens.push( |
73 | | - ...esTokens.map(token => { |
74 | | - const { |
75 | | - loc: { start: tokenStart, end: tokenEnd }, |
76 | | - } = token |
77 | | - const start = token.range[0] + offset |
78 | | - const end = token.range[1] + offset |
79 | | - const startLine = node.loc.start.line + tokenStart.line - 1 |
80 | | - const startColumn = node.loc.start.column + tokenStart.column - 1 |
81 | | - return { |
82 | | - ...token, |
83 | | - start, |
84 | | - end, |
85 | | - range: [start, end], |
86 | | - loc: { |
87 | | - start: { |
88 | | - line: startLine, |
89 | | - column: startColumn, |
90 | | - }, |
91 | | - end: { |
92 | | - line: startLine + tokenEnd.line - 1, |
93 | | - column: startLine + tokenEnd.column - 1, |
94 | | - }, |
95 | | - }, |
96 | | - } as AST.Token |
97 | | - }), |
98 | | - ) |
| 60 | + tokens.push( |
| 61 | + ...esTokens.map(token => { |
| 62 | + const { |
| 63 | + loc: { start: tokenStart, end: tokenEnd }, |
| 64 | + } = token |
| 65 | + const start = token.range[0] + offset |
| 66 | + const end = token.range[1] + offset |
| 67 | + const startLine = node.loc.start.line + tokenStart.line - 1 |
| 68 | + const startColumn = node.loc.start.column + tokenStart.column - 1 |
| 69 | + return { |
| 70 | + ...token, |
| 71 | + start, |
| 72 | + end, |
| 73 | + range: [start, end], |
| 74 | + loc: { |
| 75 | + start: { |
| 76 | + line: startLine, |
| 77 | + column: startColumn, |
| 78 | + }, |
| 79 | + end: { |
| 80 | + line: startLine + tokenEnd.line - 1, |
| 81 | + column: startLine + tokenEnd.column - 1, |
| 82 | + }, |
| 83 | + }, |
| 84 | + } as AST.Token |
| 85 | + }), |
| 86 | + ) |
| 87 | + }, |
| 88 | + }) |
99 | 89 |
|
100 | | - return nodes |
101 | | - }, |
102 | | - [], |
103 | | - ), |
| 90 | + return { |
| 91 | + ast: { |
| 92 | + ...transNodePos(root.position), |
| 93 | + comments: [], |
| 94 | + body: [], |
104 | 95 | type: 'Program', |
105 | 96 | sourceType: 'module', |
106 | 97 | tokens, |
107 | 98 | }, |
108 | | - scopeManager: null, |
109 | | - visitorKeys: null, |
110 | 99 | } |
111 | 100 | } |
0 commit comments