1 use std
::{fmt, marker::PhantomData}
;
4 cursor
, Direction
, GreenNode
, GreenToken
, NodeOrToken
, SmolStr
, SyntaxKind
, SyntaxText
,
5 TextRange
, TextSize
, TokenAtOffset
, WalkEvent
,
8 pub trait Language
: Sized
+ Clone
+ Copy
+ fmt
::Debug
+ Eq
+ Ord
+ std
::hash
::Hash
{
11 fn kind_from_raw(raw
: SyntaxKind
) -> Self::Kind
;
12 fn kind_to_raw(kind
: Self::Kind
) -> SyntaxKind
;
15 #[derive(Clone, PartialEq, Eq, Hash)]
16 pub struct SyntaxNode
<L
: Language
> {
17 raw
: cursor
::SyntaxNode
,
21 impl<L
: Language
> From
<cursor
::SyntaxNode
> for SyntaxNode
<L
> {
22 fn from(raw
: cursor
::SyntaxNode
) -> SyntaxNode
<L
> {
23 SyntaxNode { raw, _p: PhantomData }
27 impl<L
: Language
> From
<SyntaxNode
<L
>> for cursor
::SyntaxNode
{
28 fn from(node
: SyntaxNode
<L
>) -> cursor
::SyntaxNode
{
33 impl<L
: Language
> fmt
::Debug
for SyntaxNode
<L
> {
34 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
37 for event
in self.preorder_with_tokens() {
39 WalkEvent
::Enter(element
) => {
44 NodeOrToken
::Node(node
) => writeln
!(f
, "{:?}", node
)?
,
45 NodeOrToken
::Token(token
) => writeln
!(f
, "{:?}", token
)?
,
49 WalkEvent
::Leave(_
) => level
-= 1,
55 write
!(f
, "{:?}@{:?}", self.kind(), self.text_range())
60 impl<L
: Language
> fmt
::Display
for SyntaxNode
<L
> {
61 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
62 fmt
::Display
::fmt(&self.raw
, f
)
66 #[derive(Clone, PartialEq, Eq, Hash)]
67 pub struct SyntaxToken
<L
: Language
> {
68 raw
: cursor
::SyntaxToken
,
72 impl<L
: Language
> From
<cursor
::SyntaxToken
> for SyntaxToken
<L
> {
73 fn from(raw
: cursor
::SyntaxToken
) -> SyntaxToken
<L
> {
74 SyntaxToken { raw, _p: PhantomData }
78 impl<L
: Language
> From
<SyntaxToken
<L
>> for cursor
::SyntaxToken
{
79 fn from(token
: SyntaxToken
<L
>) -> cursor
::SyntaxToken
{
84 impl<L
: Language
> fmt
::Debug
for SyntaxToken
<L
> {
85 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
86 write
!(f
, "{:?}@{:?}", self.kind(), self.text_range())?
;
87 if self.text().len() < 25 {
88 return write
!(f
, " {:?}", self.text());
90 let text
= self.text().as_str();
92 if text
.is_char_boundary(idx
) {
93 let text
= format
!("{} ...", &text
[..idx
]);
94 return write
!(f
, " {:?}", text
);
101 impl<L
: Language
> fmt
::Display
for SyntaxToken
<L
> {
102 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
103 fmt
::Display
::fmt(&self.raw
, f
)
107 pub type SyntaxElement
<L
> = NodeOrToken
<SyntaxNode
<L
>, SyntaxToken
<L
>>;
109 impl<L
: Language
> From
<cursor
::SyntaxElement
> for SyntaxElement
<L
> {
110 fn from(raw
: cursor
::SyntaxElement
) -> SyntaxElement
<L
> {
112 NodeOrToken
::Node(it
) => NodeOrToken
::Node(it
.into()),
113 NodeOrToken
::Token(it
) => NodeOrToken
::Token(it
.into()),
118 impl<L
: Language
> From
<SyntaxElement
<L
>> for cursor
::SyntaxElement
{
119 fn from(element
: SyntaxElement
<L
>) -> cursor
::SyntaxElement
{
121 NodeOrToken
::Node(it
) => NodeOrToken
::Node(it
.into()),
122 NodeOrToken
::Token(it
) => NodeOrToken
::Token(it
.into()),
127 impl<L
: Language
> From
<SyntaxNode
<L
>> for SyntaxElement
<L
> {
128 fn from(node
: SyntaxNode
<L
>) -> SyntaxElement
<L
> {
129 NodeOrToken
::Node(node
)
133 impl<L
: Language
> From
<SyntaxToken
<L
>> for SyntaxElement
<L
> {
134 fn from(token
: SyntaxToken
<L
>) -> SyntaxElement
<L
> {
135 NodeOrToken
::Token(token
)
139 impl<L
: Language
> fmt
::Display
for SyntaxElement
<L
> {
140 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
142 NodeOrToken
::Node(it
) => fmt
::Display
::fmt(it
, f
),
143 NodeOrToken
::Token(it
) => fmt
::Display
::fmt(it
, f
),
148 impl<L
: Language
> SyntaxNode
<L
> {
149 pub fn new_root(green
: GreenNode
) -> SyntaxNode
<L
> {
150 SyntaxNode
::from(cursor
::SyntaxNode
::new_root(green
))
152 pub fn replace_with(&self, replacement
: GreenNode
) -> GreenNode
{
153 self.raw
.replace_with(replacement
)
156 pub fn kind(&self) -> L
::Kind
{
157 L
::kind_from_raw(self.raw
.kind())
160 pub fn text_range(&self) -> TextRange
{
161 self.raw
.text_range()
164 pub fn text(&self) -> SyntaxText
{
168 pub fn green(&self) -> &GreenNode
{
172 pub fn parent(&self) -> Option
<SyntaxNode
<L
>> {
173 self.raw
.parent().map(Self::from
)
176 pub fn ancestors(&self) -> impl Iterator
<Item
= SyntaxNode
<L
>> {
177 self.raw
.ancestors().map(SyntaxNode
::from
)
180 pub fn children(&self) -> SyntaxNodeChildren
<L
> {
181 SyntaxNodeChildren { raw: self.raw.children(), _p: PhantomData }
184 pub fn children_with_tokens(&self) -> SyntaxElementChildren
<L
> {
185 SyntaxElementChildren { raw: self.raw.children_with_tokens(), _p: PhantomData }
188 pub fn first_child(&self) -> Option
<SyntaxNode
<L
>> {
189 self.raw
.first_child().map(Self::from
)
192 pub fn first_child_or_token(&self) -> Option
<SyntaxElement
<L
>> {
193 self.raw
.first_child_or_token().map(NodeOrToken
::from
)
196 pub fn last_child(&self) -> Option
<SyntaxNode
<L
>> {
197 self.raw
.last_child().map(Self::from
)
200 pub fn last_child_or_token(&self) -> Option
<SyntaxElement
<L
>> {
201 self.raw
.last_child_or_token().map(NodeOrToken
::from
)
204 pub fn next_sibling(&self) -> Option
<SyntaxNode
<L
>> {
205 self.raw
.next_sibling().map(Self::from
)
208 pub fn next_sibling_or_token(&self) -> Option
<SyntaxElement
<L
>> {
209 self.raw
.next_sibling_or_token().map(NodeOrToken
::from
)
212 pub fn prev_sibling(&self) -> Option
<SyntaxNode
<L
>> {
213 self.raw
.prev_sibling().map(Self::from
)
216 pub fn prev_sibling_or_token(&self) -> Option
<SyntaxElement
<L
>> {
217 self.raw
.prev_sibling_or_token().map(NodeOrToken
::from
)
220 pub fn first_token(&self) -> Option
<SyntaxToken
<L
>> {
221 self.raw
.first_token().map(SyntaxToken
::from
)
224 pub fn last_token(&self) -> Option
<SyntaxToken
<L
>> {
225 self.raw
.last_token().map(SyntaxToken
::from
)
228 pub fn siblings(&self, direction
: Direction
) -> impl Iterator
<Item
= SyntaxNode
<L
>> {
229 self.raw
.siblings(direction
).map(SyntaxNode
::from
)
232 pub fn siblings_with_tokens(
234 direction
: Direction
,
235 ) -> impl Iterator
<Item
= SyntaxElement
<L
>> {
236 self.raw
.siblings_with_tokens(direction
).map(SyntaxElement
::from
)
239 pub fn descendants(&self) -> impl Iterator
<Item
= SyntaxNode
<L
>> {
240 self.raw
.descendants().map(SyntaxNode
::from
)
243 pub fn descendants_with_tokens(&self) -> impl Iterator
<Item
= SyntaxElement
<L
>> {
244 self.raw
.descendants_with_tokens().map(NodeOrToken
::from
)
247 pub fn preorder(&self) -> impl Iterator
<Item
= WalkEvent
<SyntaxNode
<L
>>> {
248 self.raw
.preorder().map(|event
| event
.map(SyntaxNode
::from
))
251 pub fn preorder_with_tokens(&self) -> impl Iterator
<Item
= WalkEvent
<SyntaxElement
<L
>>> {
252 self.raw
.preorder_with_tokens().map(|event
| event
.map(NodeOrToken
::from
))
255 pub fn token_at_offset(&self, offset
: TextSize
) -> TokenAtOffset
<SyntaxToken
<L
>> {
256 self.raw
.token_at_offset(offset
).map(SyntaxToken
::from
)
259 pub fn covering_element(&self, range
: TextRange
) -> SyntaxElement
<L
> {
260 NodeOrToken
::from(self.raw
.covering_element(range
))
264 impl<L
: Language
> SyntaxToken
<L
> {
265 pub fn replace_with(&self, new_token
: GreenToken
) -> GreenNode
{
266 self.raw
.replace_with(new_token
)
269 pub fn kind(&self) -> L
::Kind
{
270 L
::kind_from_raw(self.raw
.kind())
273 pub fn text_range(&self) -> TextRange
{
274 self.raw
.text_range()
277 pub fn text(&self) -> &SmolStr
{
281 pub fn green(&self) -> &GreenToken
{
285 pub fn parent(&self) -> SyntaxNode
<L
> {
286 SyntaxNode
::from(self.raw
.parent())
289 pub fn ancestors(&self) -> impl Iterator
<Item
= SyntaxNode
<L
>> {
290 self.raw
.ancestors().map(SyntaxNode
::from
)
293 pub fn next_sibling_or_token(&self) -> Option
<SyntaxElement
<L
>> {
294 self.raw
.next_sibling_or_token().map(NodeOrToken
::from
)
297 pub fn prev_sibling_or_token(&self) -> Option
<SyntaxElement
<L
>> {
298 self.raw
.prev_sibling_or_token().map(NodeOrToken
::from
)
301 pub fn siblings_with_tokens(
303 direction
: Direction
,
304 ) -> impl Iterator
<Item
= SyntaxElement
<L
>> {
305 self.raw
.siblings_with_tokens(direction
).map(SyntaxElement
::from
)
308 pub fn next_token(&self) -> Option
<SyntaxToken
<L
>> {
309 self.raw
.next_token().map(SyntaxToken
::from
)
312 pub fn prev_token(&self) -> Option
<SyntaxToken
<L
>> {
313 self.raw
.prev_token().map(SyntaxToken
::from
)
317 impl<L
: Language
> SyntaxElement
<L
> {
318 pub fn text_range(&self) -> TextRange
{
320 NodeOrToken
::Node(it
) => it
.text_range(),
321 NodeOrToken
::Token(it
) => it
.text_range(),
325 pub fn kind(&self) -> L
::Kind
{
327 NodeOrToken
::Node(it
) => it
.kind(),
328 NodeOrToken
::Token(it
) => it
.kind(),
332 pub fn parent(&self) -> Option
<SyntaxNode
<L
>> {
334 NodeOrToken
::Node(it
) => it
.parent(),
335 NodeOrToken
::Token(it
) => Some(it
.parent()),
339 pub fn ancestors(&self) -> impl Iterator
<Item
= SyntaxNode
<L
>> {
341 NodeOrToken
::Node(it
) => it
.ancestors(),
342 NodeOrToken
::Token(it
) => it
.parent().ancestors(),
346 pub fn next_sibling_or_token(&self) -> Option
<SyntaxElement
<L
>> {
348 NodeOrToken
::Node(it
) => it
.next_sibling_or_token(),
349 NodeOrToken
::Token(it
) => it
.next_sibling_or_token(),
353 pub fn prev_sibling_or_token(&self) -> Option
<SyntaxElement
<L
>> {
355 NodeOrToken
::Node(it
) => it
.prev_sibling_or_token(),
356 NodeOrToken
::Token(it
) => it
.prev_sibling_or_token(),
361 #[derive(Debug, Clone)]
362 pub struct SyntaxNodeChildren
<L
: Language
> {
363 raw
: cursor
::SyntaxNodeChildren
,
367 impl<L
: Language
> Iterator
for SyntaxNodeChildren
<L
> {
368 type Item
= SyntaxNode
<L
>;
369 fn next(&mut self) -> Option
<Self::Item
> {
370 self.raw
.next().map(SyntaxNode
::from
)
374 #[derive(Debug, Clone)]
375 pub struct SyntaxElementChildren
<L
: Language
> {
376 raw
: cursor
::SyntaxElementChildren
,
380 impl<L
: Language
> Iterator
for SyntaxElementChildren
<L
> {
381 type Item
= SyntaxElement
<L
>;
382 fn next(&mut self) -> Option
<Self::Item
> {
383 self.raw
.next().map(NodeOrToken
::from
)