package js

import "github.com/tdewolff/parse/v2/js"

Package js is an ECMAScript5.1 lexer following the specifications at http://www.ecma-international.org/ecma-262/5.1/.

Index

Examples

Variables

var ErrInvalidJSON = fmt.Errorf("invalid JSON")
var Keywords = map[string]TokenType{

	"await":      AwaitToken,
	"break":      BreakToken,
	"case":       CaseToken,
	"catch":      CatchToken,
	"class":      ClassToken,
	"const":      ConstToken,
	"continue":   ContinueToken,
	"debugger":   DebuggerToken,
	"default":    DefaultToken,
	"delete":     DeleteToken,
	"do":         DoToken,
	"else":       ElseToken,
	"enum":       EnumToken,
	"export":     ExportToken,
	"extends":    ExtendsToken,
	"false":      FalseToken,
	"finally":    FinallyToken,
	"for":        ForToken,
	"function":   FunctionToken,
	"if":         IfToken,
	"import":     ImportToken,
	"in":         InToken,
	"instanceof": InstanceofToken,
	"new":        NewToken,
	"null":       NullToken,
	"return":     ReturnToken,
	"super":      SuperToken,
	"switch":     SwitchToken,
	"this":       ThisToken,
	"throw":      ThrowToken,
	"true":       TrueToken,
	"try":        TryToken,
	"typeof":     TypeofToken,
	"var":        VarToken,
	"void":       VoidToken,
	"while":      WhileToken,
	"with":       WithToken,
	"yield":      YieldToken,

	"let":        LetToken,
	"static":     StaticToken,
	"implements": ImplementsToken,
	"interface":  InterfaceToken,
	"package":    PackageToken,
	"private":    PrivateToken,
	"protected":  ProtectedToken,
	"public":     PublicToken,

	"as":     AsToken,
	"async":  AsyncToken,
	"from":   FromToken,
	"get":    GetToken,
	"meta":   MetaToken,
	"of":     OfToken,
	"set":    SetToken,
	"target": TargetToken,
}

Keywords is a map of reserved, strict, and other keywords

var NestedExprLimit = 1000
var NestedStmtLimit = 1000

Functions

func AsDecimalLiteral

func AsDecimalLiteral(b []byte) bool

AsDecimalLiteral returns true if a valid decimal literal is given.

func AsIdentifierName

func AsIdentifierName(b []byte) bool

AsIdentifierName returns true if a valid identifier name is given.

func IsIdentifier

func IsIdentifier(tt TokenType) bool

IsIdentifier matches Identifier, i.e. IdentifierName but not ReservedWord. Does not match yield or await.

func IsIdentifierContinue

func IsIdentifierContinue(b []byte) bool

IsIdentifierContinue returns true if the byte-slice start is a continuation of an identifier

func IsIdentifierEnd

func IsIdentifierEnd(b []byte) bool

IsIdentifierEnd returns true if the byte-slice end is a start or continuation of an identifier

func IsIdentifierName

func IsIdentifierName(tt TokenType) bool

IsIdentifierName matches IdentifierName, i.e. any identifier

func IsIdentifierStart

func IsIdentifierStart(b []byte) bool

IsIdentifierStart returns true if the byte-slice start is the start of an identifier

func IsNumeric

func IsNumeric(tt TokenType) bool

IsNumeric return true if token is numeric.

func IsOperator

func IsOperator(tt TokenType) bool

IsOperator return true if token is an operator.

func IsPunctuator

func IsPunctuator(tt TokenType) bool

IsPunctuator return true if token is a punctuator.

func IsReservedWord

func IsReservedWord(tt TokenType) bool

IsReservedWord matches ReservedWord

func Walk

func Walk(v IVisitor, n INode)

Walk traverses an AST in depth-first order

Types

type AST

type AST struct {
	BlockStmt // module
}

AST is the full ECMAScript abstract syntax tree.

func Parse

func Parse(r *parse.Input, o Options) (*AST, error)

Parse returns a JS AST tree of.

func (AST) JS

func (ast AST) JS(w io.Writer)

JS writes JavaScript to writer.

func (AST) JSON

func (ast AST) JSON(w io.Writer) error

JSON writes JSON to writer.

func (AST) JSONString

func (ast AST) JSONString() (string, error)

