make ast object safe

This commit is contained in:
Aleksey Kladov 2019-08-22 15:20:07 +03:00
parent e055cfacdf
commit bbcca4f735
2 changed files with 15 additions and 4 deletions

View file

@ -19,7 +19,10 @@ pub struct AstEditor<N: AstNode> {
}
impl<N: AstNode> AstEditor<N> {
pub fn new(node: N) -> AstEditor<N> {
pub fn new(node: N) -> AstEditor<N>
where
N: Clone,
{
AstEditor { original_ast: node.clone(), ast: node }
}
@ -379,7 +382,7 @@ impl AstBuilder<ast::MatchArmList> {
fn ast_node_from_file_text<N: AstNode>(text: &str) -> N {
let parse = SourceFile::parse(text);
let res = parse.tree().syntax().descendants().find_map(N::cast).unwrap().to_owned();
let res = parse.tree().syntax().descendants().find_map(N::cast).unwrap();
res
}

View file

@ -25,15 +25,23 @@ pub use self::{
/// conversion itself has zero runtime cost: ast and syntax nodes have exactly
/// the same representation: a pointer to the tree root and a pointer to the
/// node itself.
pub trait AstNode: Clone {
fn can_cast(kind: SyntaxKind) -> bool;
pub trait AstNode {
fn can_cast(kind: SyntaxKind) -> bool
where
Self: Sized;
fn cast(syntax: SyntaxNode) -> Option<Self>
where
Self: Sized;
fn syntax(&self) -> &SyntaxNode;
}
#[test]
fn assert_ast_is_object_safe() {
fn _f(_: &dyn AstNode, _: &dyn NameOwner) {}
}
/// Like `AstNode`, but wraps tokens rather than interior nodes.
pub trait AstToken {
fn cast(token: SyntaxToken) -> Option<Self>