1#![doc = include_str!("readme.md")]
2
3use oak_core::language::{Language, LanguageCategory};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct JavaScriptLanguage {
9 pub jsx: bool,
11 pub typescript: bool,
13 pub experimental: bool,
15 pub strict_mode: bool,
17 pub ecma_version: EcmaVersion,
19}
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24pub enum EcmaVersion {
25 ES3,
27 ES5,
29 ES2015,
31 ES2016,
33 ES2017,
35 ES2018,
37 ES2019,
39 ES2020,
41 ES2021,
43 ES2022,
45 ES2023,
47 Latest,
49}
50
51impl JavaScriptLanguage {
52 pub fn new() -> Self {
54 Self::default()
55 }
56
57 pub fn standard() -> Self {
59 Self::default()
60 }
61
62 pub fn modern() -> Self {
64 Self { jsx: false, typescript: false, experimental: false, strict_mode: true, ecma_version: EcmaVersion::Latest }
65 }
66
67 pub fn jsx() -> Self {
69 Self { jsx: true, typescript: false, experimental: false, strict_mode: true, ecma_version: EcmaVersion::Latest }
70 }
71
72 pub fn typescript() -> Self {
74 Self { jsx: false, typescript: true, experimental: false, strict_mode: true, ecma_version: EcmaVersion::Latest }
75 }
76}
77
78impl Default for JavaScriptLanguage {
79 fn default() -> Self {
80 Self { jsx: false, typescript: false, experimental: false, strict_mode: false, ecma_version: EcmaVersion::ES2015 }
81 }
82}
83
84impl Language for JavaScriptLanguage {
85 const NAME: &'static str = "javascript";
86 const CATEGORY: LanguageCategory = LanguageCategory::Programming;
87
88 type TokenType = crate::lexer::token_type::JavaScriptTokenType;
89 type ElementType = crate::parser::element_type::JavaScriptElementType;
90 type TypedRoot = crate::ast::JavaScriptRoot;
91}