JSONString returns a string of JSON if valid.

func (AST) JSString

func (ast AST) JSString() string

JSONString returns a string of JavaScript.

func (AST) String

func (ast AST) String() string

type Alias

type Alias struct {
	Name    []byte // can be nil
	Binding []byte // can be nil
}

Alias is a name space import or import/export specifier for import/export statements.

func (Alias) JS

func (alias Alias) JS(w io.Writer)

JS writes JavaScript to writer.

func (Alias) String

func (alias Alias) String() string

type Arg

type Arg struct {
	Value IExpr
	Rest  bool
}

func (Arg) JS

func (n Arg) JS(w io.Writer)

JS writes JavaScript to writer.

func (Arg) String

func (n Arg) String() string

type Args

type Args struct {
	List []Arg
}

Args is a list of arguments as used by new and call expressions.

func (Args) JS

func (n Args) JS(w io.Writer)

JS writes JavaScript to writer.

func (Args) String

func (n Args) String() string

type ArrayExpr

type ArrayExpr struct {
	List []Element
}

ArrayExpr is an array literal.

func (ArrayExpr) JS

func (n ArrayExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (ArrayExpr) JSON

func (n ArrayExpr) JSON(w io.Writer) error

JSON writes JSON to writer.

func (ArrayExpr) String

func (n ArrayExpr) String() string

type ArrowFunc

type ArrowFunc struct {
	Async  bool
	Params Params
	Body   BlockStmt
}

ArrowFunc is an (async) arrow function.

func (ArrowFunc) JS

func (n ArrowFunc) JS(w io.Writer)

JS writes JavaScript to writer.

func (ArrowFunc) String

func (n ArrowFunc) String() string

type BinaryExpr

type BinaryExpr struct {
	Op   TokenType
	X, Y IExpr
}

BinaryExpr is a binary expression.

func (BinaryExpr) JS

func (n BinaryExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (BinaryExpr) String

func (n BinaryExpr) String() string

type BindingArray

type BindingArray struct {
	List []BindingElement
	Rest IBinding // can be nil
}

BindingArray is an array binding pattern.

func (BindingArray) JS

func (n BindingArray) JS(w io.Writer)

JS writes JavaScript to writer.

func (BindingArray) String

func (n BindingArray) String() string

type BindingElement

type BindingElement struct {
	Binding IBinding // can be nil (in case of ellision)
	Default IExpr    // can be nil
}

BindingElement is a binding element.

func (BindingElement) JS

func (n BindingElement) JS(w io.Writer)

JS writes JavaScript to writer.

func (BindingElement) String

func (n BindingElement) String() string

type BindingObject

type BindingObject struct {
	List []BindingObjectItem
	Rest *Var // can be nil
}

BindingObject is an object binding pattern.

func (BindingObject) JS

func (n BindingObject) JS(w io.Writer)

JS writes JavaScript to writer.

func (BindingObject) String

func (n BindingObject) String() string

type BindingObjectItem

type BindingObjectItem struct {
	Key   *PropertyName // can be nil
	Value BindingElement
}

BindingObjectItem is a binding property.

func (BindingObjectItem) JS

func (n BindingObjectItem) JS(w io.Writer)

JS writes JavaScript to writer.

func (BindingObjectItem) String

func (n BindingObjectItem) String() string

type BlockStmt

type BlockStmt struct {
	List []IStmt
	Scope
}

BlockStmt is a block statement.

func (BlockStmt) JS

func (n BlockStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (BlockStmt) String

func (n BlockStmt) String() string

type BranchStmt

type BranchStmt struct {
	Type  TokenType
	Label []byte // can be nil
}

BranchStmt is a continue or break statement.

func (BranchStmt) JS

func (n BranchStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (BranchStmt) String

func (n BranchStmt) String() string

type CallExpr

type CallExpr struct {
	X        IExpr
	Args     Args
	Optional bool
}

CallExpr is a call expression.

func (CallExpr) JS

func (n CallExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (CallExpr) String

func (n CallExpr) String() string

type CaseClause

type CaseClause struct {
	TokenType
	Cond IExpr // can be nil
	List []IStmt
}

CaseClause is a case clause or default clause for a switch statement.

func (CaseClause) JS

func (n CaseClause) JS(w io.Writer)

JS writes JavaScript to writer.

func (CaseClause) String

func (n CaseClause) String() string

type ClassDecl

type ClassDecl struct {
	Name    *Var  // can be nil
	Extends IExpr // can be nil
	List    []ClassElement
}

ClassDecl is a class declaration.

func (ClassDecl) JS

func (n ClassDecl) JS(w io.Writer)

JS writes JavaScript to writer.

func (ClassDecl) String

func (n ClassDecl) String() string

type ClassElement

type ClassElement struct {
	StaticBlock *BlockStmt  // can be nil
	Method      *MethodDecl // can be nil
	Field
}

ClassElement is a class element that is either a static block, a field definition, or a class method

func (ClassElement) JS

func (n ClassElement) JS(w io.Writer)

JS writes JavaScript to writer.

func (ClassElement) String

func (n ClassElement) String() string

type CommaExpr

type CommaExpr struct {
	List []IExpr
}

CommaExpr is a series of comma expressions.

func (CommaExpr) JS

func (n CommaExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (CommaExpr) String

func (n CommaExpr) String() string

type Comment

type Comment struct {
	Value []byte
}

Comment block or line, usually a bang comment.

func (Comment) JS

func (n Comment) JS(w io.Writer)

JS writes JavaScript to writer.

func (Comment) String

func (n Comment) String() string

type CondExpr

type CondExpr struct {
	Cond, X, Y IExpr
}

CondExpr is a conditional expression.

func (CondExpr) JS

func (n CondExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (CondExpr) String

func (n CondExpr) String() string

type DebuggerStmt

type DebuggerStmt struct{}

DebuggerStmt is a debugger statement.

func (DebuggerStmt) JS

func (n DebuggerStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (DebuggerStmt) String

func (n DebuggerStmt) String() string

type DeclType

type DeclType uint16

DeclType specifies the kind of declaration.

const (
	NoDecl       DeclType = iota // undeclared variables
	VariableDecl                 // var
	FunctionDecl                 // function
	ArgumentDecl                 // function and method arguments
	LexicalDecl                  // let, const, class
	CatchDecl                    // catch statement argument
	ExprDecl                     // function expression name or class expression name
)

DeclType values.

func (DeclType) String

func (decl DeclType) String() string

type DirectivePrologueStmt

type DirectivePrologueStmt struct {
	Value []byte
}

DirectivePrologueStmt is a string literal at the beginning of a function or module (usually "use strict").

func (DirectivePrologueStmt) JS

JS writes JavaScript to writer.

func (DirectivePrologueStmt) String

func (n DirectivePrologueStmt) String() string

type DoWhileStmt

type DoWhileStmt struct {
	Cond IExpr
	Body IStmt
}

DoWhileStmt is a do-while iteration statement.

func (DoWhileStmt) JS

func (n DoWhileStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (DoWhileStmt) String

func (n DoWhileStmt) String() string

type DotExpr

type DotExpr struct {
	X        IExpr
	Y        LiteralExpr
	Prec     OpPrec
	Optional bool
}

DotExpr is a member/call expression, super property, or optional chain with a dot expression.

func (DotExpr) JS

func (n DotExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (DotExpr) String

func (n DotExpr) String() string

type Element

type Element struct {
	Value  IExpr // can be nil
	Spread bool
}

Element is an array literal element.

func (Element) JS

func (n Element) JS(w io.Writer)

JS writes JavaScript to writer.

func (Element) String

func (n Element) String() string

type EmptyStmt

type EmptyStmt struct{}

EmptyStmt is an empty statement.

func (EmptyStmt) JS

func (n EmptyStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (EmptyStmt) String

func (n EmptyStmt) String() string

type ExportStmt

type ExportStmt struct {
	List    []Alias
	Module  []byte // can be nil
	Default bool
	Decl    IExpr
}

ExportStmt is an export statement.

func (ExportStmt) JS

func (n ExportStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (ExportStmt) String

func (n ExportStmt) String() string

type ExprStmt

type ExprStmt struct {
	Value IExpr
}

ExprStmt is an expression statement.

func (ExprStmt) JS

func (n ExprStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (ExprStmt) String

func (n ExprStmt) String() string

type Field

type Field struct {
	Static bool
	Name   PropertyName
	Init   IExpr
}

Field is a field definition in a class declaration.

func (Field) JS

func (n Field) JS(w io.Writer)

JS writes JavaScript to writer.

func (Field) String

func (n Field) String() string

type ForInStmt

type ForInStmt struct {
	Init  IExpr
	Value IExpr
	Body  *BlockStmt
}

ForInStmt is a for-in iteration statement.

func (ForInStmt) JS

func (n ForInStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (ForInStmt) String

func (n ForInStmt) String() string

type ForOfStmt

type ForOfStmt struct {
	Await bool
	Init  IExpr
	Value IExpr
	Body  *BlockStmt
}

ForOfStmt is a for-of iteration statement.

func (ForOfStmt) JS

func (n ForOfStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (ForOfStmt) String

func (n ForOfStmt) String() string

type ForStmt

type ForStmt struct {
	Init IExpr // can be nil
	Cond IExpr // can be nil
	Post IExpr // can be nil
	Body *BlockStmt
}

ForStmt is a regular for iteration statement.

func (ForStmt) JS

func (n ForStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (ForStmt) String

func (n ForStmt) String() string

type FuncDecl

type FuncDecl struct {
	Async     bool
	Generator bool
	Name      *Var // can be nil
	Params    Params
	Body      BlockStmt
}

FuncDecl is an (async) (generator) function declaration or expression.

func (FuncDecl) JS

func (n FuncDecl) JS(w io.Writer)

JS writes JavaScript to writer.

func (FuncDecl) String

func (n FuncDecl) String() string

type GroupExpr

type GroupExpr struct {
	X IExpr
}

GroupExpr is a parenthesized expression.

func (GroupExpr) JS

func (n GroupExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (GroupExpr) String

func (n GroupExpr) String() string

type IBinding

type IBinding interface {
	INode
	// contains filtered or unexported methods
}

IBinding is a dummy interface for bindings.

type IExpr

type IExpr interface {
	INode
	// contains filtered or unexported methods
}

IExpr is a dummy interface for expressions.

type INode

type INode interface {
	String() string
	JS(io.Writer)
}

INode is an interface for AST nodes

type IStmt

type IStmt interface {
	INode
	// contains filtered or unexported methods
}

IStmt is a dummy interface for statements.

type IVisitor

type IVisitor interface {
	Enter(n INode) IVisitor
	Exit(n INode)
}

IVisitor represents the AST Visitor Each INode encountered by `Walk` is passed to `Enter`, children nodes will be ignored if the returned IVisitor is nil `Exit` is called upon the exit of a node

type IfStmt

type IfStmt struct {
	Cond IExpr
	Body IStmt
	Else IStmt // can be nil
}

IfStmt is an if statement.

func (IfStmt) JS

func (n IfStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (IfStmt) String

func (n IfStmt) String() string

type ImportMetaExpr

type ImportMetaExpr struct{}

ImportMetaExpr is a import meta meta property.

func (ImportMetaExpr) JS

func (n ImportMetaExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (ImportMetaExpr) String

func (n ImportMetaExpr) String() string

type ImportStmt

type ImportStmt struct {
	List    []Alias
	Default []byte // can be nil
	Module  []byte
}

ImportStmt is an import statement.

func (ImportStmt) JS

func (n ImportStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (ImportStmt) String

func (n ImportStmt) String() string

type IndexExpr

type IndexExpr struct {
	X        IExpr
	Y        IExpr
	Prec     OpPrec
	Optional bool
}

IndexExpr is a member/call expression, super property, or optional chain with an index expression.

func (IndexExpr) JS

func (n IndexExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (IndexExpr) String

func (n IndexExpr) String() string

type JSONer

type JSONer interface {
	JSON(io.Writer) error
}

type LabelledStmt

type LabelledStmt struct {
	Label []byte
	Value IStmt
}

LabelledStmt is a labelled statement.

func (LabelledStmt) JS

func (n LabelledStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (LabelledStmt) String

func (n LabelledStmt) String() string

type Lexer

type Lexer struct {
	// contains filtered or unexported fields
}

Lexer is the state for the lexer.

func NewLexer

func NewLexer(r *parse.Input) *Lexer

NewLexer returns a new Lexer for a given io.Reader.

Example

Code:

{
	l := NewLexer(parse.NewInputString("var x = 'lorem ipsum';"))
	out := ""
	for {
		tt, data := l.Next()
		if tt == ErrorToken {
			break
		}
		out += string(data)
	}
	fmt.Println(out)
	// Output: var x = 'lorem ipsum';
}

Output:

var x = 'lorem ipsum';

func (*Lexer) Err

func (l *Lexer) Err() error

Err returns the error encountered during lexing, this is often io.EOF but also other errors can be returned.

func (*Lexer) Next

func (l *Lexer) Next() (TokenType, []byte)

Next returns the next Token. It returns ErrorToken when an error was encountered. Using Err() one can retrieve the error message.

func (*Lexer) RegExp

func (l *Lexer) RegExp() (TokenType, []byte)

RegExp reparses the input stream for a regular expression. It is assumed that we just received DivToken or DivEqToken with Next(). This function will go back and read that as a regular expression.

type LiteralExpr

type LiteralExpr struct {
	TokenType
	Data []byte
}

LiteralExpr can be this, null, boolean, numeric, string, or regular expression literals.

func (LiteralExpr) JS

func (n LiteralExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (LiteralExpr) JSON

func (n LiteralExpr) JSON(w io.Writer) error

JSON writes JSON to writer.

func (LiteralExpr) String

func (n LiteralExpr) String() string

type MethodDecl

type MethodDecl struct {
	Static    bool
	Async     bool
	Generator bool
	Get       bool
	Set       bool
	Name      PropertyName
	Params    Params
	Body      BlockStmt
}

MethodDecl is a method definition in a class declaration.

func (MethodDecl) JS

func (n MethodDecl) JS(w io.Writer)

JS writes JavaScript to writer.

func (MethodDecl) String

func (n MethodDecl) String() string

type NewExpr

type NewExpr struct {
	X    IExpr
	Args *Args // can be nil
}

NewExpr is a new expression or new member expression.

func (NewExpr) JS

func (n NewExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (NewExpr) String

func (n NewExpr) String() string

type NewTargetExpr

type NewTargetExpr struct{}

NewTargetExpr is a new target meta property.

func (NewTargetExpr) JS

func (n NewTargetExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (NewTargetExpr) String

func (n NewTargetExpr) String() string

type ObjectExpr

type ObjectExpr struct {
	List []Property
}

ObjectExpr is an object literal.

func (ObjectExpr) JS

func (n ObjectExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (ObjectExpr) JSON

func (n ObjectExpr) JSON(w io.Writer) error

JSON writes JSON to writer.

func (ObjectExpr) String

func (n ObjectExpr) String() string

type OpPrec

type OpPrec int

OpPrec is the operator precedence

const (
	OpExpr     OpPrec = iota // a,b
	OpAssign                 // a?b:c, yield x, ()=>x, async ()=>x, a=b, a+=b, ...
	OpCoalesce               // a??b
	OpOr                     // a||b
	OpAnd                    // a&&b
	OpBitOr                  // a|b
	OpBitXor                 // a^b
	OpBitAnd                 // a&b
	OpEquals                 // a==b, a!=b, a===b, a!==b
	OpCompare                // a<b, a>b, a<=b, a>=b, a instanceof b, a in b
	OpShift                  // a<<b, a>>b, a>>>b
	OpAdd                    // a+b, a-b
	OpMul                    // a*b, a/b, a%b
	OpExp                    // a**b
	OpUnary                  // ++x, --x, delete x, void x, typeof x, +x, -x, ~x, !x, await x
	OpUpdate                 // x++, x--
	OpLHS                    // CallExpr/OptChainExpr or NewExpr
	OpCall                   // a?.b, a(b), super(a), import(a)
	OpNew                    // new a
	OpMember                 // a[b], a.b, a`b`, super[x], super.x, new.target, import.meta, new a(b)
	OpPrimary                // literal, function, class, parenthesized
)

OpPrec values.

func (OpPrec) String

func (prec OpPrec) String() string

type Options

type Options struct {
	WhileToFor bool
	Inline     bool
}

type Params

type Params struct {
	List []BindingElement
	Rest IBinding // can be nil
}

Params is a list of parameters for functions, methods, and arrow function.

func (Params) JS

func (n Params) JS(w io.Writer)

JS writes JavaScript to writer.

func (Params) String

func (n Params) String() string

type Parser

type Parser struct {
	// contains filtered or unexported fields
}

Parser is the state for the parser.

type Property

type Property struct {
	// either Name or Spread are set. When Spread is set then Value is AssignmentExpression
	// if Init is set then Value is IdentifierReference, otherwise it can also be MethodDefinition
	Name   *PropertyName // can be nil
	Spread bool
	Value  IExpr
	Init   IExpr // can be nil
}

Property is a property definition in an object literal.

func (Property) JS

func (n Property) JS(w io.Writer)

JS writes JavaScript to writer.

func (Property) JSON

func (n Property) JSON(w io.Writer) error

JSON writes JSON to writer.

func (Property) String

func (n Property) String() string

type PropertyName

type PropertyName struct {
	Literal  LiteralExpr
	Computed IExpr // can be nil
}

PropertyName is a property name for binding properties, method names, and in object literals.

func (PropertyName) IsComputed

func (n PropertyName) IsComputed() bool

IsComputed returns true if PropertyName is computed.

func (PropertyName) IsIdent

func (n PropertyName) IsIdent(data []byte) bool

IsIdent returns true if PropertyName equals the given identifier name.

func (PropertyName) IsSet

func (n PropertyName) IsSet() bool

IsSet returns true is PropertyName is not nil.

func (PropertyName) JS

func (n PropertyName) JS(w io.Writer)

JS writes JavaScript to writer.

func (PropertyName) String

func (n PropertyName) String() string

type ReturnStmt

type ReturnStmt struct {
	Value IExpr // can be nil
}

ReturnStmt is a return statement.

func (ReturnStmt) JS

func (n ReturnStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (ReturnStmt) String

func (n ReturnStmt) String() string

type Scope

type Scope struct {
	Parent, Func   *Scope   // Parent is nil for global scope
	Declared       VarArray // Link in Var are always nil
	Undeclared     VarArray
	VarDecls       []*VarDecl
	NumForDecls    uint16 // offset into Declared to mark variables used in for statements
	NumFuncArgs    uint16 // offset into Declared to mark variables used in function arguments
	NumArgUses     uint16 // offset into Undeclared to mark variables used in arguments
	IsGlobalOrFunc bool
	HasWith        bool
}

Scope is a function or block scope with a list of variables declared and used.

func (*Scope) AddUndeclared

func (s *Scope) AddUndeclared(v *Var)

add undeclared variable to scope, this is called for the block scope when declaring a var in it

func (*Scope) Declare

func (s *Scope) Declare(decl DeclType, name []byte) (*Var, bool)

Declare declares a new variable.

func (*Scope) HoistUndeclared

func (s *Scope) HoistUndeclared()

HoistUndeclared copies all undeclared variables of the current scope to the parent scope.

func (*Scope) MarkForStmt

func (s *Scope) MarkForStmt()

MarkForStmt marks the declared variables in current scope as for statement initializer to distinguish from declarations in body.

func (*Scope) MarkFuncArgs

func (s *Scope) MarkFuncArgs()

MarkFuncArgs marks the declared/undeclared variables in the current scope as function arguments.

func (Scope) String

func (s Scope) String() string

func (*Scope) UndeclareScope

func (s *Scope) UndeclareScope()

UndeclareScope undeclares all declared variables in the current scope and adds them to the parent scope. Called when possible arrow func ends up being a parenthesized expression, scope is not further used.

func (*Scope) Unscope

func (s *Scope) Unscope()

Unscope moves all declared variables of the current scope to the parent scope. Undeclared variables are already in the parent scope.

func (*Scope) Use

func (s *Scope) Use(name []byte) *Var

Use increments the usage of a variable.

type SwitchStmt

type SwitchStmt struct {
	Init IExpr
	List []CaseClause
	Scope
}

SwitchStmt is a switch statement.

func (SwitchStmt) JS

func (n SwitchStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (SwitchStmt) String

func (n SwitchStmt) String() string

type TemplateExpr

type TemplateExpr struct {
	Tag      IExpr // can be nil
	List     []TemplatePart
	Tail     []byte
	Prec     OpPrec
	Optional bool
}

TemplateExpr is a template literal or member/call expression, super property, or optional chain with template literal.

func (TemplateExpr) JS

func (n TemplateExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (TemplateExpr) JSON

func (n TemplateExpr) JSON(w io.Writer) error

JSON writes JSON to writer.

func (TemplateExpr) String

func (n TemplateExpr) String() string

type TemplatePart

type TemplatePart struct {
	Value []byte
	Expr  IExpr
}

TemplatePart is a template head or middle.

func (TemplatePart) JS

func (n TemplatePart) JS(w io.Writer)

JS writes JavaScript to writer.

func (TemplatePart) String

func (n TemplatePart) String() string

type ThrowStmt

type ThrowStmt struct {
	Value IExpr
}

ThrowStmt is a throw statement.

func (ThrowStmt) JS

func (n ThrowStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (ThrowStmt) String

func (n ThrowStmt) String() string

type TokenType

type TokenType uint16 // from LSB to MSB: 8 bits for tokens per category, 1 bit for numeric, 1 bit for punctuator, 1 bit for operator, 1 bit for identifier, 4 bits unused

TokenType determines the type of token, eg. a number or a semicolon.

const (
	ErrorToken TokenType = iota // extra token when errors occur
	WhitespaceToken
	LineTerminatorToken // \r \n \r\n
	CommentToken
	CommentLineTerminatorToken
	StringToken
	TemplateToken
	TemplateStartToken
	TemplateMiddleToken
	TemplateEndToken
	RegExpToken
	PrivateIdentifierToken
)

TokenType values.

const (
	NumericToken TokenType = 0x0100 + iota
	DecimalToken
	BinaryToken
	OctalToken
	HexadecimalToken
	IntegerToken
)

Numeric token values.

const (
	PunctuatorToken   TokenType = 0x0200 + iota
	OpenBraceToken              // {
	CloseBraceToken             // }
	OpenParenToken              // (
	CloseParenToken             // )
	OpenBracketToken            // [
	CloseBracketToken           // ]
	DotToken                    // .
	SemicolonToken              // ;
	CommaToken                  // ,
	QuestionToken               // ?
	ColonToken                  // :
	ArrowToken                  // =>
	EllipsisToken               // ...
)

Punctuator token values.

const (
	OperatorToken  TokenType = 0x0600 + iota
	EqToken                  // =
	EqEqToken                // ==
	EqEqEqToken              // ===
	NotToken                 // !
	NotEqToken               // !=
	NotEqEqToken             // !==
	LtToken                  // <
	LtEqToken                // <=
	LtLtToken                // <<
	LtLtEqToken              // <<=
	GtToken                  // >
	GtEqToken                // >=
	GtGtToken                // >>
	GtGtEqToken              // >>=
	GtGtGtToken              // >>>
	GtGtGtEqToken            // >>>=
	AddToken                 // +
	AddEqToken               // +=
	IncrToken                // ++
	SubToken                 // -
	SubEqToken               // -=
	DecrToken                // --
	MulToken                 // *
	MulEqToken               // *=
	ExpToken                 // **
	ExpEqToken               // **=
	DivToken                 // /
	DivEqToken               // /=
	ModToken                 // %
	ModEqToken               // %=
	BitAndToken              // &
	BitOrToken               // |
	BitXorToken              // ^
	BitNotToken              // ~
	BitAndEqToken            // &=
	BitOrEqToken             // |=
	BitXorEqToken            // ^=
	AndToken                 // &&
	OrToken                  // ||
	NullishToken             // ??
	AndEqToken               // &&=
	OrEqToken                // ||=
	NullishEqToken           // ??=
	OptChainToken            // ?.

	// unused in lexer
	PosToken      // +a
	NegToken      // -a
	PreIncrToken  // ++a
	PreDecrToken  // --a
	PostIncrToken // a++
	PostDecrToken // a--
)

Operator token values.

const (
	ReservedToken TokenType = 0x0800 + iota
	AwaitToken
	BreakToken
	CaseToken
	CatchToken
	ClassToken
	ConstToken
	ContinueToken
	DebuggerToken
	DefaultToken
	DeleteToken
	DoToken
	ElseToken
	EnumToken
	ExportToken
	ExtendsToken
	FalseToken
	FinallyToken
	ForToken
	FunctionToken
	IfToken
	ImportToken
	InToken
	InstanceofToken
	NewToken
	NullToken
	ReturnToken
	SuperToken
	SwitchToken
	ThisToken
	ThrowToken
	TrueToken
	TryToken
	TypeofToken
	YieldToken
	VarToken
	VoidToken
	WhileToken
	WithToken
)

Reserved token values.

const (
	IdentifierToken TokenType = 0x1000 + iota
	AsToken
	AsyncToken
	FromToken
	GetToken
	ImplementsToken
	InterfaceToken
	LetToken
	MetaToken
	OfToken
	PackageToken
	PrivateToken
	ProtectedToken
	PublicToken
	SetToken
	StaticToken
	TargetToken
)

Identifier token values.

func (TokenType) Bytes

func (tt TokenType) Bytes() []byte

Bytes returns the string representation of a TokenType.

func (TokenType) String

func (tt TokenType) String() string

type TryStmt

type TryStmt struct {
	Body    *BlockStmt
	Binding IBinding   // can be nil
	Catch   *BlockStmt // can be nil
	Finally *BlockStmt // can be nil
}

TryStmt is a try statement.

func (TryStmt) JS

func (n TryStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (TryStmt) String

func (n TryStmt) String() string

type UnaryExpr

type UnaryExpr struct {
	Op TokenType
	X  IExpr
}

UnaryExpr is an update or unary expression.

func (UnaryExpr) JS

func (n UnaryExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (UnaryExpr) JSON

func (n UnaryExpr) JSON(w io.Writer) error

JSON writes JSON to writer.

func (UnaryExpr) String

func (n UnaryExpr) String() string

type Var

type Var struct {
	Data []byte
	Link *Var // is set when merging variable uses, as in:  {a} {var a}  where the first links to the second, only used for undeclared variables
	Uses uint16
	Decl DeclType
}

Var is a variable, where Decl is the type of declaration and can be var|function for function scoped variables, let|const|class for block scoped variables.

func (*Var) Info

func (v *Var) Info() string

func (Var) JS

func (v Var) JS(w io.Writer)

JS writes JavaScript to writer.

func (*Var) Name

func (v *Var) Name() []byte

Name returns the variable name.

func (Var) String

func (v Var) String() string

type VarArray

type VarArray []*Var

VarArray is a set of variables in scopes.

func (VarArray) String

func (vs VarArray) String() string

type VarDecl

type VarDecl struct {
	TokenType
	List             []BindingElement
	Scope            *Scope
	InFor, InForInOf bool
}

VarDecl is a variable statement or lexical declaration.

func (VarDecl) JS

func (n VarDecl) JS(w io.Writer)

JS writes JavaScript to writer.

func (VarDecl) String

func (n VarDecl) String() string

type VarsByUses

type VarsByUses VarArray

VarsByUses is sortable by uses in descending order.

func (VarsByUses) Len

func (vs VarsByUses) Len() int

func (VarsByUses) Less

func (vs VarsByUses) Less(i, j int) bool

func (VarsByUses) Swap

func (vs VarsByUses) Swap(i, j int)

type WhileStmt

type WhileStmt struct {
	Cond IExpr
	Body IStmt
}

WhileStmt is a while iteration statement.

func (WhileStmt) JS

func (n WhileStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (WhileStmt) String

func (n WhileStmt) String() string

type WithStmt

type WithStmt struct {
	Cond IExpr
	Body IStmt
}

WithStmt is a with statement.

func (WithStmt) JS

func (n WithStmt) JS(w io.Writer)

JS writes JavaScript to writer.

func (WithStmt) String

func (n WithStmt) String() string

type YieldExpr

type YieldExpr struct {
	Generator bool
	X         IExpr // can be nil
}

YieldExpr is a yield expression.

func (YieldExpr) JS

func (n YieldExpr) JS(w io.Writer)

JS writes JavaScript to writer.

func (YieldExpr) String

func (n YieldExpr) String() string

Source Files

ast.go lex.go parse.go table.go tokentype.go util.go walk.go

Version
v2.7.20 (latest)
Published
Jan 28, 2025
Platform
linux/amd64
Imports
10 packages
Last checked
1 day ago

Tools for package owners.