swc_ecma_fast_parser/parser/
util.rs
use swc_atoms::Atom;
use swc_common::{Span, SyntaxContext};
use swc_ecma_ast::{BindingIdent, Ident, Number, Str};
use crate::{
error::{Error, ErrorKind},
token::{Token, TokenType, TokenValue},
};
pub fn token_value_to_ident(token: &Token, span: Span) -> Ident {
if let TokenValue::Str { value, .. } = &token.value {
Ident {
span,
sym: value.clone(),
optional: false,
ctxt: SyntaxContext::empty(),
}
} else {
Ident {
span,
sym: Atom::from(""),
optional: false,
ctxt: SyntaxContext::empty(),
}
}
}
pub fn token_value_to_binding_ident(token: &Token, span: Span) -> BindingIdent {
BindingIdent {
id: token_value_to_ident(token, span),
type_ann: None,
}
}
pub fn token_value_to_str(token: &Token, span: Span) -> Str {
if let TokenValue::Str { value, raw } = &token.value {
Str {
span,
value: value.clone(),
raw: Some(raw.clone()),
}
} else {
Str {
span,
value: Atom::from(""),
raw: None,
}
}
}
pub fn token_value_to_number(token: &Token, span: Span) -> Number {
if let TokenValue::Num { value, raw } = &token.value {
Number {
span,
value: *value,
raw: Some(raw.clone()),
}
} else {
Number {
span,
value: 0.0,
raw: None,
}
}
}
pub fn is_binary_operator(token_type: TokenType) -> bool {
matches!(
token_type,
TokenType::EqEq
| TokenType::NotEq
| TokenType::EqEqEq
| TokenType::NotEqEq
| TokenType::Lt
| TokenType::LtEq
| TokenType::Gt
| TokenType::GtEq
| TokenType::LShift
| TokenType::RShift
| TokenType::ZeroFillRShift
| TokenType::Plus
| TokenType::Minus
| TokenType::Asterisk
| TokenType::Slash
| TokenType::Percent
| TokenType::Pipe
| TokenType::Ampersand
| TokenType::Caret
| TokenType::Exp
| TokenType::LogicalOr
| TokenType::LogicalAnd
| TokenType::NullishCoalescing
| TokenType::In
| TokenType::InstanceOf
)
}
pub fn invalid_await_error(span: Span) -> Error {
Error {
kind: ErrorKind::General {
message: "await is only valid in async functions".to_string(),
},
span,
}
}
pub fn invalid_yield_error(span: Span) -> Error {
Error {
kind: ErrorKind::General {
message: "yield is only valid in generator functions".to_string(),
},
span,
}
}