Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/syntax/src/ast/edit_in_place.rs')
-rw-r--r--crates/syntax/src/ast/edit_in_place.rs47
1 files changed, 46 insertions, 1 deletions
diff --git a/crates/syntax/src/ast/edit_in_place.rs b/crates/syntax/src/ast/edit_in_place.rs
index 37d8212042..4c2878f49f 100644
--- a/crates/syntax/src/ast/edit_in_place.rs
+++ b/crates/syntax/src/ast/edit_in_place.rs
@@ -13,7 +13,7 @@ use crate::{
SyntaxNode, SyntaxToken,
};
-use super::{HasArgList, HasName};
+use super::{GenericParam, HasArgList, HasName};
pub trait GenericParamsOwnerEdit: ast::HasGenericParams {
fn get_or_create_generic_param_list(&self) -> ast::GenericParamList;
@@ -272,6 +272,36 @@ impl ast::GenericParamList {
}
}
+ /// Find the params corresponded to generic arg
+ pub fn find_generic_arg(&self, generic_arg: &ast::GenericArg) -> Option<GenericParam> {
+ self.generic_params().find_map(move |param| match (&param, &generic_arg) {
+ (ast::GenericParam::LifetimeParam(a), ast::GenericArg::LifetimeArg(b)) => {
+ (a.lifetime()?.lifetime_ident_token()?.text()
+ == b.lifetime()?.lifetime_ident_token()?.text())
+ .then_some(param)
+ }
+ (ast::GenericParam::TypeParam(a), ast::GenericArg::TypeArg(b)) => {
+ debug_assert_eq!(b.syntax().first_token(), b.syntax().last_token());
+ (a.name()?.text() == b.syntax().first_token()?.text()).then_some(param)
+ }
+ (ast::GenericParam::ConstParam(a), ast::GenericArg::TypeArg(b)) => {
+ debug_assert_eq!(b.syntax().first_token(), b.syntax().last_token());
+ (a.name()?.text() == b.syntax().first_token()?.text()).then_some(param)
+ }
+ _ => None,
+ })
+ }
+
+ /// Removes the corresponding generic arg
+ pub fn remove_generic_arg(&self, generic_arg: &ast::GenericArg) -> Option<GenericParam> {
+ let param_to_remove = self.find_generic_arg(generic_arg);
+
+ if let Some(param) = &param_to_remove {
+ self.remove_generic_param(param.clone());
+ }
+ param_to_remove
+ }
+
/// Constructs a matching [`ast::GenericArgList`]
pub fn to_generic_args(&self) -> ast::GenericArgList {
let args = self.generic_params().filter_map(|param| match param {
@@ -300,6 +330,20 @@ impl ast::WhereClause {
}
ted::append_child(self.syntax(), predicate.syntax());
}
+
+ pub fn remove_predicate(&self, predicate: ast::WherePred) {
+ if let Some(previous) = predicate.syntax().prev_sibling() {
+ if let Some(next_token) = previous.next_sibling_or_token() {
+ ted::remove_all(next_token..=predicate.syntax().clone().into());
+ }
+ } else if let Some(next) = predicate.syntax().next_sibling() {
+ if let Some(next_token) = next.prev_sibling_or_token() {
+ ted::remove_all(predicate.syntax().clone().into()..=next_token);
+ }
+ } else {
+ ted::remove(predicate.syntax());
+ }
+ }
}
impl ast::TypeParam {
@@ -414,6 +458,7 @@ impl ast::UseTree {
u.remove_recursive();
}
}
+ u.remove_unnecessary_braces();
}
}