forked from prettier/prettier
/
loc.js
59 lines (49 loc) · 1.24 KB
/
loc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
"use strict";
const isNonEmptyArray = require("../utils/is-non-empty-array.js");
/**
* @typedef {import("./types/estree").Node} Node
*/
function locStart(node) {
const start = node.range ? node.range[0] : node.start;
// Handle nodes with decorators. They should start at the first decorator
const decorators = node.declaration?.decorators ?? node.decorators;
if (isNonEmptyArray(decorators)) {
return Math.min(locStart(decorators[0]), start);
}
return start;
}
function locEnd(node) {
return node.range ? node.range[1] : node.end;
}
/**
* @param {Node} nodeA
* @param {Node} nodeB
* @returns {boolean}
*/
function hasSameLocStart(nodeA, nodeB) {
const nodeAStart = locStart(nodeA);
return Number.isInteger(nodeAStart) && nodeAStart === locStart(nodeB);
}
/**
* @param {Node} nodeA
* @param {Node} nodeB
* @returns {boolean}
*/
function hasSameLocEnd(nodeA, nodeB) {
const nodeAEnd = locEnd(nodeA);
return Number.isInteger(nodeAEnd) && nodeAEnd === locEnd(nodeB);
}
/**
* @param {Node} nodeA
* @param {Node} nodeB
* @returns {boolean}
*/
function hasSameLoc(nodeA, nodeB) {
return hasSameLocStart(nodeA, nodeB) && hasSameLocEnd(nodeA, nodeB);
}
module.exports = {
locStart,
locEnd,
hasSameLocStart,
hasSameLoc,
};