|
1 | 1 | /**
|
2 |
| - * @typedef {import('unist').Position} Position |
| 2 | + * @typedef {import('unist').Position} UnistPosition |
| 3 | + * @typedef {import('unist').Point} UnistPoint |
3 | 4 | *
|
4 |
| - * @typedef {[number, number]} RangeLike |
| 5 | + * @typedef {[number | null | undefined, number | null | undefined]} RangeLike |
5 | 6 | *
|
6 | 7 | * @typedef PointLike
|
7 | 8 | * @property {number | null | undefined} [line]
|
|
23 | 24 | *
|
24 | 25 | * @param {NodeLike | null | undefined} [node]
|
25 | 26 | * estree node.
|
26 |
| - * @returns {Position} |
| 27 | + * @returns {UnistPosition | undefined} |
27 | 28 | * unist position.
|
28 | 29 | */
|
29 | 30 | export function positionFromEstree(node) {
|
30 | 31 | const nodeLike = node || {}
|
31 | 32 | const loc = nodeLike.loc || {}
|
32 |
| - const range = nodeLike.range || [0, 0] |
33 |
| - const startColumn = loc.start |
34 |
| - ? numberOrUndefined(loc.start.column) |
35 |
| - : undefined |
36 |
| - const endColumn = loc.end ? numberOrUndefined(loc.end.column) : undefined |
| 33 | + const range = nodeLike.range || [undefined, undefined] |
| 34 | + const start = pointOrUndefined(loc.start, range[0] || nodeLike.start) |
| 35 | + const end = pointOrUndefined(loc.end, range[1] || nodeLike.end) |
37 | 36 |
|
38 |
| - return { |
39 |
| - start: { |
40 |
| - // @ts-expect-error: return no point / no position next major. |
41 |
| - line: loc.start ? numberOrUndefined(loc.start.line) : undefined, |
42 |
| - // @ts-expect-error: return no point / no position next major. |
43 |
| - column: startColumn === undefined ? undefined : startColumn + 1, |
44 |
| - offset: numberOrUndefined(range[0] || nodeLike.start) |
45 |
| - }, |
46 |
| - end: { |
47 |
| - // @ts-expect-error: return no point / no position next major. |
48 |
| - line: loc.end ? numberOrUndefined(loc.end.line) : undefined, |
49 |
| - // @ts-expect-error: return no point / no position next major. |
50 |
| - column: endColumn === undefined ? undefined : endColumn + 1, |
51 |
| - offset: numberOrUndefined(range[1] || nodeLike.end) |
| 37 | + if (start && end) { |
| 38 | + return {start, end} |
| 39 | + } |
| 40 | +} |
| 41 | + |
| 42 | +/** |
| 43 | + * |
| 44 | + * @param {unknown} estreePoint |
| 45 | + * @param {unknown} estreeOffset |
| 46 | + * @returns {UnistPoint | undefined} |
| 47 | + */ |
| 48 | +function pointOrUndefined(estreePoint, estreeOffset) { |
| 49 | + if (estreePoint && typeof estreePoint === 'object') { |
| 50 | + const line = |
| 51 | + 'line' in estreePoint ? numberOrUndefined(estreePoint.line) : undefined |
| 52 | + const column = |
| 53 | + 'column' in estreePoint |
| 54 | + ? numberOrUndefined(estreePoint.column) |
| 55 | + : undefined |
| 56 | + |
| 57 | + if (line && column !== undefined) { |
| 58 | + return { |
| 59 | + line, |
| 60 | + column: column + 1, |
| 61 | + offset: numberOrUndefined(estreeOffset) |
| 62 | + } |
52 | 63 | }
|
53 | 64 | }
|
54 | 65 | }
|
55 | 66 |
|
56 | 67 | /**
|
57 | 68 | *
|
58 |
| - * @param {number | null | undefined} value |
| 69 | + * @param {unknown} value |
59 | 70 | * @returns {number | undefined}
|
60 | 71 | */
|
61 | 72 | function numberOrUndefined(value) {
|
|
0 commit comments