use std::str::FromStr;
use syntax::TextRange;
use crate::{label::Label, source_change::SourceChange};
#[derive(Debug, Clone)]
pub struct Assist {
pub id: AssistId,
pub label: Label,
pub group: Option<GroupLabel>,
pub target: TextRange,
pub source_change: Option<SourceChange>,
pub command: Option<Command>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Command {
TriggerParameterHints,
Rename,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AssistKind {
QuickFix,
Generate,
Refactor,
RefactorExtract,
RefactorInline,
RefactorRewrite,
}
impl AssistKind {
pub fn contains(self, other: AssistKind) -> bool {
if self == other {
return true;
}
match self {
AssistKind::Generate => true,
AssistKind::Refactor => matches!(
other,
AssistKind::RefactorExtract
| AssistKind::RefactorInline
| AssistKind::RefactorRewrite
),
_ => false,
}
}
pub fn name(&self) -> &str {
match self {
AssistKind::QuickFix => "QuickFix",
AssistKind::Generate => "Generate",
AssistKind::Refactor => "Refactor",
AssistKind::RefactorExtract => "RefactorExtract",
AssistKind::RefactorInline => "RefactorInline",
AssistKind::RefactorRewrite => "RefactorRewrite",
}
}
}
impl FromStr for AssistKind {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"QuickFix" => Ok(AssistKind::QuickFix),
"Generate" => Ok(AssistKind::Generate),
"Refactor" => Ok(AssistKind::Refactor),
"RefactorExtract" => Ok(AssistKind::RefactorExtract),
"RefactorInline" => Ok(AssistKind::RefactorInline),
"RefactorRewrite" => Ok(AssistKind::RefactorRewrite),
unknown => Err(format!("Unknown AssistKind: '{unknown}'")),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct AssistId(pub &'static str, pub AssistKind, pub Option<usize>);
impl AssistId {
pub fn quick_fix(id: &'static str) -> AssistId {
AssistId(id, AssistKind::QuickFix, None)
}
pub fn generate(id: &'static str) -> AssistId {
AssistId(id, AssistKind::Generate, None)
}
pub fn refactor(id: &'static str) -> AssistId {
AssistId(id, AssistKind::Refactor, None)
}
pub fn refactor_extract(id: &'static str) -> AssistId {
AssistId(id, AssistKind::RefactorExtract, None)
}
pub fn refactor_inline(id: &'static str) -> AssistId {
AssistId(id, AssistKind::RefactorInline, None)
}
pub fn refactor_rewrite(id: &'static str) -> AssistId {
AssistId(id, AssistKind::RefactorRewrite, None)
}
}
#[derive(Debug)]
pub enum AssistResolveStrategy {
None,
All,
Single(SingleResolve),
}
#[derive(Debug)]
pub struct SingleResolve {
pub assist_id: String,
pub assist_kind: AssistKind,
pub assist_subtype: Option<usize>,
}
impl AssistResolveStrategy {
pub fn should_resolve(&self, id: &AssistId) -> bool {
match self {
AssistResolveStrategy::None => false,
AssistResolveStrategy::All => true,
AssistResolveStrategy::Single(single_resolve) => {
single_resolve.assist_id == id.0
&& single_resolve.assist_kind == id.1
&& single_resolve.assist_subtype == id.2
}
}
}
}
#[derive(Clone, Debug)]
pub struct GroupLabel(pub String);
#[derive(Clone, Debug, PartialEq, Eq, Default)]
pub enum ExprFillDefaultMode {
#[default]
Todo,
Default,
Underscore,
}