prettier/src/language-js/loc.js

66 lines
1.3 KiB
JavaScript

"use strict";
const getLast = require("../utils/get-last");
function locStart(node, opts) {
opts = opts || {};
// Handle nodes with decorators. They should start at the first decorator
if (
!opts.ignoreDecorators &&
node.declaration &&
node.declaration.decorators &&
node.declaration.decorators.length > 0
) {
return locStart(node.declaration.decorators[0]);
}
if (!opts.ignoreDecorators && node.decorators && node.decorators.length > 0) {
return locStart(node.decorators[0]);
}
if (node.__location) {
return node.__location.startOffset;
}
if (node.range) {
return node.range[0];
}
if (typeof node.start === "number") {
return node.start;
}
if (node.loc) {
return node.loc.start;
}
return null;
}
function locEnd(node) {
const endNode = node.nodes && getLast(node.nodes);
if (endNode && node.source && !node.source.end) {
node = endNode;
}
if (node.__location) {
return node.__location.endOffset;
}
const loc = node.range
? node.range[1]
: typeof node.end === "number"
? node.end
: null;
if (node.typeAnnotation) {
return Math.max(loc, locEnd(node.typeAnnotation));
}
if (node.loc && !loc) {
return node.loc.end;
}
return loc;
}
module.exports = {
locStart,
locEnd
};