From 1141d448d960eedba0a5647d525910de706bf778 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 14 Aug 2018 13:33:44 +0300 Subject: Add derive intention --- crates/libeditor/src/code_actions.rs | 27 +++++++++++++++++++++++++-- crates/libeditor/src/lib.rs | 2 +- 2 files changed, 26 insertions(+), 3 deletions(-) (limited to 'crates/libeditor') diff --git a/crates/libeditor/src/code_actions.rs b/crates/libeditor/src/code_actions.rs index 7c9874588..6e2c73f29 100644 --- a/crates/libeditor/src/code_actions.rs +++ b/crates/libeditor/src/code_actions.rs @@ -1,11 +1,12 @@ use {TextUnit, File, EditBuilder, Edit}; use libsyntax2::{ - ast::AstNode, + ast::{self, AstNode}, SyntaxKind::COMMA, SyntaxNodeRef, + SyntaxRoot, algo::{ Direction, siblings, - find_leaf_at_offset, + find_leaf_at_offset, ancestors, }, }; @@ -24,10 +25,32 @@ pub fn flip_comma<'a>(file: &'a File, offset: TextUnit) -> Option(file: &'a File, offset: TextUnit) -> Option Edit + 'a> { + let syntax = file.syntax(); + let syntax = syntax.as_ref(); + let nominal = find_node::>(syntax, offset)?; + Some(move || { + let mut edit = EditBuilder::new(); + edit.insert(nominal.syntax().range().start(), "#[derive()]\n".to_string()); + edit.finish() + }) +} + fn non_trivia_sibling(node: SyntaxNodeRef, direction: Direction) -> Option { siblings(node, direction) .skip(1) .find(|node| !node.kind().is_trivia()) } +fn find_non_trivia_leaf(syntax: SyntaxNodeRef, offset: TextUnit) -> Option { + find_leaf_at_offset(syntax, offset) + .find(|leaf| !leaf.kind().is_trivia()) +} + +fn find_node<'a, N: AstNode<&'a SyntaxRoot>>(syntax: SyntaxNodeRef<'a>, offset: TextUnit) -> Option { + let leaf = find_non_trivia_leaf(syntax, offset)?; + ancestors(leaf) + .filter_map(N::cast) + .next() +} diff --git a/crates/libeditor/src/lib.rs b/crates/libeditor/src/lib.rs index b40db2c66..2c46ca45f 100644 --- a/crates/libeditor/src/lib.rs +++ b/crates/libeditor/src/lib.rs @@ -21,7 +21,7 @@ pub use self::{ extend_selection::extend_selection, symbols::{StructureNode, file_structure, FileSymbol, file_symbols}, edit::{EditBuilder, Edit, AtomEdit}, - code_actions::{flip_comma}, + code_actions::{flip_comma, add_derive}, }; #[derive(Debug)] -- cgit v1.2.3