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