printer.js.map
56.2 KB
{"version":3,"names":["isFunction","isStatement","isClassBody","isTSInterfaceBody","SCIENTIFIC_NOTATION","ZERO_DECIMAL_INTEGER","NON_DECIMAL_LITERAL","PURE_ANNOTATION_RE","HAS_NEWLINE","HAS_BlOCK_COMMENT_END","needsParens","n","Printer","constructor","format","map","inForStatementInitCounter","_printStack","_indent","_indentChar","_indentRepeat","_insideAux","_parenPushNewlineState","_noLineTerminator","_printAuxAfterOnNextUserNode","_printedComments","Set","_endsWithInteger","_endsWithWord","_lastCommentLine","_endsWithInnerRaw","_indentInnerComments","_buf","Buffer","indent","style","charCodeAt","length","generate","ast","print","_maybeAddAuxComment","get","compact","concise","dedent","semicolon","force","_appendChar","_queue","rightBrace","minified","removeLastSemicolon","token","space","_space","hasContent","lastCp","getLastChar","word","str","noLineTerminatorAfter","_maybePrintInnerComments","endsWith","_append","number","Number","isInteger","test","maybeNewline","lastChar","strFirst","tokenChar","char","newline","i","retainLines","getNewlineCount","j","_newline","endsWithCharAndNewline","removeTrailingNewline","exactSource","loc","cb","_catchUp","source","prop","sourceWithOffset","lineOffset","columnOffset","withSource","_maybeAddParen","_maybeIndent","append","_maybeAddParenChar","appendChar","queue","firstChar","queueIndentation","_getIndent","_shouldIndent","parenPushNewlineState","printed","len","cha","chaPost","slice","catchUp","line","count","getCurrentLine","pos","printTerminatorless","node","parent","isLabel","terminatorState","trailingCommentsLineOffset","forceParens","nodeType","type","oldConcise","_compact","printMethod","undefined","ReferenceError","JSON","stringify","name","push","oldInAux","shouldPrintParens","retainFunctionParens","extra","parenthesized","_printLeadingComments","bind","_printTrailingComments","pop","enteredPositionlessNode","_printAuxBeforeComment","_printAuxAfterComment","comment","auxiliaryCommentBefore","_printComment","value","auxiliaryCommentAfter","getPossibleRaw","raw","rawValue","printJoin","nodes","opts","newlineOpts","addNewlines","nextNodeStartLine","separator","statement","_printNewline","iterator","nextNode","start","printAndIndentOnComments","leadingComments","printBlock","body","innerComments","trailingComments","_printComments","comments","printInnerComments","hasSpace","printedCommentsCount","size","noIndentInnerCommentsHere","printSequence","printList","items","commaSeparator","newLine","startLine","lastCommentLine","offset","skipNewLines","ignore","has","noLineTerminator","shouldPrintComment","add","isBlockComment","printNewLines","lastCharCode","val","adjustMultilineComment","column","newlineRegex","RegExp","replace","indentSize","getCurrentColumn","repeat","nodeLoc","hasLoc","nodeStartLine","nodeEndLine","end","lastLine","leadingCommentNewline","commentStartLine","commentEndLine","Math","max","min","singleLine","shouldSkipNewline","properties","skippedDueToNewline","Object","assign","prototype","generatorFunctions","Noop"],"sources":["../src/printer.ts"],"sourcesContent":["import Buffer from \"./buffer\";\nimport type { Loc } from \"./buffer\";\nimport * as n from \"./node\";\nimport type * as t from \"@babel/types\";\nimport {\n isFunction,\n isStatement,\n isClassBody,\n isTSInterfaceBody,\n} from \"@babel/types\";\nimport type {\n RecordAndTuplePluginOptions,\n PipelineOperatorPluginOptions,\n} from \"@babel/parser\";\nimport type { Opts as jsescOptions } from \"jsesc\";\n\nimport * as generatorFunctions from \"./generators\";\nimport type SourceMap from \"./source-map\";\nimport * as charCodes from \"charcodes\";\n\nconst SCIENTIFIC_NOTATION = /e/i;\nconst ZERO_DECIMAL_INTEGER = /\\.0+$/;\nconst NON_DECIMAL_LITERAL = /^0[box]/;\nconst PURE_ANNOTATION_RE = /^\\s*[@#]__PURE__\\s*$/;\nconst HAS_NEWLINE = /[\\n\\r\\u2028\\u2029]/;\nconst HAS_BlOCK_COMMENT_END = /\\*\\//;\n\nconst { needsParens } = n;\n\nconst enum COMMENT_TYPE {\n LEADING,\n INNER,\n TRAILING,\n}\n\nconst enum COMMENT_SKIP_NEWLINE {\n DEFAULT,\n SKIP_ALL,\n SKIP_LEADING,\n SKIP_TRAILING,\n}\n\nexport type Format = {\n shouldPrintComment: (comment: string) => boolean;\n retainLines: boolean;\n retainFunctionParens: boolean;\n comments: boolean;\n auxiliaryCommentBefore: string;\n auxiliaryCommentAfter: string;\n compact: boolean | \"auto\";\n minified: boolean;\n concise: boolean;\n indent: {\n adjustMultilineComment: boolean;\n style: string;\n };\n recordAndTupleSyntaxType: RecordAndTuplePluginOptions[\"syntaxType\"];\n jsescOption: jsescOptions;\n jsonCompatibleStrings?: boolean;\n /**\n * For use with the Hack-style pipe operator.\n * Changes what token is used for pipe bodies’ topic references.\n */\n topicToken?: PipelineOperatorPluginOptions[\"topicToken\"];\n /**\n * @deprecated Removed in Babel 8\n */\n decoratorsBeforeExport?: boolean;\n};\n\ninterface AddNewlinesOptions {\n addNewlines(leading: boolean, node: t.Node): number;\n nextNodeStartLine: number;\n}\n\ninterface PrintSequenceOptions extends Partial<AddNewlinesOptions> {\n statement?: boolean;\n indent?: boolean;\n trailingCommentsLineOffset?: number;\n}\n\ninterface PrintListOptions {\n separator?: (this: Printer) => void;\n iterator?: (node: t.Node, index: number) => void;\n statement?: boolean;\n indent?: boolean;\n}\n\nexport type PrintJoinOptions = PrintListOptions & PrintSequenceOptions;\nclass Printer {\n constructor(format: Format, map: SourceMap) {\n this.format = format;\n this._buf = new Buffer(map);\n\n this._indentChar = format.indent.style.charCodeAt(0);\n this._indentRepeat = format.indent.style.length;\n }\n\n declare format: Format;\n inForStatementInitCounter: number = 0;\n\n declare _buf: Buffer;\n _printStack: Array<t.Node> = [];\n _indent: number = 0;\n _indentChar: number = 0;\n _indentRepeat: number = 0;\n _insideAux: boolean = false;\n _parenPushNewlineState: { printed: boolean } | null = null;\n _noLineTerminator: boolean = false;\n _printAuxAfterOnNextUserNode: boolean = false;\n _printedComments = new Set<t.Comment>();\n _endsWithInteger = false;\n _endsWithWord = false;\n _lastCommentLine = 0;\n _endsWithInnerRaw: boolean = false;\n _indentInnerComments: boolean = true;\n\n generate(ast: t.Node) {\n this.print(ast);\n this._maybeAddAuxComment();\n\n return this._buf.get();\n }\n\n /**\n * Increment indent size.\n */\n\n indent(): void {\n if (this.format.compact || this.format.concise) return;\n\n this._indent++;\n }\n\n /**\n * Decrement indent size.\n */\n\n dedent(): void {\n if (this.format.compact || this.format.concise) return;\n\n this._indent--;\n }\n\n /**\n * Add a semicolon to the buffer.\n */\n\n semicolon(force: boolean = false): void {\n this._maybeAddAuxComment();\n if (force) {\n this._appendChar(charCodes.semicolon);\n } else {\n this._queue(charCodes.semicolon);\n }\n this._noLineTerminator = false;\n }\n\n /**\n * Add a right brace to the buffer.\n */\n\n rightBrace(): void {\n if (this.format.minified) {\n this._buf.removeLastSemicolon();\n }\n this.token(\"}\");\n }\n\n /**\n * Add a space to the buffer unless it is compact.\n */\n\n space(force: boolean = false): void {\n if (this.format.compact) return;\n\n if (force) {\n this._space();\n } else if (this._buf.hasContent()) {\n const lastCp = this.getLastChar();\n if (lastCp !== charCodes.space && lastCp !== charCodes.lineFeed) {\n this._space();\n }\n }\n }\n\n /**\n * Writes a token that can't be safely parsed without taking whitespace into account.\n */\n\n word(str: string, noLineTerminatorAfter: boolean = false): void {\n this._maybePrintInnerComments();\n\n // prevent concatenating words and creating // comment out of division and regex\n if (\n this._endsWithWord ||\n (str.charCodeAt(0) === charCodes.slash && this.endsWith(charCodes.slash))\n ) {\n this._space();\n }\n\n this._maybeAddAuxComment();\n this._append(str, false);\n\n this._endsWithWord = true;\n this._noLineTerminator = noLineTerminatorAfter;\n }\n\n /**\n * Writes a number token so that we can validate if it is an integer.\n */\n\n number(str: string): void {\n this.word(str);\n\n // Integer tokens need special handling because they cannot have '.'s inserted\n // immediately after them.\n this._endsWithInteger =\n Number.isInteger(+str) &&\n !NON_DECIMAL_LITERAL.test(str) &&\n !SCIENTIFIC_NOTATION.test(str) &&\n !ZERO_DECIMAL_INTEGER.test(str) &&\n str.charCodeAt(str.length - 1) !== charCodes.dot;\n }\n\n /**\n * Writes a simple token.\n */\n\n token(str: string, maybeNewline = false): void {\n this._maybePrintInnerComments();\n\n // space is mandatory to avoid outputting <!--\n // http://javascript.spec.whatwg.org/#comment-syntax\n const lastChar = this.getLastChar();\n const strFirst = str.charCodeAt(0);\n if (\n (lastChar === charCodes.exclamationMark && str === \"--\") ||\n // Need spaces for operators of the same kind to avoid: `a+++b`\n (strFirst === charCodes.plusSign && lastChar === charCodes.plusSign) ||\n (strFirst === charCodes.dash && lastChar === charCodes.dash) ||\n // Needs spaces to avoid changing '34' to '34.', which would still be a valid number.\n (strFirst === charCodes.dot && this._endsWithInteger)\n ) {\n this._space();\n }\n\n this._maybeAddAuxComment();\n this._append(str, maybeNewline);\n this._noLineTerminator = false;\n }\n\n tokenChar(char: number): void {\n this._maybePrintInnerComments();\n\n // space is mandatory to avoid outputting <!--\n // http://javascript.spec.whatwg.org/#comment-syntax\n const lastChar = this.getLastChar();\n if (\n // Need spaces for operators of the same kind to avoid: `a+++b`\n (char === charCodes.plusSign && lastChar === charCodes.plusSign) ||\n (char === charCodes.dash && lastChar === charCodes.dash) ||\n // Needs spaces to avoid changing '34' to '34.', which would still be a valid number.\n (char === charCodes.dot && this._endsWithInteger)\n ) {\n this._space();\n }\n\n this._maybeAddAuxComment();\n this._appendChar(char);\n this._noLineTerminator = false;\n }\n\n /**\n * Add a newline (or many newlines), maintaining formatting.\n * This function checks the number of newlines in the queue and subtracts them.\n * It currently has some limitations.\n * @see {Buffer#getNewlineCount}\n */\n newline(i: number = 1, force?: boolean): void {\n if (i <= 0) return;\n\n if (!force) {\n if (this.format.retainLines || this.format.compact) return;\n\n if (this.format.concise) {\n this.space();\n return;\n }\n }\n\n if (i > 2) i = 2; // Max two lines\n\n i -= this._buf.getNewlineCount();\n\n for (let j = 0; j < i; j++) {\n this._newline();\n }\n\n return;\n }\n\n endsWith(char: number): boolean {\n return this.getLastChar() === char;\n }\n\n getLastChar(): number {\n return this._buf.getLastChar();\n }\n\n endsWithCharAndNewline(): number {\n return this._buf.endsWithCharAndNewline();\n }\n\n removeTrailingNewline(): void {\n this._buf.removeTrailingNewline();\n }\n\n exactSource(loc: Loc | undefined, cb: () => void) {\n if (!loc) return cb();\n\n this._catchUp(\"start\", loc);\n\n this._buf.exactSource(loc, cb);\n }\n\n source(prop: \"start\" | \"end\", loc: Loc | undefined): void {\n if (!loc) return;\n\n this._catchUp(prop, loc);\n\n this._buf.source(prop, loc);\n }\n\n sourceWithOffset(\n prop: \"start\" | \"end\",\n loc: Loc | undefined,\n lineOffset: number,\n columnOffset: number,\n ): void {\n if (!loc) return;\n\n this._catchUp(prop, loc);\n\n this._buf.sourceWithOffset(prop, loc, lineOffset, columnOffset);\n }\n\n withSource(\n prop: \"start\" | \"end\",\n loc: Loc | undefined,\n cb: () => void,\n ): void {\n if (!loc) return cb();\n\n this._catchUp(prop, loc);\n\n this._buf.withSource(prop, loc, cb);\n }\n\n _space(): void {\n this._queue(charCodes.space);\n }\n\n _newline(): void {\n this._queue(charCodes.lineFeed);\n }\n\n _append(str: string, maybeNewline: boolean): void {\n this._maybeAddParen(str);\n this._maybeIndent(str.charCodeAt(0));\n\n this._buf.append(str, maybeNewline);\n\n this._endsWithWord = false;\n this._endsWithInteger = false;\n }\n\n _appendChar(char: number): void {\n this._maybeAddParenChar(char);\n this._maybeIndent(char);\n\n this._buf.appendChar(char);\n\n this._endsWithWord = false;\n this._endsWithInteger = false;\n }\n\n _queue(char: number) {\n this._maybeAddParenChar(char);\n this._maybeIndent(char);\n\n this._buf.queue(char);\n\n this._endsWithWord = false;\n this._endsWithInteger = false;\n }\n\n _maybeIndent(firstChar: number): void {\n // we've got a newline before us so prepend on the indentation\n if (\n this._indent &&\n firstChar !== charCodes.lineFeed &&\n this.endsWith(charCodes.lineFeed)\n ) {\n this._buf.queueIndentation(this._indentChar, this._getIndent());\n }\n }\n\n _shouldIndent(firstChar: number) {\n // we've got a newline before us so prepend on the indentation\n if (\n this._indent &&\n firstChar !== charCodes.lineFeed &&\n this.endsWith(charCodes.lineFeed)\n ) {\n return true;\n }\n }\n\n _maybeAddParenChar(char: number): void {\n // see startTerminatorless() instance method\n const parenPushNewlineState = this._parenPushNewlineState;\n if (!parenPushNewlineState) return;\n\n // This function does two things:\n // - If needed, prints a parenthesis\n // - If the currently printed string removes the need for the paren,\n // it resets the _parenPushNewlineState field.\n // Almost everything removes the need for a paren, except for\n // comments and whitespaces.\n\n if (char === charCodes.space) {\n // Whitespaces only, the parentheses might still be needed.\n return;\n }\n\n // Check for newline or comment.\n if (char !== charCodes.lineFeed) {\n this._parenPushNewlineState = null;\n return;\n }\n\n this.token(\"(\");\n this.indent();\n parenPushNewlineState.printed = true;\n }\n\n _maybeAddParen(str: string): void {\n // see startTerminatorless() instance method\n const parenPushNewlineState = this._parenPushNewlineState;\n if (!parenPushNewlineState) return;\n\n // This function does two things:\n // - If needed, prints a parenthesis\n // - If the currently printed string removes the need for the paren,\n // it resets the _parenPushNewlineState field.\n // Almost everything removes the need for a paren, except for\n // comments and whitespaces.\n\n const len = str.length;\n\n let i;\n for (i = 0; i < len && str.charCodeAt(i) === charCodes.space; i++) continue;\n if (i === len) {\n // Whitespaces only, the parentheses might still be needed.\n return;\n }\n\n // Check for newline or comment.\n const cha = str.charCodeAt(i);\n if (cha !== charCodes.lineFeed) {\n if (\n // This is not a comment (it doesn't start with /)\n cha !== charCodes.slash ||\n // This is not a comment (it's a / operator)\n i + 1 === len\n ) {\n // After a normal token, the parentheses aren't needed anymore\n this._parenPushNewlineState = null;\n return;\n }\n\n const chaPost = str.charCodeAt(i + 1);\n\n if (chaPost === charCodes.asterisk) {\n // This is a block comment\n\n if (PURE_ANNOTATION_RE.test(str.slice(i + 2, len - 2))) {\n // We avoid printing newlines after #__PURE__ comments (we treat\n // then as unary operators), but we must keep the old\n // parenPushNewlineState because, if a newline was forbidden, it is\n // still forbidden after the comment.\n return;\n }\n\n // NOTE: code flow continues from here to after these if/elses\n } else if (chaPost !== charCodes.slash) {\n // This is neither a block comment, nor a line comment.\n // After a normal token, the parentheses aren't needed anymore\n this._parenPushNewlineState = null;\n return;\n }\n }\n\n this.token(\"(\");\n this.indent();\n parenPushNewlineState.printed = true;\n }\n\n catchUp(line: number) {\n if (!this.format.retainLines) return;\n\n // catch up to this nodes newline if we're behind\n const count = line - this._buf.getCurrentLine();\n\n for (let i = 0; i < count; i++) {\n this._newline();\n }\n }\n\n _catchUp(prop: \"start\" | \"end\", loc?: Loc) {\n if (!this.format.retainLines) return;\n\n // catch up to this nodes newline if we're behind\n const pos = loc ? loc[prop] : null;\n if (pos?.line != null) {\n const count = pos.line - this._buf.getCurrentLine();\n\n for (let i = 0; i < count; i++) {\n this._newline();\n }\n }\n }\n\n /**\n * Get the current indent.\n */\n\n _getIndent(): number {\n return this._indentRepeat * this._indent;\n }\n\n printTerminatorless(node: t.Node, parent: t.Node, isLabel: boolean) {\n /**\n * Set some state that will be modified if a newline has been inserted before any\n * non-space characters.\n *\n * This is to prevent breaking semantics for terminatorless separator nodes. eg:\n *\n * return foo;\n *\n * returns `foo`. But if we do:\n *\n * return\n * foo;\n *\n * `undefined` will be returned and not `foo` due to the terminator.\n */\n if (isLabel) {\n this._noLineTerminator = true;\n this.print(node, parent);\n } else {\n const terminatorState = {\n printed: false,\n };\n this._parenPushNewlineState = terminatorState;\n this.print(node, parent);\n /**\n * Print an ending parentheses if a starting one has been printed.\n */\n if (terminatorState.printed) {\n this.dedent();\n this.newline();\n this.token(\")\");\n }\n }\n }\n\n print(\n node: t.Node | null,\n parent?: t.Node,\n noLineTerminatorAfter?: boolean,\n // trailingCommentsLineOffset also used to check if called from printJoin\n // it will be ignored if `noLineTerminatorAfter||this._noLineTerminator`\n trailingCommentsLineOffset?: number,\n forceParens?: boolean,\n ) {\n if (!node) return;\n\n this._endsWithInnerRaw = false;\n\n const nodeType = node.type;\n const format = this.format;\n\n const oldConcise = format.concise;\n if (\n // @ts-expect-error document _compact AST properties\n node._compact\n ) {\n format.concise = true;\n }\n\n const printMethod =\n this[\n nodeType as Exclude<\n t.Node[\"type\"],\n // removed\n | \"Noop\"\n // renamed\n | t.DeprecatedAliases[\"type\"]\n >\n ];\n if (printMethod === undefined) {\n throw new ReferenceError(\n `unknown node of type ${JSON.stringify(\n nodeType,\n )} with constructor ${JSON.stringify(node.constructor.name)}`,\n );\n }\n\n this._printStack.push(node);\n\n const oldInAux = this._insideAux;\n this._insideAux = node.loc == undefined;\n this._maybeAddAuxComment(this._insideAux && !oldInAux);\n\n let shouldPrintParens = false;\n if (forceParens) {\n shouldPrintParens = true;\n } else if (\n format.retainFunctionParens &&\n nodeType === \"FunctionExpression\" &&\n node.extra &&\n node.extra.parenthesized\n ) {\n shouldPrintParens = true;\n } else {\n shouldPrintParens = needsParens(node, parent, this._printStack);\n }\n if (shouldPrintParens) this.token(\"(\");\n\n this._lastCommentLine = 0;\n\n this._printLeadingComments(node, parent);\n\n const loc = nodeType === \"Program\" || nodeType === \"File\" ? null : node.loc;\n\n this.exactSource(loc, printMethod.bind(this, node, parent));\n\n if (shouldPrintParens) {\n this._printTrailingComments(node, parent);\n this.token(\")\");\n this._noLineTerminator = noLineTerminatorAfter;\n } else if (noLineTerminatorAfter && !this._noLineTerminator) {\n this._noLineTerminator = true;\n this._printTrailingComments(node, parent);\n } else {\n this._printTrailingComments(node, parent, trailingCommentsLineOffset);\n }\n\n // end\n this._printStack.pop();\n\n format.concise = oldConcise;\n this._insideAux = oldInAux;\n\n this._endsWithInnerRaw = false;\n }\n\n _maybeAddAuxComment(enteredPositionlessNode?: boolean) {\n if (enteredPositionlessNode) this._printAuxBeforeComment();\n if (!this._insideAux) this._printAuxAfterComment();\n }\n\n _printAuxBeforeComment() {\n if (this._printAuxAfterOnNextUserNode) return;\n this._printAuxAfterOnNextUserNode = true;\n\n const comment = this.format.auxiliaryCommentBefore;\n if (comment) {\n this._printComment(\n {\n type: \"CommentBlock\",\n value: comment,\n },\n COMMENT_SKIP_NEWLINE.DEFAULT,\n );\n }\n }\n\n _printAuxAfterComment() {\n if (!this._printAuxAfterOnNextUserNode) return;\n this._printAuxAfterOnNextUserNode = false;\n\n const comment = this.format.auxiliaryCommentAfter;\n if (comment) {\n this._printComment(\n {\n type: \"CommentBlock\",\n value: comment,\n },\n COMMENT_SKIP_NEWLINE.DEFAULT,\n );\n }\n }\n\n getPossibleRaw(\n node:\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.DecimalLiteral\n | t.DirectiveLiteral\n | t.JSXText,\n ): string | undefined {\n const extra = node.extra;\n if (\n extra &&\n extra.raw != null &&\n extra.rawValue != null &&\n node.value === extra.rawValue\n ) {\n // @ts-expect-error: The extra.raw of these AST node types must be a string\n return extra.raw;\n }\n }\n\n printJoin(\n nodes: Array<t.Node> | undefined | null,\n parent: t.Node,\n opts: PrintJoinOptions = {},\n ) {\n if (!nodes?.length) return;\n\n if (opts.indent) this.indent();\n\n const newlineOpts: AddNewlinesOptions = {\n addNewlines: opts.addNewlines,\n nextNodeStartLine: 0,\n };\n\n const separator = opts.separator ? opts.separator.bind(this) : null;\n\n const len = nodes.length;\n for (let i = 0; i < len; i++) {\n const node = nodes[i];\n if (!node) continue;\n\n if (opts.statement) this._printNewline(i === 0, newlineOpts);\n\n this.print(node, parent, undefined, opts.trailingCommentsLineOffset || 0);\n\n opts.iterator?.(node, i);\n\n if (i < len - 1) separator?.();\n\n if (opts.statement) {\n if (i + 1 === len) {\n this.newline(1);\n } else {\n const nextNode = nodes[i + 1];\n newlineOpts.nextNodeStartLine = nextNode.loc?.start.line || 0;\n\n this._printNewline(true, newlineOpts);\n }\n }\n }\n\n if (opts.indent) this.dedent();\n }\n\n printAndIndentOnComments(node: t.Node, parent: t.Node) {\n const indent = node.leadingComments && node.leadingComments.length > 0;\n if (indent) this.indent();\n this.print(node, parent);\n if (indent) this.dedent();\n }\n\n printBlock(parent: Extract<t.Node, { body: t.Statement }>) {\n const node = parent.body;\n\n if (node.type !== \"EmptyStatement\") {\n this.space();\n }\n\n this.print(node, parent);\n }\n\n _printTrailingComments(node: t.Node, parent?: t.Node, lineOffset?: number) {\n const { innerComments, trailingComments } = node;\n // We print inner comments here, so that if for some reason they couldn't\n // be printed in earlier locations they are still printed *somehwere*,\n // even if at the end of the node.\n if (innerComments?.length) {\n this._printComments(\n COMMENT_TYPE.TRAILING,\n innerComments,\n node,\n parent,\n lineOffset,\n );\n }\n if (trailingComments?.length) {\n this._printComments(\n COMMENT_TYPE.TRAILING,\n trailingComments,\n node,\n parent,\n lineOffset,\n );\n }\n }\n\n _printLeadingComments(node: t.Node, parent: t.Node) {\n const comments = node.leadingComments;\n if (!comments?.length) return;\n this._printComments(COMMENT_TYPE.LEADING, comments, node, parent);\n }\n\n _maybePrintInnerComments() {\n if (this._endsWithInnerRaw) this.printInnerComments();\n this._endsWithInnerRaw = true;\n this._indentInnerComments = true;\n }\n\n printInnerComments() {\n const node = this._printStack[this._printStack.length - 1];\n const comments = node.innerComments;\n if (!comments?.length) return;\n\n const hasSpace = this.endsWith(charCodes.space);\n const indent = this._indentInnerComments;\n const printedCommentsCount = this._printedComments.size;\n if (indent) this.indent();\n this._printComments(COMMENT_TYPE.INNER, comments, node);\n if (hasSpace && printedCommentsCount !== this._printedComments.size) {\n this.space();\n }\n if (indent) this.dedent();\n }\n\n noIndentInnerCommentsHere() {\n this._indentInnerComments = false;\n }\n\n printSequence(\n nodes: t.Node[],\n parent: t.Node,\n opts: PrintSequenceOptions = {},\n ) {\n opts.statement = true;\n return this.printJoin(nodes, parent, opts);\n }\n\n printList(items: t.Node[], parent: t.Node, opts: PrintListOptions = {}) {\n if (opts.separator == null) {\n opts.separator = commaSeparator;\n }\n\n return this.printJoin(items, parent, opts);\n }\n\n _printNewline(newLine: boolean, opts: AddNewlinesOptions) {\n // Fast path since 'this.newline' does nothing when not tracking lines.\n if (this.format.retainLines || this.format.compact) return;\n\n // Fast path for concise since 'this.newline' just inserts a space when\n // concise formatting is in use.\n if (this.format.concise) {\n this.space();\n return;\n }\n\n if (!newLine) {\n return;\n }\n\n const startLine = opts.nextNodeStartLine;\n const lastCommentLine = this._lastCommentLine;\n if (startLine > 0 && lastCommentLine > 0) {\n const offset = startLine - lastCommentLine;\n if (offset >= 0) {\n this.newline(offset || 1);\n return;\n }\n }\n\n // don't add newlines at the beginning of the file\n if (this._buf.hasContent()) {\n // Here is the logic of the original line wrapping according to the node layout, we are not using it now.\n // We currently add at most one newline to each node in the list, ignoring `opts.addNewlines`.\n\n // let lines = 0;\n // if (!leading) lines++; // always include at least a single line after\n // if (opts.addNewlines) lines += opts.addNewlines(leading, node) || 0;\n\n // const needs = leading ? needsWhitespaceBefore : needsWhitespaceAfter;\n // if (needs(node, parent)) lines++;\n\n // this.newline(Math.min(2, lines));\n\n this.newline(1);\n }\n }\n\n // Returns `true` if the comment cannot be printed in this position due to\n // line terminators, signaling that the print comments loop can stop and\n // resume printing comments at the next posisble position. This happens when\n // printing inner comments, since if we have an inner comment with a multiline\n // there is at least one inner position where line terminators are allowed.\n _printComment(\n comment: t.Comment,\n skipNewLines: COMMENT_SKIP_NEWLINE,\n ): boolean {\n // Some plugins (such as flow-strip-types) use this to mark comments as removed using the AST-root 'comments' property,\n // where they can't manually mutate the AST node comment lists.\n if (comment.ignore) return false;\n\n if (this._printedComments.has(comment)) return false;\n\n const noLineTerminator = this._noLineTerminator;\n\n if (\n noLineTerminator &&\n (HAS_NEWLINE.test(comment.value) ||\n HAS_BlOCK_COMMENT_END.test(comment.value))\n ) {\n return true;\n }\n\n if (!this.format.shouldPrintComment(comment.value)) return false;\n\n this._printedComments.add(comment);\n\n const isBlockComment = comment.type === \"CommentBlock\";\n\n // Add a newline before and after a block comment, unless explicitly\n // disallowed\n const printNewLines =\n isBlockComment &&\n skipNewLines !== COMMENT_SKIP_NEWLINE.SKIP_ALL &&\n !this._noLineTerminator;\n\n if (\n printNewLines &&\n this._buf.hasContent() &&\n skipNewLines !== COMMENT_SKIP_NEWLINE.SKIP_LEADING\n ) {\n this.newline(1);\n }\n\n const lastCharCode = this.getLastChar();\n if (\n lastCharCode !== charCodes.leftSquareBracket &&\n lastCharCode !== charCodes.leftCurlyBrace\n ) {\n this.space();\n }\n\n let val;\n if (isBlockComment) {\n val = `/*${comment.value}*/`;\n if (this.format.indent.adjustMultilineComment) {\n const offset = comment.loc?.start.column;\n if (offset) {\n const newlineRegex = new RegExp(\"\\\\n\\\\s{1,\" + offset + \"}\", \"g\");\n val = val.replace(newlineRegex, \"\\n\");\n }\n\n let indentSize = this.format.retainLines\n ? 0\n : this._buf.getCurrentColumn();\n\n if (this._shouldIndent(charCodes.slash) || this.format.retainLines) {\n indentSize += this._getIndent();\n }\n\n val = val.replace(/\\n(?!$)/g, `\\n${\" \".repeat(indentSize)}`);\n }\n } else if (!noLineTerminator) {\n val = `//${comment.value}`;\n } else {\n // It was a single-line comment, so it's guaranteed to not\n // contain newlines and it can be safely printed as a block\n // comment.\n val = `/*${comment.value}*/`;\n }\n\n // Avoid creating //* comments\n if (this.endsWith(charCodes.slash)) this._space();\n\n this.source(\"start\", comment.loc);\n this._append(val, isBlockComment);\n\n if (!isBlockComment && !noLineTerminator) {\n this.newline(1, true);\n }\n\n if (printNewLines && skipNewLines !== COMMENT_SKIP_NEWLINE.SKIP_TRAILING) {\n this.newline(1);\n }\n\n return false;\n }\n\n _printComments(\n type: COMMENT_TYPE,\n comments: readonly t.Comment[],\n node: t.Node,\n parent?: t.Node,\n lineOffset: number = 0,\n ) {\n const nodeLoc = node.loc;\n const len = comments.length;\n let hasLoc = !!nodeLoc;\n const nodeStartLine = hasLoc ? nodeLoc.start.line : 0;\n const nodeEndLine = hasLoc ? nodeLoc.end.line : 0;\n let lastLine = 0;\n let leadingCommentNewline = 0;\n\n const maybeNewline = this._noLineTerminator\n ? function () {}\n : this.newline.bind(this);\n\n for (let i = 0; i < len; i++) {\n const comment = comments[i];\n\n const printed = this._printedComments.has(comment);\n if (hasLoc && comment.loc && !printed) {\n const commentStartLine = comment.loc.start.line;\n const commentEndLine = comment.loc.end.line;\n if (type === COMMENT_TYPE.LEADING) {\n let offset = 0;\n if (i === 0) {\n // Because currently we cannot handle blank lines before leading comments,\n // we always wrap before and after multi-line comments.\n if (\n this._buf.hasContent() &&\n (comment.type === \"CommentLine\" ||\n commentStartLine != commentEndLine)\n ) {\n offset = leadingCommentNewline = 1;\n }\n } else {\n offset = commentStartLine - lastLine;\n }\n lastLine = commentEndLine;\n\n maybeNewline(offset);\n this._printComment(comment, COMMENT_SKIP_NEWLINE.SKIP_ALL);\n\n if (i + 1 === len) {\n maybeNewline(\n Math.max(nodeStartLine - lastLine, leadingCommentNewline),\n );\n lastLine = nodeStartLine;\n }\n } else if (type === COMMENT_TYPE.INNER) {\n const offset =\n commentStartLine - (i === 0 ? nodeStartLine : lastLine);\n lastLine = commentEndLine;\n\n maybeNewline(offset);\n if (this._printComment(comment, COMMENT_SKIP_NEWLINE.SKIP_ALL)) break;\n\n if (i + 1 === len) {\n maybeNewline(Math.min(1, nodeEndLine - lastLine)); // TODO: Improve here when inner comments processing is stronger\n lastLine = nodeEndLine;\n }\n } else {\n const offset =\n commentStartLine - (i === 0 ? nodeEndLine - lineOffset : lastLine);\n lastLine = commentEndLine;\n\n maybeNewline(offset);\n this._printComment(comment, COMMENT_SKIP_NEWLINE.SKIP_ALL);\n }\n } else {\n hasLoc = false;\n\n if (printed) continue;\n\n if (len === 1) {\n const singleLine = comment.loc\n ? comment.loc.start.line === comment.loc.end.line\n : !HAS_NEWLINE.test(comment.value);\n\n const shouldSkipNewline =\n singleLine &&\n !isStatement(node) &&\n !isClassBody(parent) &&\n !isTSInterfaceBody(parent);\n\n if (type === COMMENT_TYPE.LEADING) {\n this._printComment(\n comment,\n (shouldSkipNewline && node.type !== \"ObjectExpression\") ||\n (singleLine && isFunction(parent, { body: node }))\n ? COMMENT_SKIP_NEWLINE.SKIP_ALL\n : COMMENT_SKIP_NEWLINE.DEFAULT,\n );\n } else if (shouldSkipNewline && type === COMMENT_TYPE.TRAILING) {\n if (this._printComment(comment, COMMENT_SKIP_NEWLINE.SKIP_ALL)) {\n break;\n }\n } else {\n this._printComment(comment, COMMENT_SKIP_NEWLINE.DEFAULT);\n }\n } else if (\n type === COMMENT_TYPE.INNER &&\n !(node.type === \"ObjectExpression\" && node.properties.length > 1) &&\n node.type !== \"ClassBody\" &&\n node.type !== \"TSInterfaceBody\"\n ) {\n // class X {\n // /*:: a: number*/\n // /*:: b: ?string*/\n // }\n\n const skippedDueToNewline = this._printComment(\n comment,\n i === 0\n ? COMMENT_SKIP_NEWLINE.SKIP_LEADING\n : i === len - 1\n ? COMMENT_SKIP_NEWLINE.SKIP_TRAILING\n : COMMENT_SKIP_NEWLINE.DEFAULT,\n );\n if (skippedDueToNewline) break;\n } else {\n this._printComment(comment, COMMENT_SKIP_NEWLINE.DEFAULT);\n }\n }\n }\n\n if (type === COMMENT_TYPE.TRAILING && hasLoc && lastLine) {\n this._lastCommentLine = lastLine;\n }\n }\n}\n\n// Expose the node type functions and helpers on the prototype for easy usage.\nObject.assign(Printer.prototype, generatorFunctions);\n\nif (!process.env.BABEL_8_BREAKING) {\n // @ts-ignore(Babel 7 vs Babel 8) Babel 7 has Noop print method\n Printer.prototype.Noop = function Noop(this: Printer) {};\n}\n\ntype GeneratorFunctions = typeof generatorFunctions;\ninterface Printer extends GeneratorFunctions {}\nexport default Printer;\n\nfunction commaSeparator(this: Printer) {\n this.token(\",\");\n this.space();\n}\n"],"mappings":"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"}