|
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