Spaces:
Runtime error
Runtime error
File size: 1,901 Bytes
b5ea024 |
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
import { re } from './id.js';
/** @typedef {import('estree').Comment} Comment */
/** @typedef {import('estree').Node} Node */
/**
* @typedef {Node & {
* start: number;
* end: number;
* has_trailing_newline?: boolean
* }} NodeWithLocation
*/
/**
* @typedef {Comment & {
* start: number;
* end: number;
* has_trailing_newline?: boolean
* }} CommentWithLocation
*/
/**
* @param {CommentWithLocation[]} comments
* @param {string} raw
*/
export const get_comment_handlers = (comments, raw) => ({
// pass to acorn options
/**
* @param {boolean} block
* @param {string} value
* @param {number} start
* @param {number} end
*/
onComment: (block, value, start, end) => {
if (block && /\n/.test(value)) {
let a = start;
while (a > 0 && raw[a - 1] !== '\n') a -= 1;
let b = a;
while (/[ \t]/.test(raw[b])) b += 1;
const indentation = raw.slice(a, b);
value = value.replace(new RegExp(`^${indentation}`, 'gm'), '');
}
comments.push({ type: block ? 'Block' : 'Line', value, start, end });
},
// pass to estree-walker options
/** @param {NodeWithLocation} node */
enter(node) {
let comment;
while (comments[0] && comments[0].start < node.start) {
comment = comments.shift();
comment.value = comment.value.replace(
re,
(match, id, at, hash, value) => {
if (hash) return `#${value}`;
if (at) return `@${value}`;
return match;
}
);
const next = comments[0] || node;
comment.has_trailing_newline =
comment.type === 'Line' ||
/\n/.test(raw.slice(comment.end, next.start));
(node.leadingComments || (node.leadingComments = [])).push(comment);
}
},
/** @param {NodeWithLocation} node */
leave(node) {
if (comments[0]) {
const slice = raw.slice(node.end, comments[0].start);
if (/^[,) \t]*$/.test(slice)) {
node.trailingComments = [comments.shift()];
}
}
}
});
|