mirror of https://github.com/t1meshift/js.git
670 lines
19 KiB
Python
670 lines
19 KiB
Python
"""The module of AST nodes for expressions."""
|
|
|
|
from typing import List, Literal as TypeLiteral
|
|
|
|
from . import *
|
|
from .functions import Function
|
|
from .identifiers import Identifier
|
|
from .literals import Literal
|
|
from .operator_enums import (
|
|
UnaryOperator,
|
|
UpdateOperator,
|
|
BinaryOperator,
|
|
AssignmentOperator,
|
|
LogicalOperator,
|
|
)
|
|
from .patterns import Pattern
|
|
from .statements import FunctionBody
|
|
|
|
|
|
class Expression(Node):
|
|
"""Any expression node. Since the left-hand side of an assignment may be any expression in general, an expression
|
|
can also be a pattern.
|
|
|
|
See Also:
|
|
Pattern
|
|
"""
|
|
|
|
def __init__(self, node_type: str, loc: Optional[SourceLocation]):
|
|
super().__init__(node_type, loc)
|
|
|
|
|
|
class ThisExpression(Expression):
|
|
"""A `this` expression."""
|
|
|
|
def __init__(self, loc: Optional[SourceLocation]):
|
|
super().__init__("ThisExpression", loc)
|
|
|
|
|
|
class ArrayExpression(Expression):
|
|
"""An array expression. An element might be `None` if it represents a hole in a sparse array. E.g. ``[1,,2]``."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], elements: List[Optional[Expression]]
|
|
):
|
|
super().__init__("ArrayExpression", loc)
|
|
self.elements = elements
|
|
|
|
|
|
PropKind = TypeLiteral["init", "get", "set"]
|
|
"""A type for a `kind` field of `Property`."""
|
|
|
|
|
|
class Property(Node):
|
|
"""A literal property in an object expression can have either a string or number as its `value`. Ordinary
|
|
property initializers have a `kind` value ``"init"``; getters and setters have the kind values ``"get"`` and
|
|
``"set"``, respectively. """
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
key: Union[Literal, Identifier],
|
|
value: Expression,
|
|
kind: PropKind,
|
|
):
|
|
super().__init__("Property", loc)
|
|
self.key = key
|
|
self.value = value
|
|
self.kind = kind
|
|
|
|
|
|
class ObjectExpression(Expression):
|
|
"""An object expression."""
|
|
|
|
def __init__(self, loc: Optional[SourceLocation], properties: List[Property]):
|
|
super().__init__("ObjectExpression", loc)
|
|
self.properties = properties
|
|
|
|
|
|
class FunctionExpression(Function, Expression):
|
|
"""A function expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
function_id: Optional[Identifier],
|
|
params: List[Pattern],
|
|
body: FunctionBody,
|
|
):
|
|
super().__init__("FunctionExpression", loc, function_id, params, body)
|
|
|
|
|
|
class UnaryExpression(Expression):
|
|
"""A unary operator expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
operator: UnaryOperator,
|
|
prefix: bool,
|
|
argument: Expression,
|
|
):
|
|
super().__init__("UnaryExpression", loc)
|
|
self.operator = operator
|
|
self.prefix = prefix
|
|
self.argument = argument
|
|
|
|
|
|
class UpdateExpression(Expression):
|
|
"""An update (increment or decrement) operator expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
operator: UpdateOperator,
|
|
argument: Expression,
|
|
prefix: bool,
|
|
):
|
|
super().__init__("UpdateExpression", loc)
|
|
self.operator = operator
|
|
self.argument = argument
|
|
self.prefix = prefix
|
|
|
|
|
|
class BinaryExpression(Expression):
|
|
"""A binary operator expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
operator: BinaryOperator,
|
|
left: Expression,
|
|
right: Expression,
|
|
):
|
|
super().__init__("BinaryExpression", loc)
|
|
self.operator = operator
|
|
self.left = left
|
|
self.right = right
|
|
|
|
|
|
class AssignmentExpression(Expression):
|
|
"""An assignment operator expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
operator: AssignmentOperator,
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__("AssignmentExpression", loc)
|
|
self.operator = operator
|
|
self.left = left
|
|
self.right = right
|
|
|
|
|
|
class LogicalExpression(Expression):
|
|
"""A logical operator expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
operator: LogicalOperator,
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__("LogicalExpression", loc)
|
|
self.operator = operator
|
|
self.left = left
|
|
self.right = right
|
|
|
|
|
|
class UnaryMinusExpression(UnaryExpression):
|
|
"""A unary minus expression."""
|
|
|
|
def __init__(self, loc: Optional[SourceLocation], argument: Expression):
|
|
super().__init__(loc, UnaryOperator.MINUS, True, argument)
|
|
|
|
|
|
class UnaryPlusExpression(UnaryExpression):
|
|
"""A unary plus expression."""
|
|
|
|
def __init__(self, loc: Optional[SourceLocation], argument: Expression):
|
|
super().__init__(loc, UnaryOperator.PLUS, True, argument)
|
|
|
|
|
|
class UnaryLogicNotExpression(UnaryExpression):
|
|
"""A unary logic "not" expression."""
|
|
|
|
def __init__(self, loc: Optional[SourceLocation], argument: Expression):
|
|
super().__init__(loc, UnaryOperator.NOT_LOGIC, True, argument)
|
|
|
|
|
|
class UnaryBitNotExpression(UnaryExpression):
|
|
"""A unary bit "not" expression."""
|
|
|
|
def __init__(self, loc: Optional[SourceLocation], argument: Expression):
|
|
super().__init__(loc, UnaryOperator.NOT_BIT, True, argument)
|
|
|
|
|
|
class TypeofExpression(UnaryExpression):
|
|
"""A `typeof` expression."""
|
|
|
|
def __init__(self, loc: Optional[SourceLocation], argument: Expression):
|
|
super().__init__(loc, UnaryOperator.TYPEOF, True, argument)
|
|
|
|
|
|
class VoidExpression(UnaryExpression):
|
|
"""A `void` expression."""
|
|
|
|
def __init__(self, loc: Optional[SourceLocation], argument: Expression):
|
|
super().__init__(loc, UnaryOperator.VOID, True, argument)
|
|
|
|
|
|
class DeleteExpression(UnaryExpression):
|
|
"""A `delete` expression."""
|
|
|
|
def __init__(self, loc: Optional[SourceLocation], argument: Expression):
|
|
super().__init__(loc, UnaryOperator.DELETE, True, argument)
|
|
|
|
|
|
class PreIncrementExpression(UpdateExpression):
|
|
"""A pre-increment expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], argument: Expression,
|
|
):
|
|
super().__init__(loc, UpdateOperator.INCREMENT, argument, True)
|
|
|
|
|
|
class PostIncrementExpression(UpdateExpression):
|
|
"""A post-increment expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], argument: Expression,
|
|
):
|
|
super().__init__(loc, UpdateOperator.INCREMENT, argument, False)
|
|
|
|
|
|
class PreDecrementExpression(UpdateExpression):
|
|
"""A pre-decrement expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], argument: Expression,
|
|
):
|
|
super().__init__(loc, UpdateOperator.DECREMENT, argument, True)
|
|
|
|
|
|
class PostDecrementExpression(UpdateExpression):
|
|
"""A post-decrement expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], argument: Expression,
|
|
):
|
|
super().__init__(loc, UpdateOperator.DECREMENT, argument, False)
|
|
|
|
|
|
class EqualityExpression(BinaryExpression):
|
|
"""An equality expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.EQ, left, right)
|
|
|
|
|
|
class NotEqualityExpression(BinaryExpression):
|
|
"""A "not equality" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.NEQ, left, right)
|
|
|
|
|
|
class IdentityEqualityExpression(BinaryExpression):
|
|
"""An identity equality expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.EQ_IDENTITY, left, right)
|
|
|
|
|
|
class NotIdentityEqualityExpression(BinaryExpression):
|
|
"""A "not identity equality" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.NEQ_IDENTITY, left, right)
|
|
|
|
|
|
class LowerThanRelationExpression(BinaryExpression):
|
|
"""A "lower than" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.LT, left, right)
|
|
|
|
|
|
class LowerThanEqualRelationExpression(BinaryExpression):
|
|
"""A "lower than or equal" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.LTE, left, right)
|
|
|
|
|
|
class GreaterThanRelationExpression(BinaryExpression):
|
|
"""A "greater than" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.GT, left, right)
|
|
|
|
|
|
class GreaterThanEqualRelationExpression(BinaryExpression):
|
|
"""A "greater than or equal" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.GTE, left, right)
|
|
|
|
|
|
class LeftBitShiftExpression(BinaryExpression):
|
|
"""A "left bit shift" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.SHL, left, right)
|
|
|
|
|
|
class RightBitShiftExpression(BinaryExpression):
|
|
"""A "right bit shift" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.SHR, left, right)
|
|
|
|
|
|
class LogicRightBitShiftExpression(BinaryExpression):
|
|
"""A "logical right bit shift" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.SHR_LOGIC, left, right)
|
|
|
|
|
|
class AddArithmeticExpression(BinaryExpression):
|
|
"""An addition arithmetical expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.ADD, left, right)
|
|
|
|
|
|
class SubArithmeticExpression(BinaryExpression):
|
|
"""A subtraction arithmetical expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.SUB, left, right)
|
|
|
|
|
|
class MulArithmeticExpression(BinaryExpression):
|
|
"""A multiplication arithmetical expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.MUL, left, right)
|
|
|
|
|
|
class DivArithmeticExpression(BinaryExpression):
|
|
"""A division arithmetical expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.DIV, left, right)
|
|
|
|
|
|
class ModArithmeticExpression(BinaryExpression):
|
|
"""A modulo arithmetical expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.MOD, left, right)
|
|
|
|
|
|
class OrBitExpression(BinaryExpression):
|
|
"""An "or" bit expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.OR, left, right)
|
|
|
|
|
|
class XorBitExpression(BinaryExpression):
|
|
"""A "xor" bit expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.XOR, left, right)
|
|
|
|
|
|
class AndBitExpression(BinaryExpression):
|
|
"""An "and" bit expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.AND, left, right)
|
|
|
|
|
|
class InExpression(BinaryExpression):
|
|
"""An "in" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.IN, left, right)
|
|
|
|
|
|
class InstanceofExpression(BinaryExpression):
|
|
"""An "instanceof" expression."""
|
|
|
|
def __init__(
|
|
self, loc: Optional[SourceLocation], left: Expression, right: Expression
|
|
):
|
|
super().__init__(loc, BinaryOperator.INSTANCEOF, left, right)
|
|
|
|
|
|
class SimpleAssignExpression(AssignmentExpression):
|
|
"""An assignment done with operator ``=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.ASSIGN, left, right)
|
|
|
|
|
|
class AddAssignExpression(AssignmentExpression):
|
|
"""An addition assignment done with operator ``+=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.ADD, left, right)
|
|
|
|
|
|
class SubAssignExpression(AssignmentExpression):
|
|
"""A subtraction assignment done with operator ``-=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.SUB, left, right)
|
|
|
|
|
|
class MulAssignExpression(AssignmentExpression):
|
|
"""A multiplication assignment done with operator ``*=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.MUL, left, right)
|
|
|
|
|
|
class ModAssignExpression(AssignmentExpression):
|
|
"""A modulo assignment done with operator ``%=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.MOD, left, right)
|
|
|
|
|
|
class ShlAssignExpression(AssignmentExpression):
|
|
"""A left shift assignment done with operator ``<<=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.SHL, left, right)
|
|
|
|
|
|
class ShrAssignExpression(AssignmentExpression):
|
|
"""A right shift assignment done with operator ``>>=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.SHR, left, right)
|
|
|
|
|
|
class LogicShrAssignExpression(AssignmentExpression):
|
|
"""A logical right shift assignment done with operator ``>>>=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.SHR_LOGIC, left, right)
|
|
|
|
|
|
class OrAssignExpression(AssignmentExpression):
|
|
"""A "bit or" assignment done with operator ``|=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.OR, left, right)
|
|
|
|
|
|
class XorAssignExpression(AssignmentExpression):
|
|
"""A "bit xor" assignment done with operator ``^=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.XOR, left, right)
|
|
|
|
|
|
class AndAssignExpression(AssignmentExpression):
|
|
"""A "bit and" assignment done with operator ``&=`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, AssignmentOperator.AND, left, right)
|
|
|
|
|
|
class OrLogicExpression(LogicalExpression):
|
|
"""An "or" logical expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, LogicalOperator.OR, left, right)
|
|
|
|
|
|
class AndLogicExpression(LogicalExpression):
|
|
"""An "and" logical expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
left: Union[Pattern, Expression],
|
|
right: Expression,
|
|
):
|
|
super().__init__(loc, LogicalOperator.AND, left, right)
|
|
|
|
|
|
class MemberExpression(Expression, Pattern):
|
|
"""A member expression. If `computed` is ``True``, the node corresponds to a computed (``a[b]``) member
|
|
expression and `property` is an `Expression`. If `computed` is `False`, the node corresponds to a static
|
|
(``a.b``) member expression and `property` is an `Identifier`. """
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
member_object: Expression,
|
|
member_property: Expression,
|
|
computed: bool,
|
|
):
|
|
super().__init__("MemberExpression", loc)
|
|
self.object = member_object
|
|
self.property = member_property
|
|
self.computed = computed
|
|
|
|
|
|
class ConditionalExpression(Expression):
|
|
"""A conditional expression, i.e., a ternary ``?``/``:`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
test: Expression,
|
|
alternate: Expression,
|
|
consequent: Expression,
|
|
):
|
|
super().__init__("ConditionalExpression", loc)
|
|
self.test = test
|
|
self.alternate = alternate
|
|
self.consequent = consequent
|
|
|
|
|
|
class CallExpression(Expression):
|
|
"""A function or method call expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
callee: Expression,
|
|
arguments: List[Expression],
|
|
):
|
|
super().__init__("CallExpression", loc)
|
|
self.callee = callee
|
|
self.arguments = arguments
|
|
|
|
|
|
class NewExpression(Expression):
|
|
"""A ``new`` expression."""
|
|
|
|
def __init__(
|
|
self,
|
|
loc: Optional[SourceLocation],
|
|
callee: Expression,
|
|
arguments: List[Expression],
|
|
):
|
|
super().__init__("NewExpression", loc)
|
|
self.callee = callee
|
|
self.arguments = arguments
|
|
|
|
|
|
class SequenceExpression(Expression):
|
|
"""A sequence expression, i.e., a comma-separated sequence of expressions."""
|
|
|
|
def __init__(self, loc: Optional[SourceLocation], expressions: List[Expression]):
|
|
super().__init__("SequenceExpression", loc)
|
|
self.expressions = expressions
|