Files

63 lines
1.4 KiB
Go

package js_parser
import (
"github.com/evanw/esbuild/internal/helpers"
"github.com/evanw/esbuild/internal/js_lexer"
"github.com/evanw/esbuild/internal/logger"
)
func ParseGlobalName(log logger.Log, source logger.Source) (result []string, ok bool) {
ok = true
defer func() {
r := recover()
if _, isLexerPanic := r.(js_lexer.LexerPanic); isLexerPanic {
ok = false
} else if r != nil {
panic(r)
}
}()
lexer := js_lexer.NewLexerGlobalName(log, source)
// Start off with an identifier or a keyword that results in an object
result = append(result, lexer.Identifier.String)
switch lexer.Token {
case js_lexer.TThis:
lexer.Next()
case js_lexer.TImport:
// Handle "import.meta"
lexer.Next()
lexer.Expect(js_lexer.TDot)
result = append(result, lexer.Identifier.String)
lexer.ExpectContextualKeyword("meta")
default:
lexer.Expect(js_lexer.TIdentifier)
}
// Follow with dot or index expressions
for lexer.Token != js_lexer.TEndOfFile {
switch lexer.Token {
case js_lexer.TDot:
lexer.Next()
if !lexer.IsIdentifierOrKeyword() {
lexer.Expect(js_lexer.TIdentifier)
}
result = append(result, lexer.Identifier.String)
lexer.Next()
case js_lexer.TOpenBracket:
lexer.Next()
result = append(result, helpers.UTF16ToString(lexer.StringLiteral()))
lexer.Expect(js_lexer.TStringLiteral)
lexer.Expect(js_lexer.TCloseBracket)
default:
lexer.Expect(js_lexer.TDot)
}
}
return
}