#![doc = include_str!("readme.md")]
use oak_core::language::{Language, LanguageCategory};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct JavaScriptLanguage {
pub jsx: bool,
pub typescript: bool,
pub experimental: bool,
pub strict_mode: bool,
pub ecma_version: EcmaVersion,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum EcmaVersion {
ES3,
ES5,
ES2015,
ES2016,
ES2017,
ES2018,
ES2019,
ES2020,
ES2021,
ES2022,
ES2023,
Latest,
}
impl JavaScriptLanguage {
pub fn new() -> Self {
Self::default()
}
pub fn standard() -> Self {
Self::default()
}
pub fn modern() -> Self {
Self { jsx: false, typescript: false, experimental: false, strict_mode: true, ecma_version: EcmaVersion::Latest }
}
pub fn jsx() -> Self {
Self { jsx: true, typescript: false, experimental: false, strict_mode: true, ecma_version: EcmaVersion::Latest }
}
pub fn typescript() -> Self {
Self { jsx: false, typescript: true, experimental: false, strict_mode: true, ecma_version: EcmaVersion::Latest }
}
}
impl Default for JavaScriptLanguage {
fn default() -> Self {
Self { jsx: false, typescript: false, experimental: false, strict_mode: false, ecma_version: EcmaVersion::ES2015 }
}
}
impl Language for JavaScriptLanguage {
const NAME: &'static str = "javascript";
const CATEGORY: LanguageCategory = LanguageCategory::Programming;
type TokenType = crate::lexer::token_type::JavaScriptTokenType;
type ElementType = crate::parser::element_type::JavaScriptElementType;
type TypedRoot = crate::ast::JavaScriptRoot;
}