rum-goggles/v1/vendor/github.com/robertkrimen/otto/ast/node.go
2024-04-04 10:46:14 -04:00

969 lines
20 KiB
Go

// Package ast declares types representing a JavaScript AST.
//
// # Warning
// The parser and AST interfaces are still works-in-progress (particularly where
// node types are concerned) and may change in the future.
package ast
import (
"github.com/robertkrimen/otto/file"
"github.com/robertkrimen/otto/token"
)
// Node is implemented by types that represent a node.
type Node interface {
Idx0() file.Idx // The index of the first character belonging to the node
Idx1() file.Idx // The index of the first character immediately after the node
}
// Expression is implemented by types that represent an Expression.
type Expression interface {
Node
expression()
}
// ArrayLiteral represents an array literal.
type ArrayLiteral struct {
LeftBracket file.Idx
RightBracket file.Idx
Value []Expression
}
// Idx0 implements Node.
func (al *ArrayLiteral) Idx0() file.Idx {
return al.LeftBracket
}
// Idx1 implements Node.
func (al *ArrayLiteral) Idx1() file.Idx {
return al.RightBracket + 1
}
// expression implements Expression.
func (*ArrayLiteral) expression() {}
// AssignExpression represents an assignment expression.
type AssignExpression struct {
Operator token.Token
Left Expression
Right Expression
}
// Idx0 implements Node.
func (ae *AssignExpression) Idx0() file.Idx {
return ae.Left.Idx0()
}
// Idx1 implements Node.
func (ae *AssignExpression) Idx1() file.Idx {
return ae.Right.Idx1()
}
// expression implements Expression.
func (*AssignExpression) expression() {}
// BadExpression represents a bad expression.
type BadExpression struct {
From file.Idx
To file.Idx
}
// Idx0 implements Node.
func (be *BadExpression) Idx0() file.Idx {
return be.From
}
// Idx1 implements Node.
func (be *BadExpression) Idx1() file.Idx {
return be.To
}
// expression implements Expression.
func (*BadExpression) expression() {}
// BinaryExpression represents a binary expression.
type BinaryExpression struct {
Operator token.Token
Left Expression
Right Expression
Comparison bool
}
// Idx0 implements Node.
func (be *BinaryExpression) Idx0() file.Idx {
return be.Left.Idx0()
}
// Idx1 implements Node.
func (be *BinaryExpression) Idx1() file.Idx {
return be.Right.Idx1()
}
// expression implements Expression.
func (*BinaryExpression) expression() {}
// BooleanLiteral represents a boolean expression.
type BooleanLiteral struct {
Idx file.Idx
Literal string
Value bool
}
// Idx0 implements Node.
func (bl *BooleanLiteral) Idx0() file.Idx {
return bl.Idx
}
// Idx1 implements Node.
func (bl *BooleanLiteral) Idx1() file.Idx {
return file.Idx(int(bl.Idx) + len(bl.Literal))
}
// expression implements Expression.
func (*BooleanLiteral) expression() {}
// BracketExpression represents a bracketed expression.
type BracketExpression struct {
Left Expression
Member Expression
LeftBracket file.Idx
RightBracket file.Idx
}
// Idx0 implements Node.
func (be *BracketExpression) Idx0() file.Idx {
return be.Left.Idx0()
}
// Idx1 implements Node.
func (be *BracketExpression) Idx1() file.Idx {
return be.RightBracket + 1
}
// expression implements Expression.
func (*BracketExpression) expression() {}
// CallExpression represents a call expression.
type CallExpression struct {
Callee Expression
LeftParenthesis file.Idx
ArgumentList []Expression
RightParenthesis file.Idx
}
// Idx0 implements Node.
func (ce *CallExpression) Idx0() file.Idx {
return ce.Callee.Idx0()
}
// Idx1 implements Node.
func (ce *CallExpression) Idx1() file.Idx {
return ce.RightParenthesis + 1
}
// expression implements Expression.
func (*CallExpression) expression() {}
// ConditionalExpression represents a conditional expression.
type ConditionalExpression struct {
Test Expression
Consequent Expression
Alternate Expression
}
// Idx0 implements Node.
func (ce *ConditionalExpression) Idx0() file.Idx {
return ce.Test.Idx0()
}
// Idx1 implements Node.
func (ce *ConditionalExpression) Idx1() file.Idx {
return ce.Alternate.Idx1()
}
// expression implements Expression.
func (*ConditionalExpression) expression() {}
// DotExpression represents a dot expression.
type DotExpression struct {
Left Expression
Identifier *Identifier
}
// Idx0 implements Node.
func (de *DotExpression) Idx0() file.Idx {
return de.Left.Idx0()
}
// Idx1 implements Node.
func (de *DotExpression) Idx1() file.Idx {
return de.Identifier.Idx1()
}
// expression implements Expression.
func (*DotExpression) expression() {}
// EmptyExpression represents an empty expression.
type EmptyExpression struct {
Begin file.Idx
End file.Idx
}
// Idx0 implements Node.
func (ee *EmptyExpression) Idx0() file.Idx {
return ee.Begin
}
// Idx1 implements Node.
func (ee *EmptyExpression) Idx1() file.Idx {
return ee.End
}
// expression implements Expression.
func (*EmptyExpression) expression() {}
// FunctionLiteral represents a function literal.
type FunctionLiteral struct {
Function file.Idx
Name *Identifier
ParameterList *ParameterList
Body Statement
Source string
DeclarationList []Declaration
}
// Idx0 implements Node.
func (fl *FunctionLiteral) Idx0() file.Idx {
return fl.Function
}
// Idx1 implements Node.
func (fl *FunctionLiteral) Idx1() file.Idx {
return fl.Body.Idx1()
}
// expression implements Expression.
func (*FunctionLiteral) expression() {}
// Identifier represents an identifier.
type Identifier struct {
Name string
Idx file.Idx
}
// Idx0 implements Node.
func (i *Identifier) Idx0() file.Idx {
return i.Idx
}
// Idx1 implements Node.
func (i *Identifier) Idx1() file.Idx {
return file.Idx(int(i.Idx) + len(i.Name))
}
// expression implements Expression.
func (*Identifier) expression() {}
// NewExpression represents a new expression.
type NewExpression struct {
New file.Idx
Callee Expression
LeftParenthesis file.Idx
ArgumentList []Expression
RightParenthesis file.Idx
}
// Idx0 implements Node.
func (ne *NewExpression) Idx0() file.Idx {
return ne.New
}
// Idx1 implements Node.
func (ne *NewExpression) Idx1() file.Idx {
if ne.RightParenthesis > 0 {
return ne.RightParenthesis + 1
}
return ne.Callee.Idx1()
}
// expression implements Expression.
func (*NewExpression) expression() {}
// NullLiteral represents a null literal.
type NullLiteral struct {
Idx file.Idx
Literal string
}
// Idx0 implements Node.
func (nl *NullLiteral) Idx0() file.Idx {
return nl.Idx
}
// Idx1 implements Node.
func (nl *NullLiteral) Idx1() file.Idx {
return file.Idx(int(nl.Idx) + 4)
}
// expression implements Expression.
func (*NullLiteral) expression() {}
// NumberLiteral represents a number literal.
type NumberLiteral struct {
Idx file.Idx
Literal string
Value interface{}
}
// Idx0 implements Node.
func (nl *NumberLiteral) Idx0() file.Idx {
return nl.Idx
}
// Idx1 implements Node.
func (nl *NumberLiteral) Idx1() file.Idx {
return file.Idx(int(nl.Idx) + len(nl.Literal))
}
// expression implements Expression.
func (*NumberLiteral) expression() {}
// ObjectLiteral represents an object literal.
type ObjectLiteral struct {
LeftBrace file.Idx
RightBrace file.Idx
Value []Property
}
// Idx0 implements Node.
func (ol *ObjectLiteral) Idx0() file.Idx {
return ol.LeftBrace
}
// Idx1 implements Node.
func (ol *ObjectLiteral) Idx1() file.Idx {
return ol.RightBrace + 1
}
// expression implements Expression.
func (*ObjectLiteral) expression() {}
// ParameterList represents a parameter list.
type ParameterList struct {
Opening file.Idx
List []*Identifier
Closing file.Idx
}
// Property represents a property.
type Property struct {
Key string
Kind string
Value Expression
}
// RegExpLiteral represents a regular expression literal.
type RegExpLiteral struct {
Idx file.Idx
Literal string
Pattern string
Flags string
Value string
}
// Idx0 implements Node.
func (rl *RegExpLiteral) Idx0() file.Idx {
return rl.Idx
}
// Idx1 implements Node.
func (rl *RegExpLiteral) Idx1() file.Idx {
return file.Idx(int(rl.Idx) + len(rl.Literal))
}
// expression implements Expression.
func (*RegExpLiteral) expression() {}
// SequenceExpression represents a sequence literal.
type SequenceExpression struct {
Sequence []Expression
}
// Idx0 implements Node.
func (se *SequenceExpression) Idx0() file.Idx {
return se.Sequence[0].Idx0()
}
// Idx1 implements Node.
func (se *SequenceExpression) Idx1() file.Idx {
return se.Sequence[len(se.Sequence)-1].Idx1()
}
// expression implements Expression.
func (*SequenceExpression) expression() {}
// StringLiteral represents a string literal.
type StringLiteral struct {
Idx file.Idx
Literal string
Value string
}
// Idx0 implements Node.
func (sl *StringLiteral) Idx0() file.Idx {
return sl.Idx
}
// Idx1 implements Node.
func (sl *StringLiteral) Idx1() file.Idx {
return file.Idx(int(sl.Idx) + len(sl.Literal))
}
// expression implements Expression.
func (*StringLiteral) expression() {}
// ThisExpression represents a this expression.
type ThisExpression struct {
Idx file.Idx
}
// Idx0 implements Node.
func (te *ThisExpression) Idx0() file.Idx {
return te.Idx
}
// Idx1 implements Node.
func (te *ThisExpression) Idx1() file.Idx {
return te.Idx + 4
}
// expression implements Expression.
func (*ThisExpression) expression() {}
// UnaryExpression represents a unary expression.
type UnaryExpression struct {
Operator token.Token
Idx file.Idx // If a prefix operation
Operand Expression
Postfix bool
}
// Idx0 implements Node.
func (ue *UnaryExpression) Idx0() file.Idx {
if ue.Postfix {
return ue.Operand.Idx0()
}
return ue.Idx
}
// Idx1 implements Node.
func (ue *UnaryExpression) Idx1() file.Idx {
if ue.Postfix {
return ue.Operand.Idx1() + 2 // ++ --
}
return ue.Operand.Idx1()
}
// expression implements Expression.
func (*UnaryExpression) expression() {}
// VariableExpression represents a variable expression.
type VariableExpression struct {
Name string
Idx file.Idx
Initializer Expression
}
// Idx0 implements Node.
func (ve *VariableExpression) Idx0() file.Idx {
return ve.Idx
}
// Idx1 implements Node.
func (ve *VariableExpression) Idx1() file.Idx {
if ve.Initializer == nil {
return file.Idx(int(ve.Idx) + len(ve.Name))
}
return ve.Initializer.Idx1()
}
// expression implements Expression.
func (*VariableExpression) expression() {}
// Statement is implemented by types which represent a statement.
type Statement interface {
Node
statement()
}
// BadStatement represents a bad statement.
type BadStatement struct {
From file.Idx
To file.Idx
}
// Idx0 implements Node.
func (bs *BadStatement) Idx0() file.Idx {
return bs.From
}
// Idx1 implements Node.
func (bs *BadStatement) Idx1() file.Idx {
return bs.To
}
// expression implements Statement.
func (*BadStatement) statement() {}
// BlockStatement represents a block statement.
type BlockStatement struct {
LeftBrace file.Idx
List []Statement
RightBrace file.Idx
}
// Idx0 implements Node.
func (bs *BlockStatement) Idx0() file.Idx {
return bs.LeftBrace
}
// Idx1 implements Node.
func (bs *BlockStatement) Idx1() file.Idx {
return bs.RightBrace + 1
}
// expression implements Statement.
func (*BlockStatement) statement() {}
// BranchStatement represents a branch statement.
type BranchStatement struct {
Idx file.Idx
Token token.Token
Label *Identifier
}
// Idx0 implements Node.
func (bs *BranchStatement) Idx0() file.Idx {
return bs.Idx
}
// Idx1 implements Node.
func (bs *BranchStatement) Idx1() file.Idx {
if bs.Label == nil {
return file.Idx(int(bs.Idx) + len(bs.Token.String()))
}
return bs.Label.Idx1()
}
// expression implements Statement.
func (*BranchStatement) statement() {}
// CaseStatement represents a case statement.
type CaseStatement struct {
Case file.Idx
Test Expression
Consequent []Statement
}
// Idx0 implements Node.
func (cs *CaseStatement) Idx0() file.Idx {
return cs.Case
}
// Idx1 implements Node.
func (cs *CaseStatement) Idx1() file.Idx {
return cs.Consequent[len(cs.Consequent)-1].Idx1()
}
// expression implements Statement.
func (*CaseStatement) statement() {}
// CatchStatement represents a catch statement.
type CatchStatement struct {
Catch file.Idx
Parameter *Identifier
Body Statement
}
// Idx0 implements Node.
func (cs *CatchStatement) Idx0() file.Idx {
return cs.Catch
}
// Idx1 implements Node.
func (cs *CatchStatement) Idx1() file.Idx {
return cs.Body.Idx1()
}
// expression implements Statement.
func (*CatchStatement) statement() {}
// DebuggerStatement represents a debugger statement.
type DebuggerStatement struct {
Debugger file.Idx
}
// Idx0 implements Node.
func (ds *DebuggerStatement) Idx0() file.Idx {
return ds.Debugger
}
// Idx1 implements Node.
func (ds *DebuggerStatement) Idx1() file.Idx {
return ds.Debugger + 8
}
// expression implements Statement.
func (*DebuggerStatement) statement() {}
// DoWhileStatement represents a do while statement.
type DoWhileStatement struct {
Do file.Idx
Test Expression
Body Statement
RightParenthesis file.Idx
}
// Idx0 implements Node.
func (dws *DoWhileStatement) Idx0() file.Idx {
return dws.Do
}
// Idx1 implements Node.
func (dws *DoWhileStatement) Idx1() file.Idx {
return dws.RightParenthesis + 1
}
// expression implements Statement.
func (*DoWhileStatement) statement() {}
// EmptyStatement represents a empty statement.
type EmptyStatement struct {
Semicolon file.Idx
}
// Idx0 implements Node.
func (es *EmptyStatement) Idx0() file.Idx {
return es.Semicolon
}
// Idx1 implements Node.
func (es *EmptyStatement) Idx1() file.Idx {
return es.Semicolon + 1
}
// expression implements Statement.
func (*EmptyStatement) statement() {}
// ExpressionStatement represents a expression statement.
type ExpressionStatement struct {
Expression Expression
}
// Idx0 implements Node.
func (es *ExpressionStatement) Idx0() file.Idx {
return es.Expression.Idx0()
}
// Idx1 implements Node.
func (es *ExpressionStatement) Idx1() file.Idx {
return es.Expression.Idx1()
}
// expression implements Statement.
func (*ExpressionStatement) statement() {}
// ForInStatement represents a for in statement.
type ForInStatement struct {
For file.Idx
Into Expression
Source Expression
Body Statement
}
// Idx0 implements Node.
func (fis *ForInStatement) Idx0() file.Idx {
return fis.For
}
// Idx1 implements Node.
func (fis *ForInStatement) Idx1() file.Idx {
return fis.Body.Idx1()
}
// expression implements Statement.
func (*ForInStatement) statement() {}
// ForStatement represents a for statement.
type ForStatement struct {
For file.Idx
Initializer Expression
Update Expression
Test Expression
Body Statement
}
// Idx0 implements Node.
func (fs *ForStatement) Idx0() file.Idx {
return fs.For
}
// Idx1 implements Node.
func (fs *ForStatement) Idx1() file.Idx {
return fs.Body.Idx1()
}
// expression implements Statement.
func (*ForStatement) statement() {}
// FunctionStatement represents a function statement.
type FunctionStatement struct {
Function *FunctionLiteral
}
// Idx0 implements Node.
func (fs *FunctionStatement) Idx0() file.Idx {
return fs.Function.Idx0()
}
// Idx1 implements Node.
func (fs *FunctionStatement) Idx1() file.Idx {
return fs.Function.Idx1()
}
// expression implements Statement.
func (*FunctionStatement) statement() {}
// IfStatement represents a if statement.
type IfStatement struct {
If file.Idx
Test Expression
Consequent Statement
Alternate Statement
}
// Idx0 implements Node.
func (is *IfStatement) Idx0() file.Idx {
return is.If
}
// Idx1 implements Node.
func (is *IfStatement) Idx1() file.Idx {
if is.Alternate != nil {
return is.Alternate.Idx1()
}
return is.Consequent.Idx1()
}
// expression implements Statement.
func (*IfStatement) statement() {}
// LabelledStatement represents a labelled statement.
type LabelledStatement struct {
Label *Identifier
Colon file.Idx
Statement Statement
}
// Idx0 implements Node.
func (ls *LabelledStatement) Idx0() file.Idx {
return ls.Label.Idx0()
}
// Idx1 implements Node.
func (ls *LabelledStatement) Idx1() file.Idx {
return ls.Statement.Idx1()
}
// expression implements Statement.
func (*LabelledStatement) statement() {}
// ReturnStatement represents a return statement.
type ReturnStatement struct {
Return file.Idx
Argument Expression
}
// Idx0 implements Node.
func (rs *ReturnStatement) Idx0() file.Idx {
return rs.Return
}
// Idx1 implements Node.
func (rs *ReturnStatement) Idx1() file.Idx {
if rs.Argument != nil {
return rs.Argument.Idx1()
}
return rs.Return + 6
}
// expression implements Statement.
func (*ReturnStatement) statement() {}
// SwitchStatement represents a switch statement.
type SwitchStatement struct {
Switch file.Idx
Discriminant Expression
Default int
Body []*CaseStatement
RightBrace file.Idx
}
// Idx0 implements Node.
func (ss *SwitchStatement) Idx0() file.Idx {
return ss.Switch
}
// Idx1 implements Node.
func (ss *SwitchStatement) Idx1() file.Idx {
return ss.RightBrace + 1
}
// expression implements Statement.
func (*SwitchStatement) statement() {}
// ThrowStatement represents a throw statement.
type ThrowStatement struct {
Throw file.Idx
Argument Expression
}
// Idx0 implements Node.
func (ts *ThrowStatement) Idx0() file.Idx {
return ts.Throw
}
// Idx1 implements Node.
func (ts *ThrowStatement) Idx1() file.Idx {
return ts.Argument.Idx1()
}
// expression implements Statement.
func (*ThrowStatement) statement() {}
// TryStatement represents a try statement.
type TryStatement struct {
Try file.Idx
Body Statement
Catch *CatchStatement
Finally Statement
}
// Idx0 implements Node.
func (ts *TryStatement) Idx0() file.Idx {
return ts.Try
}
// Idx1 implements Node.
func (ts *TryStatement) Idx1() file.Idx {
if ts.Finally != nil {
return ts.Finally.Idx1()
}
return ts.Catch.Idx1()
}
// expression implements Statement.
func (*TryStatement) statement() {}
// VariableStatement represents a variable statement.
type VariableStatement struct {
Var file.Idx
List []Expression
}
// Idx0 implements Node.
func (vs *VariableStatement) Idx0() file.Idx {
return vs.Var
}
// Idx1 implements Node.
func (vs *VariableStatement) Idx1() file.Idx {
return vs.List[len(vs.List)-1].Idx1()
}
// expression implements Statement.
func (*VariableStatement) statement() {}
// WhileStatement represents a while statement.
type WhileStatement struct {
While file.Idx
Test Expression
Body Statement
}
// Idx0 implements Node.
func (ws *WhileStatement) Idx0() file.Idx {
return ws.While
}
// Idx1 implements Node.
func (ws *WhileStatement) Idx1() file.Idx {
return ws.Body.Idx1()
}
// expression implements Statement.
func (*WhileStatement) statement() {}
// WithStatement represents a with statement.
type WithStatement struct {
With file.Idx
Object Expression
Body Statement
}
// Idx0 implements Node.
func (ws *WithStatement) Idx0() file.Idx {
return ws.With
}
// Idx1 implements Node.
func (ws *WithStatement) Idx1() file.Idx {
return ws.Body.Idx1()
}
// expression implements Statement.
func (*WithStatement) statement() {}
// Declaration is implemented by type which represent declarations.
type Declaration interface {
declaration()
}
// FunctionDeclaration represents a function declaration.
type FunctionDeclaration struct {
Function *FunctionLiteral
}
func (*FunctionDeclaration) declaration() {}
// VariableDeclaration represents a variable declaration.
type VariableDeclaration struct {
Var file.Idx
List []*VariableExpression
}
// declaration implements Declaration.
func (*VariableDeclaration) declaration() {}
// Program represents a full program.
type Program struct {
Body []Statement
DeclarationList []Declaration
File *file.File
Comments CommentMap
}
// Idx0 implements Node.
func (p *Program) Idx0() file.Idx {
return p.Body[0].Idx0()
}
// Idx1 implements Node.
func (p *Program) Idx1() file.Idx {
return p.Body[len(p.Body)-1].Idx1()
}