Skip to main content

svelte_syntax/ast/
common.rs

1use std::sync::Arc;
2
3use serde::{Deserialize, Serialize};
4
5use crate::SourceLocation;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8pub enum ScriptType {
9    Script,
10}
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename_all = "lowercase")]
14pub enum ScriptContext {
15    Default,
16    Module,
17}
18
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
20pub struct NameLocation {
21    pub start: SourceLocation,
22    pub end: SourceLocation,
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
26pub enum DirectiveValueSyntax {
27    #[default]
28    Implicit,
29    Expression,
30    Invalid,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
34pub enum AttributeValueSyntax {
35    #[default]
36    Boolean,
37    Expression,
38    Quoted,
39    Unquoted,
40}
41
42#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
43pub enum AttrErrorKind {
44    InvalidName,
45    ExpectedEquals,
46    ExpectedValue,
47    HtmlTag,
48    Block(Arc<str>),
49}
50
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
52pub struct AttrError {
53    pub kind: AttrErrorKind,
54    pub start: usize,
55    pub end: usize,
56}
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
59pub enum SnippetHeaderErrorKind {
60    ExpectedRightBrace,
61    ExpectedRightParen,
62}
63
64#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
65pub struct SnippetHeaderError {
66    pub kind: SnippetHeaderErrorKind,
67    pub start: usize,
68    pub end: usize,
69}
70
71#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
72pub enum ParseErrorKind {
73    BlockInvalidContinuationPlacement,
74    ExpectedTokenElse,
75    ExpectedTokenAwaitBranch,
76    ExpectedTokenCommentClose,
77    ExpectedTokenStyleClose,
78    ExpectedTokenRightBrace,
79    ExpectedWhitespace,
80    BlockUnexpectedCharacter,
81    UnexpectedReservedWord { word: Arc<str> },
82    JsParseError { message: Arc<str> },
83    CssExpectedIdentifier,
84    UnexpectedEof,
85    BlockUnclosed,
86    ElementUnclosed { name: Arc<str> },
87    ElementInvalidClosingTag { name: Arc<str> },
88    ElementInvalidClosingTagAutoclosed { name: Arc<str>, reason: Arc<str> },
89}
90
91#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
92pub struct ParseError {
93    pub kind: ParseErrorKind,
94    pub start: usize,
95    pub end: usize,
96}
97
98/// A JavaScript comment extracted from OXC parsing, used for the public AST.
99#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
100pub struct JsComment {
101    pub kind: JsCommentKind,
102    pub value: Arc<str>,
103    pub start: usize,
104    pub end: usize,
105}
106
107#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
108pub enum JsCommentKind {
109    Line,
110    Block,
111}
112
113#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
114pub enum RootCommentType {
115    Line,
116    Block,
117}
118
119#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
120pub enum FragmentType {
121    Fragment,
122}
123
124#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
125#[serde(untagged)]
126pub enum LiteralValue {
127    String(Arc<str>),
128    Number(i64),
129    JsonNumber(serde_json::Number),
130    Bool(bool),
131    Null,
132}
133
134#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
135pub struct Loc {
136    pub start: Position,
137    pub end: Position,
138}
139
140#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
141pub struct Position {
142    pub line: usize,
143    pub column: usize,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub character: Option<usize>,
146}
147
148pub trait Span {
149    fn start(&self) -> usize;
150    fn end(&self) -> usize;
151
152    #[allow(dead_code)]
153    fn len(&self) -> usize {
154        self.end().saturating_sub(self.start())
155    }
156
157    #[allow(dead_code)]
158    fn is_empty(&self) -> bool {
159        self.start() >= self.end()
160    }
161
162    #[allow(dead_code)]
163    fn contains(&self, offset: usize) -> bool {
164        offset >= self.start() && offset <= self.end()
165    }
166}