Skip to main content

oak_javascript/language/
mod.rs

1//! JavaScript language implementation.
2
3use oak_core::language::{Language, LanguageCategory};
4#[cfg(feature = "serde")]
5use serde::{Deserialize, Serialize};
6
7/// JavaScript language implementation.
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
10pub struct JavaScriptLanguage {
11    /// Whether to allow JSX syntax.
12    pub jsx: bool,
13    /// Whether to allow TypeScript syntax.
14    pub typescript: bool,
15    /// Whether to allow experimental features.
16    pub experimental: bool,
17    /// Whether to enable strict mode.
18    pub strict_mode: bool,
19    /// ECMAScript version.
20    pub ecma_version: EcmaVersion,
21}
22
23/// ECMAScript version.
24#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
25#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
26pub enum EcmaVersion {
27    /// ES3
28    ES3,
29    /// ES5
30    ES5,
31    /// ES2015 (ES6)
32    ES2015,
33    /// ES2016
34    ES2016,
35    /// ES2017
36    ES2017,
37    /// ES2018
38    ES2018,
39    /// ES2019
40    ES2019,
41    /// ES2020
42    ES2020,
43    /// ES2021
44    ES2021,
45    /// ES2022
46    ES2022,
47    /// ES2023
48    ES2023,
49    /// Latest supported version
50    Latest,
51}
52
53impl JavaScriptLanguage {
54    /// Creates a new JavaScript language configuration.
55    pub fn new() -> Self {
56        Self::default()
57    }
58
59    /// Creates a standard JavaScript language instance.
60    pub fn standard() -> Self {
61        Self::default()
62    }
63
64    /// Creates a modern (ES2015+) JavaScript language instance.
65    pub fn modern() -> Self {
66        Self { jsx: false, typescript: false, experimental: false, strict_mode: true, ecma_version: EcmaVersion::Latest }
67    }
68
69    /// Creates a JavaScript language instance with JSX support.
70    pub fn jsx() -> Self {
71        Self { jsx: true, typescript: false, experimental: false, strict_mode: true, ecma_version: EcmaVersion::Latest }
72    }
73
74    /// Creates a TypeScript language instance.
75    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}