"use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
value: true
|
});
|
exports.default = void 0;
|
exports.setInnerComments = setInnerComments;
|
var _base = require("./base");
|
function setTrailingComments(node, comments) {
|
if (node.trailingComments === undefined) {
|
node.trailingComments = comments;
|
} else {
|
node.trailingComments.unshift(...comments);
|
}
|
}
|
function setLeadingComments(node, comments) {
|
if (node.leadingComments === undefined) {
|
node.leadingComments = comments;
|
} else {
|
node.leadingComments.unshift(...comments);
|
}
|
}
|
function setInnerComments(node, comments) {
|
if (node.innerComments === undefined) {
|
node.innerComments = comments;
|
} else {
|
node.innerComments.unshift(...comments);
|
}
|
}
|
function adjustInnerComments(node, elements, commentWS) {
|
let lastElement = null;
|
let i = elements.length;
|
while (lastElement === null && i > 0) {
|
lastElement = elements[--i];
|
}
|
if (lastElement === null || lastElement.start > commentWS.start) {
|
setInnerComments(node, commentWS.comments);
|
} else {
|
setTrailingComments(lastElement, commentWS.comments);
|
}
|
}
|
class CommentsParser extends _base.default {
|
addComment(comment) {
|
if (this.filename) comment.loc.filename = this.filename;
|
this.state.comments.push(comment);
|
}
|
processComment(node) {
|
const {
|
commentStack
|
} = this.state;
|
const commentStackLength = commentStack.length;
|
if (commentStackLength === 0) return;
|
let i = commentStackLength - 1;
|
const lastCommentWS = commentStack[i];
|
if (lastCommentWS.start === node.end) {
|
lastCommentWS.leadingNode = node;
|
i--;
|
}
|
const {
|
start: nodeStart
|
} = node;
|
for (; i >= 0; i--) {
|
const commentWS = commentStack[i];
|
const commentEnd = commentWS.end;
|
if (commentEnd > nodeStart) {
|
commentWS.containingNode = node;
|
this.finalizeComment(commentWS);
|
commentStack.splice(i, 1);
|
} else {
|
if (commentEnd === nodeStart) {
|
commentWS.trailingNode = node;
|
}
|
break;
|
}
|
}
|
}
|
finalizeComment(commentWS) {
|
const {
|
comments
|
} = commentWS;
|
if (commentWS.leadingNode !== null || commentWS.trailingNode !== null) {
|
if (commentWS.leadingNode !== null) {
|
setTrailingComments(commentWS.leadingNode, comments);
|
}
|
if (commentWS.trailingNode !== null) {
|
setLeadingComments(commentWS.trailingNode, comments);
|
}
|
} else {
|
const {
|
containingNode: node,
|
start: commentStart
|
} = commentWS;
|
if (this.input.charCodeAt(commentStart - 1) === 44) {
|
switch (node.type) {
|
case "ObjectExpression":
|
case "ObjectPattern":
|
case "RecordExpression":
|
adjustInnerComments(node, node.properties, commentWS);
|
break;
|
case "CallExpression":
|
case "OptionalCallExpression":
|
adjustInnerComments(node, node.arguments, commentWS);
|
break;
|
case "FunctionDeclaration":
|
case "FunctionExpression":
|
case "ArrowFunctionExpression":
|
case "ObjectMethod":
|
case "ClassMethod":
|
case "ClassPrivateMethod":
|
adjustInnerComments(node, node.params, commentWS);
|
break;
|
case "ArrayExpression":
|
case "ArrayPattern":
|
case "TupleExpression":
|
adjustInnerComments(node, node.elements, commentWS);
|
break;
|
case "ExportNamedDeclaration":
|
case "ImportDeclaration":
|
adjustInnerComments(node, node.specifiers, commentWS);
|
break;
|
default:
|
{
|
setInnerComments(node, comments);
|
}
|
}
|
} else {
|
setInnerComments(node, comments);
|
}
|
}
|
}
|
finalizeRemainingComments() {
|
const {
|
commentStack
|
} = this.state;
|
for (let i = commentStack.length - 1; i >= 0; i--) {
|
this.finalizeComment(commentStack[i]);
|
}
|
this.state.commentStack = [];
|
}
|
resetPreviousNodeTrailingComments(node) {
|
const {
|
commentStack
|
} = this.state;
|
const {
|
length
|
} = commentStack;
|
if (length === 0) return;
|
const commentWS = commentStack[length - 1];
|
if (commentWS.leadingNode === node) {
|
commentWS.leadingNode = null;
|
}
|
}
|
resetPreviousIdentifierLeadingComments(node) {
|
const {
|
commentStack
|
} = this.state;
|
const {
|
length
|
} = commentStack;
|
if (length === 0) return;
|
if (commentStack[length - 1].trailingNode === node) {
|
commentStack[length - 1].trailingNode = null;
|
} else if (length >= 2 && commentStack[length - 2].trailingNode === node) {
|
commentStack[length - 2].trailingNode = null;
|
}
|
}
|
takeSurroundingComments(node, start, end) {
|
const {
|
commentStack
|
} = this.state;
|
const commentStackLength = commentStack.length;
|
if (commentStackLength === 0) return;
|
let i = commentStackLength - 1;
|
for (; i >= 0; i--) {
|
const commentWS = commentStack[i];
|
const commentEnd = commentWS.end;
|
const commentStart = commentWS.start;
|
if (commentStart === end) {
|
commentWS.leadingNode = node;
|
} else if (commentEnd === start) {
|
commentWS.trailingNode = node;
|
} else if (commentEnd < start) {
|
break;
|
}
|
}
|
}
|
}
|
exports.default = CommentsParser;
|
|
//# sourceMappingURL=comments.js.map
|