Spaces:
Runtime error
Runtime error
| 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()]; | |
| } | |
| } | |
| } | |
| }); | |