Skip to main content

skullbrain_parser/ast/
span.rs

1use super::*;
2use cstree::text::TextRange;
3
4/// A trait for types that have a defined textual span within the source code.
5pub trait Span {
6    /// Returns the `TextRange` corresponding to the element's position
7    /// in the source code.
8    fn span(&self) -> TextRange;
9}
10
11impl Span for Ident {
12    fn span(&self) -> TextRange {
13        self.span
14    }
15}
16impl Span for Literal {
17    fn span(&self) -> TextRange {
18        self.span
19    }
20}
21impl Span for BinaryExpr {
22    fn span(&self) -> TextRange {
23        self.left().span().cover(self.right().span())
24    }
25}
26impl Span for UnaryExpr {
27    fn span(&self) -> TextRange {
28        self.expr.span()
29    }
30}
31impl Span for ChainExpr {
32    fn span(&self) -> TextRange {
33        self.object().span().cover(self.method().span())
34    }
35}
36impl Span for ParenExpr {
37    fn span(&self) -> TextRange {
38        self.span
39    }
40}
41impl Span for BlockExpr {
42    fn span(&self) -> TextRange {
43        self.span
44    }
45}
46impl Span for Break {
47    fn span(&self) -> TextRange {
48        self.span
49    }
50}
51impl Span for Continue {
52    fn span(&self) -> TextRange {
53        self.span
54    }
55}
56impl Span for Return {
57    fn span(&self) -> TextRange {
58        self.span
59    }
60}
61impl Span for Throw {
62    fn span(&self) -> TextRange {
63        self.span
64    }
65}
66
67impl Span for While {
68    fn span(&self) -> TextRange {
69        self.span
70    }
71}
72impl Span for ForLoop {
73    fn span(&self) -> TextRange {
74        self.span
75    }
76}
77impl Span for TryCatch {
78    fn span(&self) -> TextRange {
79        self.span
80    }
81}
82impl Span for CatchArm {
83    fn span(&self) -> TextRange {
84        self.span
85    }
86}
87
88impl Span for VariableStmt {
89    fn span(&self) -> TextRange {
90        self.span
91    }
92}
93impl Span for TypeAlias {
94    fn span(&self) -> TextRange {
95        self.span
96    }
97}
98impl Span for Type {
99    fn span(&self) -> TextRange {
100        match self {
101            Type::Ident(ident) => ident.span,
102            Type::Function(function_signature) => function_signature.span(),
103        }
104    }
105}
106
107impl Span for FunctionSignature {
108    fn span(&self) -> TextRange {
109        self.span
110    }
111}
112
113impl Span for IfElse {
114    fn span(&self) -> TextRange {
115        self.span
116    }
117}
118
119impl Span for ElseBranch {
120    fn span(&self) -> TextRange {
121        self.span
122    }
123}
124impl Span for Match {
125    fn span(&self) -> TextRange {
126        self.span
127    }
128}
129
130impl Span for ImportStmt {
131    fn span(&self) -> TextRange {
132        self.span
133    }
134}
135impl Span for Function {
136    fn span(&self) -> TextRange {
137        self.span
138    }
139}
140impl Span for FunctionItem {
141    fn span(&self) -> TextRange {
142        self.span
143    }
144}
145
146impl Span for Enum {
147    fn span(&self) -> TextRange {
148        self.span
149    }
150}
151impl Span for Class {
152    fn span(&self) -> TextRange {
153        self.span
154    }
155}
156impl Span for Trait {
157    fn span(&self) -> TextRange {
158        self.span
159    }
160}
161impl Span for TraitImpl {
162    fn span(&self) -> TextRange {
163        self.span
164    }
165}
166
167impl Span for Expr {
168    fn span(&self) -> TextRange {
169        match self {
170            Expr::Literal(literal) => literal.span(),
171            Expr::Ident(ident) => ident.span(),
172            Expr::Binary(binary_expr) => binary_expr.span(),
173            Expr::Unary(unary_expr) => unary_expr.span(),
174            Expr::Chain(chain_expr) => chain_expr.span(),
175            Expr::Paren(paren_expr) => paren_expr.span(),
176            Expr::Block(block_expr) => block_expr.span(),
177            Expr::Break(v) => v.span(),
178            Expr::Continue(v) => v.span(),
179            Expr::Return(v) => v.span(),
180            Expr::Throw(throw) => throw.span(),
181            Expr::While(v) => v.span(),
182            Expr::For(for_loop) => for_loop.span(),
183            Expr::If(if_else) => if_else.span(),
184            Expr::Match(v) => v.span(),
185            Expr::TryCatch(try_catch) => try_catch.span(),
186            Expr::Variable(variable_stmt) => variable_stmt.span(),
187            Expr::Function(function) => function.span(),
188            Expr::Class(class) => class.span(),
189            Expr::Trait(v) => v.span(),
190            Expr::TraitImpl(trait_impl) => trait_impl.span(),
191            Expr::Enum(v) => v.span(),
192            Expr::TypeAlias(type_alias) => type_alias.span(),
193            Expr::Import(import_stmt) => import_stmt.span(),
194        }
195    }
196}