Source File
js_printer.go
Belonging Package
github.com/evanw/esbuild/internal/js_printer
package js_printer
import (
)
var positiveInfinity = math.Inf(1)
var negativeInfinity = math.Inf(-1)
if .GeneratedLine != 0 {
.AddBytes(bytes.Repeat([]byte{';'}, .GeneratedLine))
.GeneratedColumn = 0
}
:= 0
for [] == ';' {
++
}
if > 0 {
.AddBytes([:])
= [:]
.GeneratedColumn = 0
.GeneratedColumn = 0
}
.SourceIndex +=
.GeneratedColumn +=
.OriginalLine +=
.OriginalColumn +=
.AddBytes(appendMapping(nil, .lastByte, , ))
.AddBytes()
}
if != 0 && != ';' && != '"' {
= append(, ',')
}
= append(, sourcemap.EncodeVLQ(.GeneratedColumn-.GeneratedColumn)...)
.GeneratedColumn = .GeneratedColumn
= append(, sourcemap.EncodeVLQ(.SourceIndex-.SourceIndex)...)
.SourceIndex = .SourceIndex
= append(, sourcemap.EncodeVLQ(.OriginalLine-.OriginalLine)...)
.OriginalLine = .OriginalLine
= append(, sourcemap.EncodeVLQ(.OriginalColumn-.OriginalColumn)...)
.OriginalColumn = .OriginalColumn
return
}
type Joiner struct {
lastByte byte
strings []joinerString
bytes []joinerBytes
length uint32
}
type joinerString struct {
data string
offset uint32
}
type joinerBytes struct {
data []byte
offset uint32
}
func ( *Joiner) ( string) {
if len() > 0 {
.lastByte = [len()-1]
}
.strings = append(.strings, joinerString{, .length})
.length += uint32(len())
}
func ( *Joiner) ( []byte) {
if len() > 0 {
.lastByte = [len()-1]
}
.bytes = append(.bytes, joinerBytes{, .length})
.length += uint32(len())
}
func ( *Joiner) () byte {
return .lastByte
}
func ( *Joiner) () uint32 {
return .length
}
func ( *Joiner) () []byte {
:= make([]byte, .length)
for , := range .strings {
copy([.offset:], .data)
}
for , := range .bytes {
copy([.offset:], .data)
}
return
}
const hexChars = "0123456789ABCDEF"
const firstASCII = 0x20
const lastASCII = 0x7E
const firstHighSurrogate = 0xD800
const lastHighSurrogate = 0xDBFF
const firstLowSurrogate = 0xDC00
const lastLowSurrogate = 0xDFFF
func ( rune, bool) bool {
if <= lastASCII {
return >= firstASCII && != '\\' && != '"'
} else {
return ! && != '\uFEFF' && ( < firstHighSurrogate || > lastLowSurrogate)
}
}
:= 2
for , := range {
if canPrintWithoutEscape(, ) {
+= utf8.RuneLen()
} else {
switch {
case '\b', '\f', '\n', '\r', '\t', '\\', '"':
+= 2
default:
if <= 0xFFFF {
+= 6
} else {
+= 12
}
}
}
}
if canPrintWithoutEscape(, ) {
:=
+=
for < {
, = js_lexer.DecodeWTF8Rune([:])
if !canPrintWithoutEscape(, ) {
break
}
+=
}
= append(, [:]...)
continue
}
switch {
case '\b':
= append(, "\\b"...)
++
case '\f':
= append(, "\\f"...)
++
case '\n':
= append(, "\\n"...)
++
case '\r':
= append(, "\\r"...)
++
case '\t':
= append(, "\\t"...)
++
case '\\':
= append(, "\\\\"...)
++
case '"':
= append(, "\\\""...)
++
default:
+=
if <= 0xFFFF {
= append(
,
'\\', 'u', hexChars[>>12], hexChars[(>>8)&15], hexChars[(>>4)&15], hexChars[&15],
)
} else {
-= 0x10000
:= firstHighSurrogate + (( >> 10) & 0x3FF)
:= firstLowSurrogate + ( & 0x3FF)
= append(
,
'\\', 'u', hexChars[>>12], hexChars[(>>8)&15], hexChars[(>>4)&15], hexChars[&15],
'\\', 'u', hexChars[>>12], hexChars[(>>8)&15], hexChars[(>>4)&15], hexChars[&15],
)
}
}
}
return append(, '"')
}
func ( []byte, string, compat.JSFeature) []byte {
:= false
:= 0
for , := range {
if ! {
= true
=
}
if {
= append(, [:]...)
= false
}
if <= 0xFFFF {
= append(, '\\', 'u', hexChars[>>12], hexChars[(>>8)&15], hexChars[(>>4)&15], hexChars[&15])
} else if !.Has(compat.UnicodeEscapes) {
= append(, fmt.Sprintf("\\u{%X}", )...)
} else {
panic("Internal error: Cannot encode identifier: Unicode escapes are unsupported")
}
}
}
case '\x07':
= append(, "\\x07"...)
case '\b':
= append(, "\\b"...)
case '\f':
= append(, "\\f"...)
case '\n':
if == '`' {
= append(, '\n')
} else {
= append(, "\\n"...)
}
case '\r':
= append(, "\\r"...)
case '\v':
= append(, "\\v"...)
case '\\':
= append(, "\\\\"...)
case '\'':
if == '\'' {
= append(, '\\')
}
= append(, '\'')
case '"':
if == '"' {
= append(, '\\')
}
= append(, '"')
case '`':
if == '`' {
= append(, '\\')
}
= append(, '`')
case '$':
if == '`' && < && [] == '{' {
= append(, '\\')
}
= append(, '$')
case '\u2028':
= append(, "\\u2028"...)
case '\u2029':
= append(, "\\u2029"...)
case '\uFEFF':
= append(, "\\uFEFF"...)
default:
if < {
:= []
if >= firstLowSurrogate && <= lastLowSurrogate {
:= (rune() << 10) + rune() + (0x10000 - (firstHighSurrogate << 10) - firstLowSurrogate)
++
if .options.ASCIIOnly {
if !.options.UnsupportedFeatures.Has(compat.UnicodeEscapes) {
= append(, fmt.Sprintf("\\u{%X}", )...)
} else {
= append(,
'\\', 'u', hexChars[>>12], hexChars[(>>8)&15], hexChars[(>>4)&15], hexChars[&15],
'\\', 'u', hexChars[>>12], hexChars[(>>8)&15], hexChars[(>>4)&15], hexChars[&15],
)
}
continue
}
:= utf8.EncodeRune(, )
= append(, [:]...)
continue
}
}
case ( >= firstLowSurrogate && <= lastLowSurrogate) || (.options.ASCIIOnly && > 0xFF):
= append(, '\\', 'u', hexChars[>>12], hexChars[(>>8)&15], hexChars[(>>4)&15], hexChars[&15])
default:
:= utf8.EncodeRune(, rune())
= append(, [:]...)
}
}
}
.js =
}
type printer struct {
symbols js_ast.SymbolMap
renamer renamer.Renamer
importRecords []ast.ImportRecord
options Options
extractedComments map[string]bool
needsSemicolon bool
js []byte
stmtStart int
exportDefaultStart int
arrowExprStart int
forOfInitStart int
prevOp js_ast.OpCode
prevOpEnd int
prevNumEnd int
prevRegExpEnd int
callTarget js_ast.E
intToBytesBuffer [64]byte
byteOffsetToFirstNonASCII int32
columnsForNonASCII []int32
}
func ( *printer) ( string) {
.js = append(.js, ...)
}
:= .lineOffsetTables
:= len()
:= 0
for > 0 {
:= / 2
:= +
if [].byteOffsetToStartOfLine <= .Start {
= + 1
= - - 1
} else {
=
}
}
--
:= &[]
:= int(.Start - .byteOffsetToStartOfLine)
if .columnsForNonASCII != nil && >= int(.byteOffsetToFirstNonASCII) {
= int(.columnsForNonASCII[-int(.byteOffsetToFirstNonASCII)])
}
.updateGeneratedLineAndColumn()
if .coverLinesWithoutMappings && !.lineStartsWithMapping && .generatedColumn > 0 && .hasPrevState {
.appendMappingWithoutRemapping(SourceMapState{
GeneratedLine: .prevState.GeneratedLine,
GeneratedColumn: 0,
SourceIndex: .prevState.SourceIndex,
OriginalLine: .prevState.OriginalLine,
OriginalColumn: .prevState.OriginalColumn,
})
}
.appendMapping(SourceMapState{
GeneratedLine: .prevState.GeneratedLine,
GeneratedColumn: .generatedColumn,
OriginalLine: ,
OriginalColumn: ,
})
func ( *printer) () {
for , := range string(.js[.lastGeneratedUpdate:]) {
switch {
if == '\r' {
:= .lastGeneratedUpdate + + 1
if < len(.js) && .js[] == '\n' {
continue
}
}
if .coverLinesWithoutMappings && !.lineStartsWithMapping && .hasPrevState {
.appendMappingWithoutRemapping(SourceMapState{
GeneratedLine: .prevState.GeneratedLine,
GeneratedColumn: 0,
SourceIndex: .prevState.SourceIndex,
OriginalLine: .prevState.OriginalLine,
OriginalColumn: .prevState.OriginalColumn,
})
}
.prevState.GeneratedLine++
.prevState.GeneratedColumn = 0
.generatedColumn = 0
.sourceMap = append(.sourceMap, ';')
if <= 0xFFFF {
.generatedColumn++
} else {
.generatedColumn += 2
}
}
}
.lastGeneratedUpdate = len(.js)
}
func ( string, int32) []LineOffsetTable {
var []int32
:= int32(0)
:= 0
:= 0
:= int32(0)
:= make([]LineOffsetTable, 0, )
if == 0 {
=
}
if == '\r' {
if +1 < len() && [+1] == '\n' {
++
continue
}
}
= append(, LineOffsetTable{
byteOffsetToStartOfLine: int32(),
byteOffsetToFirstNonASCII: ,
columnsForNonASCII: ,
})
= 0
= 0
= nil
= 0
if <= 0xFFFF {
++
} else {
+= 2
}
}
}
if == 0 {
= len()
}
if != nil {
for := len() - ; <= ; ++ {
= append(, )
}
}
= append(, LineOffsetTable{
byteOffsetToStartOfLine: int32(),
byteOffsetToFirstNonASCII: ,
columnsForNonASCII: ,
})
return
}
if .options.InputSourceMap != nil {
:= .options.InputSourceMap.Find(
int32(.OriginalLine),
int32(.OriginalColumn))
if == nil {
return
}
.SourceIndex = int(.SourceIndex)
.OriginalLine = int(.OriginalLine)
.OriginalColumn = int(.OriginalColumn)
}
.appendMappingWithoutRemapping()
}
func ( *printer) ( SourceMapState) {
var byte
if len(.sourceMap) != 0 {
= .sourceMap[len(.sourceMap)-1]
}
.sourceMap = appendMapping(.sourceMap, , .prevState, )
.prevState =
.hasPrevState = true
}
func ( *printer) () {
if !.options.RemoveWhitespace {
for := 0; < .options.Indent; ++ {
.print(" ")
}
}
}
func ( *printer) ( js_ast.Ref) {
.printSpaceBeforeIdentifier()
.printIdentifier(.renamer.NameForSymbol())
}
func ( string, compat.JSFeature, bool) bool {
return js_lexer.IsIdentifier() && (! ||
!.Has(compat.UnicodeEscapes) ||
!js_lexer.ContainsNonBMPCodePoint())
}
func ( *printer) ( string) bool {
return js_lexer.IsIdentifier() && (!.options.ASCIIOnly ||
!.options.UnsupportedFeatures.Has(compat.UnicodeEscapes) ||
!js_lexer.ContainsNonBMPCodePoint())
}
func ( *printer) ( []uint16) bool {
return js_lexer.IsIdentifierUTF16() && (!.options.ASCIIOnly ||
!.options.UnsupportedFeatures.Has(compat.UnicodeEscapes) ||
!js_lexer.ContainsNonBMPCodePointUTF16())
}
func ( *printer) ( string) {
if .options.ASCIIOnly {
.js = QuoteIdentifier(.js, , .options.UnsupportedFeatures)
} else {
.print()
}
}
func ( *printer) ( []uint16) {
:= make([]byte, utf8.UTFMax)
:= len()
for := 0; < ; ++ {
:= rune([])
if >= firstHighSurrogate && <= lastHighSurrogate && +1 < {
if := rune([+1]); >= firstLowSurrogate && <= lastLowSurrogate {
= ( << 10) + + (0x10000 - (firstHighSurrogate << 10) - firstLowSurrogate)
++
}
}
if .options.ASCIIOnly && > lastASCII {
if <= 0xFFFF {
.js = append(.js, '\\', 'u', hexChars[>>12], hexChars[(>>8)&15], hexChars[(>>4)&15], hexChars[&15])
} else if !.options.UnsupportedFeatures.Has(compat.UnicodeEscapes) {
.js = append(.js, fmt.Sprintf("\\u{%X}", )...)
} else {
panic("Internal error: Cannot encode identifier: Unicode escapes are unsupported")
}
continue
}
:= utf8.EncodeRune(, )
.js = append(.js, [:]...)
}
}
func ( *printer) ( js_ast.Binding) {
.addSourceMapping(.Loc)
switch b := .Data.(type) {
case *js_ast.BMissing:
case *js_ast.BIdentifier:
.printSymbol(.Ref)
case *js_ast.BArray:
.print("[")
if len(.Items) > 0 {
if !.IsSingleLine {
.options.Indent++
}
for , := range .Items {
if != 0 {
.print(",")
if .IsSingleLine {
.printSpace()
}
}
if !.IsSingleLine {
.printNewline()
.printIndent()
}
if .HasSpread && +1 == len(.Items) {
.print("...")
}
.(.Binding)
if .DefaultValue != nil {
.printSpace()
.print("=")
.printSpace()
.printExpr(*.DefaultValue, js_ast.LComma, 0)
}
if , := .Binding.Data.(*js_ast.BMissing); && == len(.Items)-1 {
.print(",")
}
}
if !.IsSingleLine {
.options.Indent--
.printNewline()
.printIndent()
}
}
.print("]")
case *js_ast.BObject:
.print("{")
if len(.Properties) > 0 {
if !.IsSingleLine {
.options.Indent++
}
for , := range .Properties {
if != 0 {
.print(",")
if .IsSingleLine {
.printSpace()
}
}
if !.IsSingleLine {
.printNewline()
.printIndent()
}
if .IsSpread {
.print("...")
} else {
if .IsComputed {
.print("[")
.printExpr(.Key, js_ast.LComma, 0)
.print("]:")
.printSpace()
.(.Value)
if .DefaultValue != nil {
.printSpace()
.print("=")
.printSpace()
.printExpr(*.DefaultValue, js_ast.LComma, 0)
}
continue
}
if , := .Key.Data.(*js_ast.EString); {
if .canPrintIdentifierUTF16(.Value) {
.addSourceMapping(.Key.Loc)
.printSpaceBeforeIdentifier()
.printIdentifierUTF16(.Value)
if , := .Value.Data.(*js_ast.BIdentifier); && js_lexer.UTF16EqualsString(.Value, .renamer.NameForSymbol(.Ref)) {
if .DefaultValue != nil {
.printSpace()
.print("=")
.printSpace()
.printExpr(*.DefaultValue, js_ast.LComma, 0)
}
continue
}
} else {
.printExpr(.Key, js_ast.LLowest, 0)
}
} else {
.printExpr(.Key, js_ast.LLowest, 0)
}
.print(":")
.printSpace()
}
.(.Value)
if .DefaultValue != nil {
.printSpace()
.print("=")
.printSpace()
.printExpr(*.DefaultValue, js_ast.LComma, 0)
}
}
if !.IsSingleLine {
.options.Indent--
.printNewline()
.printIndent()
}
}
.print("}")
default:
panic(fmt.Sprintf("Unexpected binding of type %T", .Data))
}
}
func ( *printer) () {
if !.options.RemoveWhitespace {
.print(" ")
}
}
func ( *printer) () {
if !.options.RemoveWhitespace {
.print("\n")
}
}
func ( *printer) ( js_ast.OpCode) {
if .prevOpEnd == len(.js) {
:= .prevOp
if (( == js_ast.BinOpAdd || == js_ast.UnOpPos) && ( == js_ast.BinOpAdd || == js_ast.UnOpPos || == js_ast.UnOpPreInc)) ||
(( == js_ast.BinOpSub || == js_ast.UnOpNeg) && ( == js_ast.BinOpSub || == js_ast.UnOpNeg || == js_ast.UnOpPreDec)) ||
( == js_ast.UnOpPostDec && == js_ast.BinOpGt) ||
( == js_ast.UnOpNot && == js_ast.UnOpPreDec && len(.js) > 1 && .js[len(.js)-2] == '<') {
.print(" ")
}
}
}
func ( *printer) () {
if !.options.RemoveWhitespace {
.print(";\n")
} else {
.needsSemicolon = true
}
}
func ( *printer) () {
if .needsSemicolon {
.print(";")
.needsSemicolon = false
}
}
func ( *printer) () {
:= .js
:= len()
if > 0 && (js_lexer.IsIdentifierContinue(rune([-1])) || == .prevRegExpEnd) {
.print(" ")
}
}
func ( *printer) ( []js_ast.Arg, bool, bool) {
:= true
if .options.RemoveWhitespace && ! && && len() == 1 {
if , := [0].Binding.Data.(*js_ast.BIdentifier); && [0].Default == nil {
= false
}
}
if {
.print("(")
}
for , := range {
if != 0 {
.print(",")
.printSpace()
}
if && +1 == len() {
.print("...")
}
.printBinding(.Binding)
if .Default != nil {
.printSpace()
.print("=")
.printSpace()
.printExpr(*.Default, js_ast.LComma, 0)
}
}
if {
.print(")")
}
}
func ( *printer) ( js_ast.Fn) {
.printFnArgs(.Args, .HasRestArg, false /* isArrow */)
.printSpace()
.printBlock(.Body.Loc, .Body.Stmts)
}
func ( *printer) ( js_ast.Class) {
if .Extends != nil {
.print(" extends")
.printSpace()
.printExpr(*.Extends, js_ast.LNew-1, 0)
}
.printSpace()
.addSourceMapping(.BodyLoc)
.print("{")
.printNewline()
.options.Indent++
for , := range .Properties {
.printSemicolonIfNeeded()
.printIndent()
.printProperty()
if .Value == nil {
.printSemicolonAfterStatement()
} else {
.printNewline()
}
}
.needsSemicolon = false
.options.Indent--
.printIndent()
.print("}")
}
func ( *printer) ( js_ast.Property) {
if .Kind == js_ast.PropertySpread {
.print("...")
.printExpr(*.Value, js_ast.LComma, 0)
return
}
if .IsStatic {
.print("static")
.printSpace()
}
switch .Kind {
case js_ast.PropertyGet:
.printSpaceBeforeIdentifier()
.print("get")
.printSpace()
case js_ast.PropertySet:
.printSpaceBeforeIdentifier()
.print("set")
.printSpace()
}
if .Value != nil {
if , := .Value.Data.(*js_ast.EFunction); .IsMethod && {
if .Fn.IsAsync {
.printSpaceBeforeIdentifier()
.print("async")
.printSpace()
}
if .Fn.IsGenerator {
.print("*")
}
}
}
if .IsComputed {
.print("[")
.printExpr(.Key, js_ast.LComma, 0)
.print("]")
if .Value != nil {
if , := .Value.Data.(*js_ast.EFunction); .IsMethod && {
.printFn(.Fn)
return
}
.print(":")
.printSpace()
.printExpr(*.Value, js_ast.LComma, 0)
}
if .Initializer != nil {
.printSpace()
.print("=")
.printSpace()
.printExpr(*.Initializer, js_ast.LComma, 0)
}
return
}
switch key := .Key.Data.(type) {
case *js_ast.EPrivateIdentifier:
.printSymbol(.Ref)
case *js_ast.EString:
.addSourceMapping(.Key.Loc)
if .canPrintIdentifierUTF16(.Value) {
.printSpaceBeforeIdentifier()
.printIdentifierUTF16(.Value)
if !.options.UnsupportedFeatures.Has(compat.ObjectExtensions) && .Value != nil {
switch e := .Value.Data.(type) {
case *js_ast.EIdentifier:
if js_lexer.UTF16EqualsString(.Value, .renamer.NameForSymbol(.Ref)) {
if .Initializer != nil {
.printSpace()
.print("=")
.printSpace()
.printExpr(*.Initializer, js_ast.LComma, 0)
}
return
}
:= js_ast.FollowSymbols(.symbols, .Ref)
:= .symbols.Get()
if .NamespaceAlias == nil && js_lexer.UTF16EqualsString(.Value, .renamer.NameForSymbol(.Ref)) {
if .Initializer != nil {
.printSpace()
.print("=")
.printSpace()
.printExpr(*.Initializer, js_ast.LComma, 0)
}
return
}
}
}
} else {
:= .bestQuoteCharForString(.Value, false /* allowBacktick */)
.print()
.printQuotedUTF16(.Value, rune([0]))
.print()
}
default:
.printExpr(.Key, js_ast.LLowest, 0)
}
if .Kind != js_ast.PropertyNormal {
, := .Value.Data.(*js_ast.EFunction)
if {
.printFn(.Fn)
return
}
}
if .Value != nil {
if , := .Value.Data.(*js_ast.EFunction); .IsMethod && {
.printFn(.Fn)
return
}
.print(":")
.printSpace()
.printExpr(*.Value, js_ast.LComma, 0)
}
if .Initializer != nil {
.printSpace()
.print("=")
.printSpace()
.printExpr(*.Initializer, js_ast.LComma, 0)
}
}
func ( *printer) ( []uint16, bool) string {
if .options.UnsupportedFeatures.Has(compat.TemplateLiteral) {
= false
}
:= 0
:= 0
:= 0
for , := range {
switch {
case '\n':
--
}
case '\'':
++
case '"':
++
case '`':
++
if +1 < len() && [+1] == '{' {
++
}
}
}
:= "\""
if > {
= "'"
if > && {
= "`"
}
} else if > && {
= "`"
}
return
}
type requireCallArgs struct {
isES6Import bool
mustReturnPromise bool
}
func ( *printer) ( uint32, []js_ast.Comment) {
:= &.importRecords[]
.printSpaceBeforeIdentifier()
if !.SourceIndex.IsValid() && .Kind == ast.ImportDynamic && .options.OutputFormat.KeepES6ImportExportSyntax() {
.print("import(")
if len() > 0 {
.printNewline()
.options.Indent++
for , := range {
.printIndentedComment(.Text)
}
.printIndent()
}
.printQuotedUTF8(.Path.Text, true /* allowBacktick */)
if len() > 0 {
.printNewline()
.options.Indent--
.printIndent()
}
.print(")")
return
}
if .Kind == ast.ImportDynamic {
if .options.UnsupportedFeatures.Has(compat.Arrow) {
.print("Promise.resolve().then(function()")
.printSpace()
.print("{")
.printNewline()
.options.Indent++
.printIndent()
.print("return ")
} else {
if .options.RemoveWhitespace {
.print("Promise.resolve().then(()=>")
} else {
.print("Promise.resolve().then(() => ")
}
}
}
if .WrapWithToModule {
.printSymbol(.options.ToModuleRef)
.print("(")
}
if .SourceIndex.IsValid() {
.printSymbol(.options.WrapperRefForSource(.SourceIndex.GetIndex()))
.print("()")
} else {
.print("require(")
.printQuotedUTF8(.Path.Text, true /* allowBacktick */)
.print(")")
}
if .WrapWithToModule {
.print(")")
}
if .Kind == ast.ImportDynamic {
if .options.UnsupportedFeatures.Has(compat.Arrow) {
if !.options.RemoveWhitespace {
.print(";")
}
.printNewline()
.options.Indent--
.printIndent()
.print("})")
} else {
.print(")")
}
}
}
const (
forbidCall = 1 << iota
forbidIn
hasNonOptionalChainParent
)
func ( *printer) ( js_ast.L) {
if >= js_ast.LPrefix {
.print("(void 0)")
} else {
.printSpaceBeforeIdentifier()
.print("void 0")
.prevNumEnd = len(.js)
}
}
func ( *printer) ( js_ast.Expr, js_ast.L, int) {
.addSourceMapping(.Loc)
switch e := .Data.(type) {
case *js_ast.EMissing:
case *js_ast.EUndefined:
.printUndefined()
case *js_ast.ESuper:
.printSpaceBeforeIdentifier()
.print("super")
case *js_ast.ENull:
.printSpaceBeforeIdentifier()
.print("null")
case *js_ast.EThis:
.printSpaceBeforeIdentifier()
.print("this")
case *js_ast.ESpread:
.print("...")
.(.Value, js_ast.LComma, 0)
case *js_ast.ENewTarget:
.printSpaceBeforeIdentifier()
.print("new.target")
case *js_ast.EImportMeta:
.printSpaceBeforeIdentifier()
.print("import.meta")
case *js_ast.ENew:
:= >= js_ast.LCall
:= !.options.RemoveWhitespace && .CanBeUnwrappedIfUnused
if && >= js_ast.LPostfix {
= true
}
if {
.print("(")
}
if {
.print("/* @__PURE__ */ ")
}
.printSpaceBeforeIdentifier()
.print("new")
.printSpace()
.(.Target, js_ast.LNew, forbidCall)
if !.options.RemoveWhitespace || len(.Args) > 0 || >= js_ast.LPostfix {
.print("(")
for , := range .Args {
if != 0 {
.print(",")
.printSpace()
}
.(, js_ast.LComma, 0)
}
.print(")")
}
if {
.print(")")
}
case *js_ast.ECall:
:= >= js_ast.LNew || (&forbidCall) != 0
:= 0
if .OptionalChain == js_ast.OptionalChainNone {
= hasNonOptionalChainParent
} else if ( & hasNonOptionalChainParent) != 0 {
= true
}
:= !.options.RemoveWhitespace && .CanBeUnwrappedIfUnused
if && >= js_ast.LPostfix {
= true
}
if {
.print("(")
}
if {
:= .stmtStart == len(.js)
.print("/* @__PURE__ */ ")
if {
.stmtStart = len(.js)
}
}
.callTarget = .Target.Data
if !.IsDirectEval && .isUnboundEvalIdentifier(.Target) {
if .options.RemoveWhitespace {
.print("(0,")
} else {
.print("(0, ")
}
.(.Target, js_ast.LPostfix, 0)
.print(")")
} else {
.(.Target, js_ast.LPostfix, )
}
if .OptionalChain == js_ast.OptionalChainStart {
.print("?.")
}
.print("(")
for , := range .Args {
if != 0 {
.print(",")
.printSpace()
}
.(, js_ast.LComma, 0)
}
.print(")")
if {
.print(")")
}
case *js_ast.ERequire:
:= >= js_ast.LNew || (&forbidCall) != 0
if {
.print("(")
}
.printRequireOrImportExpr(.ImportRecordIndex, nil)
if {
.print(")")
}
case *js_ast.ERequireResolve:
:= >= js_ast.LNew || (&forbidCall) != 0
if {
.print("(")
}
.printSpaceBeforeIdentifier()
.print("require.resolve(")
.printQuotedUTF8(.importRecords[.ImportRecordIndex].Path.Text, true /* allowBacktick */)
.print(")")
if {
.print(")")
}
case *js_ast.EImport:
:= >= js_ast.LNew || (&forbidCall) != 0
if {
.print("(")
}
var []js_ast.Comment
if !.options.RemoveWhitespace {
= .LeadingInteriorComments
}
if .ImportRecordIndex.IsValid() {
.printRequireOrImportExpr(.ImportRecordIndex.GetIndex(), )
.printSpaceBeforeIdentifier()
.print("import(")
if len() > 0 {
.printNewline()
.options.Indent++
for , := range .LeadingInteriorComments {
.printIndentedComment(.Text)
}
.printIndent()
}
.(.Expr, js_ast.LComma, 0)
if len() > 0 {
.printNewline()
.options.Indent--
.printIndent()
}
.print(")")
}
if {
.print(")")
}
case *js_ast.EDot:
:= false
if .OptionalChain == js_ast.OptionalChainNone {
|= hasNonOptionalChainParent
} else {
if ( & hasNonOptionalChainParent) != 0 {
= true
.print("(")
}
&= ^hasNonOptionalChainParent
}
.(.Target, js_ast.LPostfix, )
if .OptionalChain == js_ast.OptionalChainStart {
.print("?")
}
if .canPrintIdentifier(.Name) {
.print(" ")
}
.print(".")
.addSourceMapping(.NameLoc)
.printIdentifier(.Name)
} else {
.print("[")
.addSourceMapping(.NameLoc)
.printQuotedUTF8(.Name, true /* allowBacktick */)
.print("]")
}
if {
.print(")")
}
case *js_ast.EIndex:
:= false
if .OptionalChain == js_ast.OptionalChainNone {
|= hasNonOptionalChainParent
} else {
if ( & hasNonOptionalChainParent) != 0 {
= true
.print("(")
}
&= ^hasNonOptionalChainParent
}
.(.Target, js_ast.LPostfix, )
if .OptionalChain == js_ast.OptionalChainStart {
.print("?.")
}
if , := .Index.Data.(*js_ast.EPrivateIdentifier); {
if .OptionalChain != js_ast.OptionalChainStart {
.print(".")
}
.printSymbol(.Ref)
} else {
.print("[")
.(.Index, js_ast.LLowest, 0)
.print("]")
}
if {
.print(")")
}
case *js_ast.EIf:
:= >= js_ast.LConditional
if {
.print("(")
&= ^forbidIn
}
.(.Test, js_ast.LConditional, &forbidIn)
.printSpace()
.print("?")
.printSpace()
.(.Yes, js_ast.LYield, 0)
.printSpace()
.print(":")
.printSpace()
.(.No, js_ast.LYield, &forbidIn)
if {
.print(")")
}
case *js_ast.EArrow:
:= >= js_ast.LAssign
if {
.print("(")
}
if .IsAsync {
.printSpaceBeforeIdentifier()
.print("async")
.printSpace()
}
.printFnArgs(.Args, .HasRestArg, true /* isArrow */)
.printSpace()
.print("=>")
.printSpace()
:= false
if len(.Body.Stmts) == 1 && .PreferExpr {
if , := .Body.Stmts[0].Data.(*js_ast.SReturn); && .Value != nil {
.arrowExprStart = len(.js)
.(*.Value, js_ast.LComma, 0)
= true
}
}
if ! {
.printBlock(.Body.Loc, .Body.Stmts)
}
if {
.print(")")
}
case *js_ast.EFunction:
:= len(.js)
:= .stmtStart == || .exportDefaultStart ==
if {
.print("(")
}
.printSpaceBeforeIdentifier()
if .Fn.IsAsync {
.print("async ")
}
.print("function")
if .Fn.IsGenerator {
.print("*")
.printSpace()
}
if .Fn.Name != nil {
.printSymbol(.Fn.Name.Ref)
}
.printFn(.Fn)
if {
.print(")")
}
case *js_ast.EClass:
:= len(.js)
:= .stmtStart == || .exportDefaultStart ==
if {
.print("(")
}
.printSpaceBeforeIdentifier()
.print("class")
if .Class.Name != nil {
.printSymbol(.Class.Name.Ref)
}
.printClass(.Class)
if {
.print(")")
}
case *js_ast.EArray:
.print("[")
if len(.Items) > 0 {
if !.IsSingleLine {
.options.Indent++
}
for , := range .Items {
if != 0 {
.print(",")
if .IsSingleLine {
.printSpace()
}
}
if !.IsSingleLine {
.printNewline()
.printIndent()
}
.(, js_ast.LComma, 0)
, := .Data.(*js_ast.EMissing)
if && == len(.Items)-1 {
.print(",")
}
}
if !.IsSingleLine {
.options.Indent--
.printNewline()
.printIndent()
}
}
.print("]")
case *js_ast.EObject:
:= len(.js)
:= .stmtStart == || .arrowExprStart ==
if {
.print("(")
}
.print("{")
if len(.Properties) != 0 {
if !.IsSingleLine {
.options.Indent++
}
for , := range .Properties {
if != 0 {
.print(",")
if .IsSingleLine {
.printSpace()
}
}
if !.IsSingleLine {
.printNewline()
.printIndent()
}
.printProperty()
}
if !.IsSingleLine {
.options.Indent--
.printNewline()
.printIndent()
}
}
.print("}")
if {
.print(")")
}
case *js_ast.EBoolean:
if .options.MangleSyntax {
if >= js_ast.LPrefix {
if .Value {
.print("(!0)")
} else {
.print("(!1)")
}
} else {
if .Value {
.print("!0")
} else {
.print("!1")
}
}
} else {
.printSpaceBeforeIdentifier()
if .Value {
.print("true")
} else {
.print("false")
}
}
if .PreferTemplate && !.options.MangleSyntax && !.options.UnsupportedFeatures.Has(compat.TemplateLiteral) {
.print("`")
.printQuotedUTF16(.Value, '`')
.print("`")
return
}
:= .bestQuoteCharForString(.Value, true /* allowBacktick */)
.print()
.printQuotedUTF16(.Value, rune([0]))
.print()
if .options.MangleSyntax && .Tag == nil && len(.Parts) == 0 {
:= .bestQuoteCharForString(.Head, true /* allowBacktick */)
.print()
.printQuotedUTF16(.Head, rune([0]))
.print()
return
}
if js_ast.IsOptionalChain(*.Tag) {
.print("(")
.(*.Tag, js_ast.LLowest, 0)
.print(")")
} else {
.(*.Tag, js_ast.LPostfix, 0)
}
}
.print("`")
if .Tag != nil {
.print(.HeadRaw)
} else {
.printQuotedUTF16(.Head, '`')
}
for , := range .Parts {
.print("${")
.(.Value, js_ast.LLowest, 0)
.print("}")
if .Tag != nil {
.print(.TailRaw)
} else {
.printQuotedUTF16(.Tail, '`')
}
}
.print("`")
case *js_ast.ERegExp:
:= .js
:= len()
.prevRegExpEnd = len(.js)
case *js_ast.EBigInt:
.printSpaceBeforeIdentifier()
.print(.Value)
.print("n")
case *js_ast.ENumber:
:= .Value
:= math.Abs()
if != {
.printSpaceBeforeIdentifier()
.print("NaN")
} else if == positiveInfinity {
.printSpaceBeforeIdentifier()
.print("Infinity")
} else if == negativeInfinity {
if >= js_ast.LPrefix {
.print("(-Infinity)")
} else {
.printSpaceBeforeOperator(js_ast.UnOpNeg)
.print("-Infinity")
}
} else {
if !math.Signbit() {
.printSpaceBeforeIdentifier()
.printNonNegativeFloat()
.prevNumEnd = len(.js)
.print("(-")
.printNonNegativeFloat()
.print(")")
} else {
.printSpaceBeforeOperator(js_ast.UnOpNeg)
.print("-")
.printNonNegativeFloat()
.prevNumEnd = len(.js)
}
}
case *js_ast.EIdentifier:
:= .renamer.NameForSymbol(.Ref)
:= len(.js) == .forOfInitStart && == "let"
if {
.print("(")
}
.printSpaceBeforeIdentifier()
.printIdentifier()
if {
.print(")")
}
:= js_ast.FollowSymbols(.symbols, .Ref)
:= .symbols.Get()
if .ImportItemStatus == js_ast.ImportItemMissing {
.printUndefined()
} else if .NamespaceAlias != nil {
:= .callTarget == && .WasOriginallyIdentifier
if {
if .options.RemoveWhitespace {
.print("(0,")
} else {
.print("(0, ")
}
}
.printSymbol(.NamespaceAlias.NamespaceRef)
:= .NamespaceAlias.Alias
if .canPrintIdentifier() {
.print(".")
.printIdentifier()
} else {
.print("[")
.printQuotedUTF8(, true /* allowBacktick */)
.print("]")
}
if {
.print(")")
}
} else {
.printSymbol(.Ref)
}
case *js_ast.EAwait:
:= >= js_ast.LPrefix
if {
.print("(")
}
.printSpaceBeforeIdentifier()
.print("await")
.printSpace()
.(.Value, js_ast.LPrefix-1, 0)
if {
.print(")")
}
case *js_ast.EYield:
:= >= js_ast.LAssign
if {
.print("(")
}
.printSpaceBeforeIdentifier()
.print("yield")
if .Value != nil {
if .IsStar {
.print("*")
}
.printSpace()
.(*.Value, js_ast.LYield, 0)
}
if {
.print(")")
}
case *js_ast.EUnary:
:= js_ast.OpTable[.Op]
:= >= .Level
if {
.print("(")
}
if !.Op.IsPrefix() {
.(.Value, js_ast.LPostfix-1, 0)
}
if .IsKeyword {
.printSpaceBeforeIdentifier()
.print(.Text)
.printSpace()
} else {
.printSpaceBeforeOperator(.Op)
.print(.Text)
.prevOp = .Op
.prevOpEnd = len(.js)
}
if .Op.IsPrefix() {
.(.Value, js_ast.LPrefix-1, 0)
}
if {
.print(")")
}
case *js_ast.EBinary:
:= js_ast.OpTable[.Op]
:= >= .Level || (.Op == js_ast.BinOpIn && (&forbidIn) != 0)
if , := .Left.Data.(*js_ast.EBoolean); {
= js_ast.LCall
}
}
}
.(.Left, , &forbidIn)
if .Op != js_ast.BinOpComma {
.printSpace()
}
if .IsKeyword {
.printSpaceBeforeIdentifier()
.print(.Text)
} else {
.printSpaceBeforeOperator(.Op)
.print(.Text)
.prevOp = .Op
.prevOpEnd = len(.js)
}
.printSpace()
.(.Right, , &forbidIn)
if {
.print(")")
}
default:
panic(fmt.Sprintf("Unexpected expression of type %T", .Data))
}
}
func ( *printer) ( js_ast.Expr) bool {
:= .symbols.Get(js_ast.FollowSymbols(.symbols, .Ref))
return .Kind == js_ast.SymbolUnbound && .OriginalName == "eval"
}
return false
}
= -
}
:= .intToBytesBuffer[:]
:= len()
for {
--
[] = '0' + byte(%10)
/= 10
if == 0 {
break
}
}
:= 0
for , := range {
= *10 + int(-'0')
}
if {
return -
}
return
}
if < 1000 {
if := int64(); == float64() {
.printBytes(.smallIntToBytes(int()))
return
}
}
:= []byte(strconv.FormatFloat(, 'g', -1, 64))
if := bytes.LastIndexByte(, 'e'); != -1 {
:= + 1
:=
switch [] {
++
++
++
}
:= 2
if .options.RemoveWhitespace {
= [1:]
--
}
if [] == '0' {
:= + 1
for [] == '0' {
++
}
:= [:]
:= .smallIntToBytes( - - len())
if := bytes.LastIndexByte(, 'e'); != -1 {
:= [:]
:= [+1 : ]
:= parseSmallInt([+1:]) - len()
:= len() - 1
for > 0 && [-1] == '0' {
--
}
:= [:]
:= .smallIntToBytes(len() - )
if len() > len()+1+len() {
= append(append(, 'e'), ...)
}
}
.printBytes()
}
func ( *printer) ( bool, string, []js_ast.Decl) {
.printIndent()
.printSpaceBeforeIdentifier()
if {
.print("export ")
}
.printDecls(, , 0)
.printSemicolonAfterStatement()
}
func ( *printer) ( js_ast.Stmt) {
switch s := .Data.(type) {
case *js_ast.SExpr:
.printExpr(.Value, js_ast.LLowest, forbidIn)
case *js_ast.SLocal:
switch .Kind {
case js_ast.LocalVar:
.printDecls("var", .Decls, forbidIn)
case js_ast.LocalLet:
.printDecls("let", .Decls, forbidIn)
case js_ast.LocalConst:
.printDecls("const", .Decls, forbidIn)
}
default:
panic("Internal error")
}
}
func ( *printer) ( string, []js_ast.Decl, int) {
.print()
.printSpace()
for , := range {
if != 0 {
.print(",")
.printSpace()
}
.printBinding(.Binding)
if .Value != nil {
.printSpace()
.print("=")
.printSpace()
.printExpr(*.Value, js_ast.LComma, )
}
}
}
func ( *printer) ( js_ast.Stmt) {
if , := .Data.(*js_ast.SBlock); {
.printSpace()
.printBlock(.Loc, .Stmts)
.printNewline()
} else {
.printNewline()
.options.Indent++
.printStmt()
.options.Indent--
}
}
func ( *printer) ( logger.Loc, []js_ast.Stmt) {
.addSourceMapping()
.print("{")
.printNewline()
.options.Indent++
for , := range {
.printSemicolonIfNeeded()
.printStmt()
}
.options.Indent--
.needsSemicolon = false
.printIndent()
.print("}")
}
func ( js_ast.S) bool {
for {
switch current := .(type) {
case *js_ast.SIf:
if .No == nil {
return true
}
= .No.Data
case *js_ast.SFor:
= .Body.Data
case *js_ast.SForIn:
= .Body.Data
case *js_ast.SForOf:
= .Body.Data
case *js_ast.SWhile:
= .Body.Data
case *js_ast.SWith:
= .Body.Data
default:
return false
}
}
}
func ( *printer) ( *js_ast.SIf) {
.printSpaceBeforeIdentifier()
.print("if")
.printSpace()
.print("(")
.printExpr(.Test, js_ast.LLowest, 0)
.print(")")
if , := .Yes.Data.(*js_ast.SBlock); {
.printSpace()
.printBlock(.Yes.Loc, .Stmts)
if .No != nil {
.printSpace()
} else {
.printNewline()
}
} else if wrapToAvoidAmbiguousElse(.Yes.Data) {
.printSpace()
.print("{")
.printNewline()
.options.Indent++
.printStmt(.Yes)
.options.Indent--
.needsSemicolon = false
.printIndent()
.print("}")
if .No != nil {
.printSpace()
} else {
.printNewline()
}
} else {
.printNewline()
.options.Indent++
.printStmt(.Yes)
.options.Indent--
if .No != nil {
.printIndent()
}
}
if .No != nil {
.printSemicolonIfNeeded()
.printSpaceBeforeIdentifier()
.print("else")
if , := .No.Data.(*js_ast.SBlock); {
.printSpace()
.printBlock(.No.Loc, .Stmts)
.printNewline()
} else if , := .No.Data.(*js_ast.SIf); {
.()
} else {
.printNewline()
.options.Indent++
.printStmt(*.No)
.options.Indent--
}
}
}
func ( *printer) ( string) {
for {
:= strings.IndexByte(, '\n')
if == -1 {
break
}
.printIndent()
.print([:+1])
= [+1:]
}
.printIndent()
.print()
.printNewline()
.printIndent()
.print()
.print("\n")
}
}
func ( *printer) ( js_ast.Stmt) {
.addSourceMapping(.Loc)
switch s := .Data.(type) {
case *js_ast.SComment:
:= .Text
if .options.ExtractComments {
if .extractedComments == nil {
.extractedComments = make(map[string]bool)
}
.extractedComments[] = true
break
}
.printIndentedComment()
case *js_ast.SFunction:
.printIndent()
.printSpaceBeforeIdentifier()
if .IsExport {
.print("export ")
}
if .Fn.IsAsync {
.print("async ")
}
.print("function")
if .Fn.IsGenerator {
.print("*")
.printSpace()
}
.printSymbol(.Fn.Name.Ref)
.printFn(.Fn)
.printNewline()
case *js_ast.SClass:
.printIndent()
.printSpaceBeforeIdentifier()
if .IsExport {
.print("export ")
}
.print("class")
.printSymbol(.Class.Name.Ref)
.printClass(.Class)
.printNewline()
case *js_ast.SEmpty:
.printIndent()
.print(";")
.printNewline()
case *js_ast.SExportDefault:
.printIndent()
.printSpaceBeforeIdentifier()
.print("export default")
.printSpace()
.exportDefaultStart = len(.js)
.printExpr(*.Value.Expr, js_ast.LComma, 0)
.printSemicolonAfterStatement()
return
}
switch s2 := .Value.Stmt.Data.(type) {
case *js_ast.SFunction:
.printSpaceBeforeIdentifier()
if .Fn.IsAsync {
.print("async ")
}
.print("function")
if .Fn.IsGenerator {
.print("*")
.printSpace()
}
if .Fn.Name != nil {
.printSymbol(.Fn.Name.Ref)
}
.printFn(.Fn)
.printNewline()
case *js_ast.SClass:
.printSpaceBeforeIdentifier()
.print("class")
if .Class.Name != nil {
.printSymbol(.Class.Name.Ref)
}
.printClass(.Class)
.printNewline()
default:
panic("Internal error")
}
case *js_ast.SExportStar:
.printIndent()
.printSpaceBeforeIdentifier()
.print("export")
.printSpace()
.print("*")
.printSpace()
if .Alias != nil {
.print("as")
.printSpace()
.printSpaceBeforeIdentifier()
.printIdentifier(.Alias.OriginalName)
.printSpace()
.printSpaceBeforeIdentifier()
}
.print("from")
.printSpace()
.printQuotedUTF8(.importRecords[.ImportRecordIndex].Path.Text, false /* allowBacktick */)
.printSemicolonAfterStatement()
case *js_ast.SExportClause:
.printIndent()
.printSpaceBeforeIdentifier()
.print("export")
.printSpace()
.print("{")
if !.IsSingleLine {
.options.Indent++
}
for , := range .Items {
if != 0 {
.print(",")
if .IsSingleLine {
.printSpace()
}
}
if !.IsSingleLine {
.printNewline()
.printIndent()
}
:= .renamer.NameForSymbol(.Name.Ref)
.printIdentifier()
if != .Alias {
.print(" as ")
.printIdentifier(.Alias)
}
}
if !.IsSingleLine {
.options.Indent--
.printNewline()
.printIndent()
}
.print("}")
.printSemicolonAfterStatement()
case *js_ast.SExportFrom:
.printIndent()
.printSpaceBeforeIdentifier()
.print("export")
.printSpace()
.print("{")
if !.IsSingleLine {
.options.Indent++
}
for , := range .Items {
if != 0 {
.print(",")
if .IsSingleLine {
.printSpace()
}
}
if !.IsSingleLine {
.printNewline()
.printIndent()
}
.printIdentifier(.OriginalName)
if .OriginalName != .Alias {
.print(" as ")
.printIdentifier(.Alias)
}
}
if !.IsSingleLine {
.options.Indent--
.printNewline()
.printIndent()
}
.print("}")
.printSpace()
.print("from")
.printSpace()
.printQuotedUTF8(.importRecords[.ImportRecordIndex].Path.Text, false /* allowBacktick */)
.printSemicolonAfterStatement()
case *js_ast.SLocal:
switch .Kind {
case js_ast.LocalConst:
.printDeclStmt(.IsExport, "const", .Decls)
case js_ast.LocalLet:
.printDeclStmt(.IsExport, "let", .Decls)
case js_ast.LocalVar:
.printDeclStmt(.IsExport, "var", .Decls)
}
case *js_ast.SIf:
.printIndent()
.printIf()
case *js_ast.SDoWhile:
.printIndent()
.printSpaceBeforeIdentifier()
.print("do")
if , := .Body.Data.(*js_ast.SBlock); {
.printSpace()
.printBlock(.Body.Loc, .Stmts)
.printSpace()
} else {
.printNewline()
.options.Indent++
.(.Body)
.printSemicolonIfNeeded()
.options.Indent--
.printIndent()
}
.print("while")
.printSpace()
.print("(")
.printExpr(.Test, js_ast.LLowest, 0)
.print(")")
.printSemicolonAfterStatement()
case *js_ast.SForIn:
.printIndent()
.printSpaceBeforeIdentifier()
.print("for")
.printSpace()
.print("(")
.printForLoopInit(.Init)
.printSpace()
.printSpaceBeforeIdentifier()
.print("in")
.printSpace()
.printExpr(.Value, js_ast.LLowest, 0)
.print(")")
.printBody(.Body)
case *js_ast.SForOf:
.printIndent()
.printSpaceBeforeIdentifier()
.print("for")
if .IsAwait {
.print(" await")
}
.printSpace()
.print("(")
.forOfInitStart = len(.js)
.printForLoopInit(.Init)
.printSpace()
.printSpaceBeforeIdentifier()
.print("of")
.printSpace()
.printExpr(.Value, js_ast.LComma, 0)
.print(")")
.printBody(.Body)
case *js_ast.SWhile:
.printIndent()
.printSpaceBeforeIdentifier()
.print("while")
.printSpace()
.print("(")
.printExpr(.Test, js_ast.LLowest, 0)
.print(")")
.printBody(.Body)
case *js_ast.SWith:
.printIndent()
.printSpaceBeforeIdentifier()
.print("with")
.printSpace()
.print("(")
.printExpr(.Value, js_ast.LLowest, 0)
.print(")")
.printBody(.Body)
case *js_ast.SLabel:
.printIndent()
.printSymbol(.Name.Ref)
.print(":")
.printBody(.Stmt)
case *js_ast.STry:
.printIndent()
.printSpaceBeforeIdentifier()
.print("try")
.printSpace()
.printBlock(.BodyLoc, .Body)
if .Catch != nil {
.printSpace()
.print("catch")
if .Catch.Binding != nil {
.printSpace()
.print("(")
.printBinding(*.Catch.Binding)
.print(")")
}
.printSpace()
.printBlock(.Catch.Loc, .Catch.Body)
}
if .Finally != nil {
.printSpace()
.print("finally")
.printSpace()
.printBlock(.Finally.Loc, .Finally.Stmts)
}
.printNewline()
case *js_ast.SFor:
.printIndent()
.printSpaceBeforeIdentifier()
.print("for")
.printSpace()
.print("(")
if .Init != nil {
.printForLoopInit(*.Init)
}
.print(";")
.printSpace()
if .Test != nil {
.printExpr(*.Test, js_ast.LLowest, 0)
}
.print(";")
.printSpace()
if .Update != nil {
.printExpr(*.Update, js_ast.LLowest, 0)
}
.print(")")
.printBody(.Body)
case *js_ast.SSwitch:
.printIndent()
.printSpaceBeforeIdentifier()
.print("switch")
.printSpace()
.print("(")
.printExpr(.Test, js_ast.LLowest, 0)
.print(")")
.printSpace()
.print("{")
.printNewline()
.options.Indent++
for , := range .Cases {
.printSemicolonIfNeeded()
.printIndent()
if .Value != nil {
.print("case")
.printSpace()
.printExpr(*.Value, js_ast.LLogicalAnd, 0)
} else {
.print("default")
}
.print(":")
if len(.Body) == 1 {
if , := .Body[0].Data.(*js_ast.SBlock); {
.printSpace()
.printBlock(.Body[0].Loc, .Stmts)
.printNewline()
continue
}
}
.printNewline()
.options.Indent++
for , := range .Body {
.printSemicolonIfNeeded()
.()
}
.options.Indent--
}
.options.Indent--
.printIndent()
.print("}")
.printNewline()
.needsSemicolon = false
case *js_ast.SImport:
:= 0
.printIndent()
.printSpaceBeforeIdentifier()
.print("import")
.printSpace()
if .DefaultName != nil {
.printSymbol(.DefaultName.Ref)
++
}
if .Items != nil {
if > 0 {
.print(",")
.printSpace()
}
.print("{")
if !.IsSingleLine {
.options.Indent++
}
for , := range *.Items {
if != 0 {
.print(",")
if .IsSingleLine {
.printSpace()
}
}
if !.IsSingleLine {
.printNewline()
.printIndent()
}
.printIdentifier(.Alias)
:= .renamer.NameForSymbol(.Name.Ref)
if != .Alias {
.print(" as ")
.printIdentifier()
}
}
if !.IsSingleLine {
.options.Indent--
.printNewline()
.printIndent()
}
.print("}")
++
}
if .StarNameLoc != nil {
if > 0 {
.print(",")
.printSpace()
}
.print("*")
.printSpace()
.print("as ")
.printSymbol(.NamespaceRef)
++
}
if > 0 {
.printSpace()
.printSpaceBeforeIdentifier()
.print("from")
.printSpace()
}
.printQuotedUTF8(.importRecords[.ImportRecordIndex].Path.Text, false /* allowBacktick */)
.printSemicolonAfterStatement()
case *js_ast.SBlock:
.printIndent()
.printBlock(.Loc, .Stmts)
.printNewline()
case *js_ast.SDebugger:
.printIndent()
.printSpaceBeforeIdentifier()
.print("debugger")
.printSemicolonAfterStatement()
case *js_ast.SDirective:
:= .bestQuoteCharForString(.Value, false /* allowBacktick */)
.printIndent()
.printSpaceBeforeIdentifier()
.print()
.printQuotedUTF16(.Value, rune([0]))
.print()
.printSemicolonAfterStatement()
case *js_ast.SBreak:
.printIndent()
.printSpaceBeforeIdentifier()
.print("break")
if .Label != nil {
.print(" ")
.printSymbol(.Label.Ref)
}
.printSemicolonAfterStatement()
case *js_ast.SContinue:
.printIndent()
.printSpaceBeforeIdentifier()
.print("continue")
if .Label != nil {
.print(" ")
.printSymbol(.Label.Ref)
}
.printSemicolonAfterStatement()
case *js_ast.SReturn:
.printIndent()
.printSpaceBeforeIdentifier()
.print("return")
if .Value != nil {
.printSpace()
.printExpr(*.Value, js_ast.LLowest, 0)
}
.printSemicolonAfterStatement()
case *js_ast.SThrow:
.printIndent()
.printSpaceBeforeIdentifier()
.print("throw")
.printSpace()
.printExpr(.Value, js_ast.LLowest, 0)
.printSemicolonAfterStatement()
case *js_ast.SExpr:
.printIndent()
.stmtStart = len(.js)
.printExpr(.Value, js_ast.LLowest, 0)
.printSemicolonAfterStatement()
default:
panic(fmt.Sprintf("Unexpected statement of type %T", .Data))
}
}
func ( *printer) () bool {
for , := range .sourceMap {
if != ';' {
return false
}
}
return true
}
type Options struct {
OutputFormat config.Format
RemoveWhitespace bool
MangleSyntax bool
ASCIIOnly bool
ExtractComments bool
AddSourceMappings bool
Indent int
ToModuleRef js_ast.Ref
WrapperRefForSource func(uint32) js_ast.Ref
UnsupportedFeatures compat.JSFeature
InputSourceMap *sourcemap.SourceMap
}
type SourceMapChunk struct {
Buffer []byte
FinalGeneratedColumn int
ShouldIgnore bool
}
type PrintResult struct {
JS []byte
SourceMapChunk SourceMapChunk
ExtractedComments map[string]bool
}
func ( js_ast.AST, js_ast.SymbolMap, renamer.Renamer, Options) PrintResult {
:= &printer{
symbols: ,
renamer: ,
importRecords: .ImportRecords,
options: ,
stmtStart: -1,
exportDefaultStart: -1,
arrowExprStart: -1,
forOfInitStart: -1,
prevOpEnd: -1,
prevNumEnd: -1,
prevRegExpEnd: -1,
prevLoc: logger.Loc{Start: -1},
lineOffsetTables: .LineOffsetTables,
if .Directive != "" {
.printQuotedUTF8(.Directive, .ASCIIOnly)
.print(";")
.printNewline()
}
for , := range .Parts {
for , := range .Stmts {
.printStmt()
.printSemicolonIfNeeded()
}
}
.updateGeneratedLineAndColumn()
return PrintResult{
JS: .js,
ExtractedComments: .extractedComments,
SourceMapChunk: SourceMapChunk{
Buffer: .sourceMap,
EndState: .prevState,
FinalGeneratedColumn: .generatedColumn,
ShouldIgnore: .shouldIgnoreSourceMap(),
},
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |