Source File
ts_parser.go
Belonging Package
github.com/evanw/esbuild/internal/js_parser
case js_lexer.TStringLiteral, js_lexer.TNumericLiteral:
.lexer.Next()
default:
.lexer.Next()
} else {
.lexer.Unexpected()
}
}
if .lexer.Token == js_lexer.TColon || ! {
.lexer.Expect(js_lexer.TColon)
.()
}
if .lexer.Token != js_lexer.TComma {
break
}
.lexer.Next()
}
.lexer.Expect(js_lexer.TCloseBrace)
default:
.lexer.Unexpected()
}
}
func ( *parser) () {
.lexer.Expect(js_lexer.TOpenParen)
if .lexer.Token == js_lexer.TDotDotDot {
.lexer.Next()
}
.skipTypeScriptBinding()
func ( *parser) () {
if .trySkipTypeScriptArrowArgsWithBacktracking() {
.skipTypeScriptReturnType()
} else {
.lexer.Expect(js_lexer.TOpenParen)
.skipTypeScriptType(js_ast.LLowest)
.lexer.Expect(js_lexer.TCloseParen)
}
}
if .lexer.IsContextualKeyword("asserts") {
.lexer.Next()
} else {
.skipTypeScriptType(js_ast.LLowest)
}
if .lexer.IsContextualKeyword("is") && !.lexer.HasNewlineBefore {
.lexer.Next()
.skipTypeScriptType(js_ast.LLowest)
}
}
func ( *parser) ( js_ast.L) {
.skipTypeScriptTypePrefix()
.skipTypeScriptTypeSuffix()
}
func ( *parser) () {
switch .lexer.Token {
case js_lexer.TNumericLiteral, js_lexer.TBigIntegerLiteral, js_lexer.TStringLiteral,
js_lexer.TNoSubstitutionTemplateLiteral, js_lexer.TThis, js_lexer.TTrue, js_lexer.TFalse,
js_lexer.TNull, js_lexer.TVoid, js_lexer.TConst:
.lexer.Next()
.lexer.Next()
if .lexer.Token == js_lexer.TBigIntegerLiteral {
.lexer.Next()
} else {
.lexer.Expect(js_lexer.TNumericLiteral)
}
case js_lexer.TAmpersand:
.skipTypeScriptParenOrFnType()
case js_lexer.TIdentifier:
switch .lexer.Identifier {
case "keyof", "readonly", "infer":
.lexer.Next()
.skipTypeScriptType(js_ast.LPrefix)
case "unique":
.lexer.Next()
if .lexer.IsContextualKeyword("symbol") {
.lexer.Next()
}
.()
.lexer.Next()
for .lexer.Token != js_lexer.TCloseBracket {
if .lexer.Token == js_lexer.TDotDotDot {
.lexer.Next()
}
.skipTypeScriptType(js_ast.LLowest)
if .lexer.Token == js_lexer.TQuestion {
.lexer.Next()
}
if .lexer.Token == js_lexer.TColon {
.lexer.Next()
.skipTypeScriptType(js_ast.LLowest)
}
if .lexer.Token != js_lexer.TComma {
break
}
.lexer.Next()
}
.lexer.Expect(js_lexer.TCloseBracket)
case js_lexer.TOpenBrace:
.skipTypeScriptObjectType()
for {
.lexer.Next()
.skipTypeScriptType(js_ast.LLowest)
.lexer.RescanCloseBraceAsTemplateToken()
if .lexer.Token == js_lexer.TTemplateTail {
.lexer.Next()
break
}
}
default:
.lexer.Unexpected()
}
}
func ( *parser) ( js_ast.L) {
for {
switch .lexer.Token {
case js_lexer.TBar:
if >= js_ast.LBitwiseOr {
return
}
.lexer.Next()
.skipTypeScriptType(js_ast.LBitwiseOr)
case js_lexer.TAmpersand:
if >= js_ast.LBitwiseAnd {
return
}
.lexer.Next()
.skipTypeScriptType(js_ast.LBitwiseAnd)
if .lexer.HasNewlineBefore {
return
}
.lexer.Next()
if .lexer.Token != js_lexer.TCloseBracket {
.skipTypeScriptType(js_ast.LLowest)
}
.lexer.Expect(js_lexer.TCloseBracket)
case js_lexer.TLessThan, js_lexer.TLessThanEquals,
if .lexer.HasNewlineBefore {
return
}
.lexer.ExpectLessThan(false /* isInsideJSXElement */)
for {
.skipTypeScriptType(js_ast.LLowest)
if .lexer.Token != js_lexer.TComma {
break
}
.lexer.Next()
}
.lexer.ExpectGreaterThan(false /* isInsideJSXElement */)
if .lexer.HasNewlineBefore || >= js_ast.LConditional {
return
}
.lexer.Next()
.skipTypeScriptType(js_ast.LConditional)
.lexer.Expect(js_lexer.TQuestion)
.skipTypeScriptType(js_ast.LLowest)
.lexer.Expect(js_lexer.TColon)
.skipTypeScriptType(js_ast.LLowest)
default:
return
}
}
}
func ( *parser) () {
.lexer.Expect(js_lexer.TOpenBrace)
:= false
for .lexer.IsIdentifierOrKeyword() ||
.lexer.Token == js_lexer.TStringLiteral ||
.lexer.Token == js_lexer.TNumericLiteral {
.lexer.Next()
= true
}
.lexer.Next()
.skipTypeScriptType(js_ast.LLowest)
}
}
.lexer.Expect(js_lexer.TCloseBracket)
.skipTypeScriptTypeParameters()
switch .lexer.Token {
if ! {
.lexer.Expect(js_lexer.TIdentifier)
}
.lexer.Next()
.skipTypeScriptType(js_ast.LLowest)
.skipTypeScriptFnArgs()
if .lexer.Token == js_lexer.TColon {
.lexer.Next()
.skipTypeScriptReturnType()
}
default:
if ! {
.lexer.Unexpected()
}
}
switch .lexer.Token {
case js_lexer.TCloseBrace:
case js_lexer.TComma, js_lexer.TSemicolon:
.lexer.Next()
default:
if !.lexer.HasNewlineBefore {
.lexer.Unexpected()
}
}
}
.lexer.Expect(js_lexer.TCloseBrace)
}
if .lexer.Token == js_lexer.TEquals {
.lexer.Next()
.skipTypeScriptType(js_ast.LLowest)
}
if .lexer.Token != js_lexer.TComma {
break
}
.lexer.Next()
if .lexer.Token == js_lexer.TGreaterThan {
break
}
}
.lexer.ExpectGreaterThan(false /* isInsideJSXElement */)
}
}
func ( *parser) ( bool) bool {
if .lexer.Token != js_lexer.TLessThan {
return false
}
.lexer.Next()
for {
.skipTypeScriptType(js_ast.LLowest)
if .lexer.Token != js_lexer.TComma {
break
}
.lexer.Next()
}
.lexer.ExpectGreaterThan()
return true
}
func ( *parser) () bool {
:= .lexer
.lexer.IsLogDisabled = true
defer func() {
:= recover()
if , := .(js_lexer.LexerPanic); {
.lexer =
} else if != nil {
panic()
}
}()
.skipTypeScriptTypeArguments(false /* isInsideJSXElement */)
if !.canFollowTypeArgumentsInExpression() {
.lexer.Unexpected()
}
.lexer.IsLogDisabled = .IsLogDisabled
return true
}
func ( *parser) () bool {
:= .lexer
.lexer.IsLogDisabled = true
defer func() {
:= recover()
if , := .(js_lexer.LexerPanic); {
.lexer =
} else if != nil {
panic()
}
}()
.skipTypeScriptTypeParameters()
if .lexer.Token != js_lexer.TOpenParen {
.lexer.Unexpected()
}
.lexer.IsLogDisabled = .IsLogDisabled
return true
}
func ( *parser) () bool {
:= .lexer
.lexer.IsLogDisabled = true
if .lexer.Token != js_lexer.TEqualsGreaterThan {
.lexer.Unexpected()
}
.lexer.IsLogDisabled = .IsLogDisabled
return true
}
func ( *parser) () bool {
:= .lexer
.lexer.IsLogDisabled = true
defer func() {
:= recover()
if , := .(js_lexer.LexerPanic); {
.lexer =
} else if != nil {
panic()
}
}()
.skipTypeScriptFnArgs()
.lexer.Expect(js_lexer.TEqualsGreaterThan)
.lexer.IsLogDisabled = .IsLogDisabled
return true
}
js_lexer.TOpenParen, // foo<x>(
js_lexer.TNoSubstitutionTemplateLiteral, // foo<T> `...`
js_lexer.TTemplateHead: // foo<T> `...${100}...`
return true
js_lexer.TDot, // foo<x>.
js_lexer.TCloseParen, // foo<x>)
js_lexer.TCloseBracket, // foo<x>]
js_lexer.TColon, // foo<x>:
js_lexer.TSemicolon, // foo<x>;
js_lexer.TQuestion, // foo<x>?
js_lexer.TEqualsEquals, // foo<x> ==
js_lexer.TEqualsEqualsEquals, // foo<x> ===
js_lexer.TExclamationEquals, // foo<x> !=
js_lexer.TExclamationEqualsEquals, // foo<x> !==
js_lexer.TAmpersandAmpersand, // foo<x> &&
js_lexer.TBarBar, // foo<x> ||
js_lexer.TQuestionQuestion, // foo<x> ??
js_lexer.TCaret, // foo<x> ^
js_lexer.TAmpersand, // foo<x> &
js_lexer.TBar, // foo<x> |
js_lexer.TCloseBrace, // foo<x> }
js_lexer.TEndOfFile: // foo<x>
return true
js_lexer.TComma, // foo<x>,
js_lexer.TOpenBrace: // foo<x> {
return false
return false
}
}
func ( *parser) ( parseStmtOpts) {
:= .lexer.Identifier
.lexer.Expect(js_lexer.TIdentifier)
if .isModuleScope {
.localTypeNames[] = true
}
.skipTypeScriptTypeParameters()
if .lexer.Token == js_lexer.TExtends {
.lexer.Next()
for {
.skipTypeScriptType(js_ast.LLowest)
if .lexer.Token != js_lexer.TComma {
break
}
.lexer.Next()
}
}
if .lexer.IsContextualKeyword("implements") {
.lexer.Next()
for {
.skipTypeScriptType(js_ast.LLowest)
if .lexer.Token != js_lexer.TComma {
break
}
.lexer.Next()
}
}
.skipTypeScriptObjectType()
}
func ( *parser) ( parseStmtOpts) {
.parseExportClause()
if .lexer.IsContextualKeyword("from") {
.lexer.Next()
.parsePath()
}
.lexer.ExpectOrInsertSemicolon()
return
}
:= .lexer.Identifier
.lexer.Expect(js_lexer.TIdentifier)
if .isModuleScope {
.localTypeNames[] = true
}
.skipTypeScriptTypeParameters()
.lexer.Expect(js_lexer.TEquals)
.skipTypeScriptType(js_ast.LLowest)
.lexer.ExpectOrInsertSemicolon()
}
func ( *parser) () []js_ast.Expr {
var []js_ast.Expr
if .options.ts.Parse {
for .lexer.Token == js_lexer.TAt {
.lexer.Next()
= append(, .parseExprWithFlags(js_ast.LNew, exprFlagTSDecorator))
}
}
return
}
func ( *parser) ( logger.Loc, parseStmtOpts) js_ast.Stmt {
.lexer.Expect(js_lexer.TEnum)
:= .lexer.Loc()
:= .lexer.Identifier
.lexer.Expect(js_lexer.TIdentifier)
:= js_ast.LocRef{Loc: , Ref: js_ast.InvalidRef}
:= js_ast.InvalidRef
if !.isTypeScriptDeclare {
.Ref = .declareSymbol(js_ast.SymbolTSEnum, , )
.pushScopeForParsePass(js_ast.ScopeEntry, )
= .declareSymbol(js_ast.SymbolHoisted, , )
}
.lexer.Expect(js_lexer.TOpenBrace)
:= []js_ast.EnumValue{}
for .lexer.Token != js_lexer.TCloseBrace {
:= js_ast.EnumValue{
Loc: .lexer.Loc(),
Ref: js_ast.InvalidRef,
}
if .lexer.Token == js_lexer.TStringLiteral {
.Name = .lexer.StringLiteral
} else if .lexer.IsIdentifierOrKeyword() {
.Name = js_lexer.StringToUTF16(.lexer.Identifier)
} else {
.lexer.Expect(js_lexer.TIdentifier)
}
.lexer.Next()
if !.isTypeScriptDeclare && js_lexer.IsIdentifierUTF16(.Name) {
.Ref = .declareSymbol(js_ast.SymbolOther, .Loc, js_lexer.UTF16ToString(.Name))
}
if .lexer.Token == js_lexer.TEquals {
.lexer.Next()
:= .parseExpr(js_ast.LComma)
.Value = &
}
= append(, )
if .lexer.Token != js_lexer.TComma && .lexer.Token != js_lexer.TSemicolon {
break
}
.lexer.Next()
}
if !.isTypeScriptDeclare {
.popScope()
}
.lexer.Expect(js_lexer.TCloseBrace)
return js_ast.Stmt{Loc: , Data: &js_ast.SEnum{
Name: ,
Arg: ,
Values: ,
IsExport: .isExport,
}}
}
func ( *parser) ( logger.Loc, parseStmtOpts, logger.Loc, string) js_ast.Stmt {
.lexer.Expect(js_lexer.TEquals)
:= .selectLocalKind(js_ast.LocalConst)
:= .lexer.Identifier
:= js_ast.Expr{Loc: .lexer.Loc(), Data: &js_ast.EIdentifier{Ref: .storeNameInRef()}}
.lexer.Expect(js_lexer.TIdentifier)
for .lexer.Token == js_lexer.TDot {
.lexer.Next()
.Data = &js_ast.EDot{
Target: ,
Name: .lexer.Identifier,
NameLoc: .lexer.Loc(),
}
.lexer.Expect(js_lexer.TIdentifier)
}
}
.lexer.ExpectOrInsertSemicolon()
:= .declareSymbol(js_ast.SymbolConst, , )
:= []js_ast.Decl{{
Binding: js_ast.Binding{Loc: , Data: &js_ast.BIdentifier{Ref: }},
Value: &,
}}
return js_ast.Stmt{Loc: , Data: &js_ast.SLocal{
Kind: ,
Decls: ,
IsExport: .isExport,
WasTSImportEquals: true,
}}
}
:= .lexer.Loc()
:= .lexer.Identifier
.lexer.Next()
:= js_ast.LocRef{Loc: , Ref: js_ast.InvalidRef}
:= .pushScopeForParsePass(js_ast.ScopeEntry, )
var []js_ast.Stmt
if .lexer.Token == js_lexer.TDot {
:= .lexer.Loc()
.lexer.Next()
= []js_ast.Stmt{.(, parseStmtOpts{
isExport: true,
isNamespaceScope: true,
isTypeScriptDeclare: .isTypeScriptDeclare,
})}
} else if .isTypeScriptDeclare && .lexer.Token != js_lexer.TOpenBrace {
.lexer.ExpectOrInsertSemicolon()
} else {
.lexer.Expect(js_lexer.TOpenBrace)
= .parseStmtsUpTo(js_lexer.TCloseBrace, parseStmtOpts{
isNamespaceScope: true,
isTypeScriptDeclare: .isTypeScriptDeclare,
})
.lexer.Next()
}
:= 0
for , := range {
if , := .Data.(*js_ast.SLocal); && .WasTSImportEquals && !.IsExport {
++
}
}
if len() == || .isTypeScriptDeclare {
.popAndDiscardScope()
if .isModuleScope {
.localTypeNames[] = true
}
return js_ast.Stmt{Loc: , Data: &js_ast.STypeScript{}}
}
:= js_ast.InvalidRef
= .newSymbol(js_ast.SymbolHoisted, "_"+)
.currentScope.Generated = append(.currentScope.Generated, )
} else {
= .declareSymbol(js_ast.SymbolHoisted, , )
}
}
.popScope()
if !.isTypeScriptDeclare {
.Ref = .declareSymbol(js_ast.SymbolTSNamespace, , )
}
return js_ast.Stmt{Loc: , Data: &js_ast.SNamespace{
Name: ,
Arg: ,
Stmts: ,
IsExport: .isExport,
}}
}
func ( *parser) (
[]js_ast.Stmt, logger.Loc, bool, logger.Loc,
js_ast.Ref, js_ast.Ref, []js_ast.Stmt,
:= .symbols[.InnerIndex]
for .Link != js_ast.InvalidRef {
= .Link
= .symbols[.InnerIndex]
}
if (.Kind == js_ast.SymbolTSNamespace || .Kind == js_ast.SymbolTSEnum) && !.emittedNamespaceVars[] {
.emittedNamespaceVars[] = true
:= .symbols[.InnerIndex].OriginalName
= js_ast.Assign(
js_ast.Expr{Loc: , Data: &js_ast.EIdentifier{Ref: }},
js_ast.Expr{Loc: , Data: &js_ast.EBinary{
Op: js_ast.BinOpLogicalOr,
Left: js_ast.Expr{Loc: , Data: &js_ast.EDot{
Target: js_ast.Expr{Loc: , Data: &js_ast.EIdentifier{Ref: *.enclosingNamespaceArgRef}},
Name: ,
NameLoc: ,
}},
Right: js_ast.Assign(
js_ast.Expr{Loc: , Data: &js_ast.EDot{
Target: js_ast.Expr{Loc: , Data: &js_ast.EIdentifier{Ref: *.enclosingNamespaceArgRef}},
Name: ,
NameLoc: ,
}},
js_ast.Expr{Loc: , Data: &js_ast.EObject{}},
),
}},
)
.recordUsage(*.enclosingNamespaceArgRef)
.recordUsage(*.enclosingNamespaceArgRef)
.recordUsage()
= append(, js_ast.Stmt{Loc: , Data: &js_ast.SExpr{Value: js_ast.Expr{Loc: , Data: &js_ast.ECall{
Target: js_ast.Expr{Loc: , Data: &js_ast.EFunction{Fn: js_ast.Fn{
Args: []js_ast.Arg{{Binding: js_ast.Binding{Loc: , Data: &js_ast.BIdentifier{Ref: }}}},
Body: js_ast.FnBody{Loc: , Stmts: },
}}},
Args: []js_ast.Expr{},
}}}})
return
![]() |
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. |