use stdx::{format_to, to_lower_snake_case};
+use syntax::ast::VisibilityOwner;
use syntax::ast::{self, AstNode, NameOwner};
-use syntax::{ast::VisibilityOwner, T};
use test_utils::mark;
-use crate::{utils::find_struct_impl, AssistContext, AssistId, AssistKind, Assists};
+use crate::{
+ utils::{find_impl_block, find_struct_impl, generate_impl_text},
+ AssistContext, AssistId, AssistKind, Assists,
+};
// Assist: generate_enum_match_method
//
// Return early if we've found an existing new fn
let impl_def = find_struct_impl(
&ctx,
- &ast::AdtDef::Enum(parent_enum.clone()),
+ &ast::Adt::Enum(parent_enum.clone()),
format!("is_{}", fn_name).as_str(),
)?;
}
let vis = parent_enum.visibility().map_or(String::new(), |v| format!("{} ", v));
-
format_to!(
buf,
" /// Returns `true` if the {} is [`{}`].
);
let start_offset = impl_def
- .and_then(|impl_def| {
- buf.push('\n');
- let start = impl_def
- .syntax()
- .descendants_with_tokens()
- .find(|t| t.kind() == T!['{'])?
- .text_range()
- .end();
-
- Some(start)
- })
+ .and_then(|impl_def| find_impl_block(impl_def, &mut buf))
.unwrap_or_else(|| {
- buf = generate_impl_text(&parent_enum, &buf);
+ buf = generate_impl_text(&ast::Adt::Enum(parent_enum.clone()), &buf);
parent_enum.syntax().text_range().end()
});
)
}
-// Generates the surrounding `impl Type { <code> }` including type and lifetime
-// parameters
-fn generate_impl_text(strukt: &ast::Enum, code: &str) -> String {
- let mut buf = String::with_capacity(code.len());
- buf.push_str("\n\nimpl ");
- buf.push_str(strukt.name().unwrap().text());
- format_to!(buf, " {{\n{}\n}}", code);
- buf
-}
-
#[cfg(test)]
mod tests {
use test_utils::mark;