1use crate::ast::TclRoot;
2use oak_core::{Language, LanguageCategory};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub struct TclLanguage {
8 pub version: TclVersion,
10 pub extensions: bool,
12}
13
14impl Default for TclLanguage {
15 fn default() -> Self {
16 Self::standard()
17 }
18}
19
20impl TclLanguage {
21 pub fn new() -> Self {
23 Self::default()
24 }
25}
26
27#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
29pub enum TclVersion {
30 Tcl80,
32 Tcl81,
34 Tcl82,
36 Tcl83,
38 Tcl84,
40 Tcl85,
42 Tcl86,
44 Tcl87,
46 Tcl90,
48}
49
50impl TclLanguage {
51 pub fn standard() -> Self {
53 Self { version: TclVersion::Tcl86, extensions: false }
54 }
55
56 pub fn tcl85() -> Self {
58 Self { version: TclVersion::Tcl85, extensions: false }
59 }
60
61 pub fn tcl86() -> Self {
63 Self { version: TclVersion::Tcl86, extensions: false }
64 }
65
66 pub fn tcl90() -> Self {
68 Self { version: TclVersion::Tcl90, extensions: true }
69 }
70
71 pub fn with_extensions() -> Self {
73 Self { version: TclVersion::Tcl86, extensions: true }
74 }
75}
76
77impl Language for TclLanguage {
78 const NAME: &'static str = "tcl";
79 const CATEGORY: LanguageCategory = LanguageCategory::Programming;
80
81 type TokenType = crate::kind::TclSyntaxKind;
82 type ElementType = crate::kind::TclSyntaxKind;
83 type TypedRoot = TclRoot;
84}