mod class;
mod expr;
mod function;
mod module;
mod pattern;
mod stmt;
pub use class::{Class, ClassField, ClassMember, ClassMethod, MethodKind};
pub use expr::{
Argument, ArrayElement, Expr, ObjectMember, PropertyKey, TemplateElement, TemplateLiteral,
};
pub use function::{Arrow, ArrowBody, Function, Param};
pub use module::{ExportDecl, ExportSpecifier, ImportDecl, ImportSpecifier, ModuleExportName};
pub use pattern::{
ArrayPattern, ArrayPatternElement, BindingTarget, ObjectPattern, ObjectPatternProp,
};
pub use stmt::{
CatchClause, ForInit, ForLeft, Program, SourceType, Stmt, SwitchCase, VarDecl, VarDeclKind,
VarDeclarator,
};
use crate::common::Span;
use alloc::boxed::Box;
#[derive(Clone, Debug, PartialEq)]
pub struct Ident {
pub name: Box<str>,
pub span: Span,
}
impl Ident {
#[must_use]
pub fn new(name: impl Into<Box<str>>, span: Span) -> Self {
Self {
name: name.into(),
span,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[allow(missing_docs)] pub enum BinaryOp {
Add,
Sub,
Mul,
Div,
Mod,
Exp,
Lt,
Gt,
LtEq,
GtEq,
EqEq,
NotEq,
EqEqEq,
NotEqEq,
Shl,
Shr,
Ushr,
BitAnd,
BitOr,
BitXor,
In,
Instanceof,
}
impl BinaryOp {
#[must_use]
pub fn as_str(self) -> &'static str {
use BinaryOp::*;
match self {
Add => "+",
Sub => "-",
Mul => "*",
Div => "/",
Mod => "%",
Exp => "**",
Lt => "<",
Gt => ">",
LtEq => "<=",
GtEq => ">=",
EqEq => "==",
NotEq => "!=",
EqEqEq => "===",
NotEqEq => "!==",
Shl => "<<",
Shr => ">>",
Ushr => ">>>",
BitAnd => "&",
BitOr => "|",
BitXor => "^",
In => "in",
Instanceof => "instanceof",
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[allow(missing_docs)]
pub enum LogicalOp {
And,
Or,
Nullish,
}
impl LogicalOp {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
LogicalOp::And => "&&",
LogicalOp::Or => "||",
LogicalOp::Nullish => "??",
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[allow(missing_docs)]
pub enum UnaryOp {
Plus,
Minus,
Not,
BitNot,
Typeof,
Void,
Delete,
}
impl UnaryOp {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
UnaryOp::Plus => "+",
UnaryOp::Minus => "-",
UnaryOp::Not => "!",
UnaryOp::BitNot => "~",
UnaryOp::Typeof => "typeof",
UnaryOp::Void => "void",
UnaryOp::Delete => "delete",
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[allow(missing_docs)]
pub enum UpdateOp {
Inc,
Dec,
}
impl UpdateOp {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
UpdateOp::Inc => "++",
UpdateOp::Dec => "--",
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[allow(missing_docs)]
pub enum AssignOp {
Assign,
AddAssign,
SubAssign,
MulAssign,
DivAssign,
ModAssign,
ExpAssign,
ShlAssign,
ShrAssign,
UshrAssign,
BitAndAssign,
BitOrAssign,
BitXorAssign,
AndAssign,
OrAssign,
NullishAssign,
}
impl AssignOp {
#[must_use]
pub fn as_str(self) -> &'static str {
use AssignOp::*;
match self {
Assign => "=",
AddAssign => "+=",
SubAssign => "-=",
MulAssign => "*=",
DivAssign => "/=",
ModAssign => "%=",
ExpAssign => "**=",
ShlAssign => "<<=",
ShrAssign => ">>=",
UshrAssign => ">>>=",
BitAndAssign => "&=",
BitOrAssign => "|=",
BitXorAssign => "^=",
AndAssign => "&&=",
OrAssign => "||=",
NullishAssign => "??=",
}
}
#[must_use]
pub fn is_plain(self) -> bool {
matches!(self, AssignOp::Assign)
}
}