mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 05:15:04 +00:00
fix: rewrite code_action generate_delegate_trait
This commit is contained in:
parent
19387d3077
commit
59aa791fe6
8 changed files with 983 additions and 158 deletions
|
@ -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 (¶m, &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) = ¶m_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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue