⬆️ rust-analyzer

This commit is contained in:
Laurențiu Nicola 2023-02-13 13:55:14 +02:00
parent 3e0e51c108
commit bc45c7659a
321 changed files with 11210 additions and 9720 deletions

View file

@ -13,6 +13,8 @@ pub mod prec;
use std::marker::PhantomData;
use itertools::Either;
use crate::{
syntax_node::{SyntaxNode, SyntaxNodeChildren, SyntaxToken},
SyntaxKind,
@ -98,6 +100,34 @@ impl<N: AstNode> Iterator for AstChildren<N> {
}
}
impl<L, R> AstNode for Either<L, R>
where
L: AstNode,
R: AstNode,
{
fn can_cast(kind: SyntaxKind) -> bool
where
Self: Sized,
{
L::can_cast(kind) || R::can_cast(kind)
}
fn cast(syntax: SyntaxNode) -> Option<Self>
where
Self: Sized,
{
if L::can_cast(syntax.kind()) {
L::cast(syntax).map(Either::Left)
} else {
R::cast(syntax).map(Either::Right)
}
}
fn syntax(&self) -> &SyntaxNode {
self.as_ref().either(L::syntax, R::syntax)
}
}
mod support {
use super::{AstChildren, AstNode, SyntaxKind, SyntaxNode, SyntaxToken};