use ra_ap_syntax::ast::{Fn, Struct};
use ra_ap_syntax::{AstNode, SyntaxKind, SyntaxNode};
use crate::{utils, InkAttribute};
pub trait FromSyntax {
fn syntax(&self) -> &SyntaxNode;
}
pub trait FromAST {
type AST: AstNode;
fn ast(&self) -> &Self::AST;
}
impl<T: FromAST> FromSyntax for T {
fn syntax(&self) -> &SyntaxNode {
self.ast().syntax()
}
}
pub trait FromInkAttribute {
fn can_cast(attr: &InkAttribute) -> bool;
fn cast(attr: InkAttribute) -> Option<Self>
where
Self: Sized;
fn ink_attr(&self) -> &InkAttribute;
}
pub trait AsInkStruct {
fn struct_item(&self) -> Option<&Struct>;
}
pub trait AsInkFn {
fn fn_item(&self) -> Option<&Fn>;
}
pub trait IRItem {
fn syntax_kind(&self) -> SyntaxKind;
fn syntax_parent(&self) -> Option<SyntaxNode>;
fn syntax_parent_kind(&self) -> Option<SyntaxKind>;
fn ink_attrs(&self) -> Vec<InkAttribute>;
fn ink_attrs_descendants(&self) -> Vec<InkAttribute>;
fn ink_attrs_in_scope(&self) -> Vec<InkAttribute>;
fn ink_attrs_closest_descendants(&self) -> Vec<InkAttribute>;
fn ink_attrs_ancestors(&self) -> Vec<InkAttribute>;
fn ink_attrs_closest_ancestors(&self) -> Vec<InkAttribute>;
}
impl<T> IRItem for T
where
T: FromSyntax,
{
fn syntax_kind(&self) -> SyntaxKind {
self.syntax().kind()
}
fn syntax_parent(&self) -> Option<SyntaxNode> {
self.syntax().parent()
}
fn syntax_parent_kind(&self) -> Option<SyntaxKind> {
Some(self.syntax_parent()?.kind())
}
fn ink_attrs(&self) -> Vec<InkAttribute> {
utils::ink_attrs(self.syntax())
}
fn ink_attrs_descendants(&self) -> Vec<InkAttribute> {
utils::ink_attrs_descendants(self.syntax())
}
fn ink_attrs_in_scope(&self) -> Vec<InkAttribute> {
utils::ink_attrs_in_scope(self.syntax())
}
fn ink_attrs_closest_descendants(&self) -> Vec<InkAttribute> {
utils::ink_attrs_closest_descendants(self.syntax())
}
fn ink_attrs_ancestors(&self) -> Vec<InkAttribute> {
utils::ink_attrs_ancestors(self.syntax())
}
fn ink_attrs_closest_ancestors(&self) -> Vec<InkAttribute> {
utils::ink_attrs_closest_ancestors(self.syntax())
}
}