1use std::str::FromStr;
9
10use syntax::TextRange;
11
12use crate::{label::Label, source_change::SourceChange};
13
14#[derive(Debug, Clone)]
15pub struct Assist {
16 pub id: AssistId,
17 pub label: Label,
19 pub group: Option<GroupLabel>,
20 pub target: TextRange,
23 pub source_change: Option<SourceChange>,
32 pub command: Option<Command>,
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq)]
37pub enum Command {
38 TriggerParameterHints,
40 Rename,
42}
43
44#[derive(Debug, Clone, Copy, PartialEq, Eq)]
45pub enum AssistKind {
46 QuickFix,
47 Generate,
48 Refactor,
49 RefactorExtract,
50 RefactorInline,
51 RefactorRewrite,
52}
53
54impl AssistKind {
55 pub fn contains(self, other: AssistKind) -> bool {
56 if self == other {
57 return true;
58 }
59
60 match self {
61 AssistKind::Generate => true,
62 AssistKind::Refactor => matches!(
63 other,
64 AssistKind::RefactorExtract
65 | AssistKind::RefactorInline
66 | AssistKind::RefactorRewrite
67 ),
68 _ => false,
69 }
70 }
71
72 pub fn name(&self) -> &str {
73 match self {
74 AssistKind::QuickFix => "QuickFix",
75 AssistKind::Generate => "Generate",
76 AssistKind::Refactor => "Refactor",
77 AssistKind::RefactorExtract => "RefactorExtract",
78 AssistKind::RefactorInline => "RefactorInline",
79 AssistKind::RefactorRewrite => "RefactorRewrite",
80 }
81 }
82}
83
84impl FromStr for AssistKind {
85 type Err = String;
86
87 fn from_str(s: &str) -> Result<Self, Self::Err> {
88 match s {
89 "QuickFix" => Ok(AssistKind::QuickFix),
90 "Generate" => Ok(AssistKind::Generate),
91 "Refactor" => Ok(AssistKind::Refactor),
92 "RefactorExtract" => Ok(AssistKind::RefactorExtract),
93 "RefactorInline" => Ok(AssistKind::RefactorInline),
94 "RefactorRewrite" => Ok(AssistKind::RefactorRewrite),
95 unknown => Err(format!("Unknown AssistKind: '{unknown}'")),
96 }
97 }
98}
99
100#[derive(Debug, Clone, Copy, PartialEq, Eq)]
103pub struct AssistId(pub &'static str, pub AssistKind, pub Option<usize>);
104
105impl AssistId {
106 pub fn quick_fix(id: &'static str) -> AssistId {
107 AssistId(id, AssistKind::QuickFix, None)
108 }
109
110 pub fn generate(id: &'static str) -> AssistId {
111 AssistId(id, AssistKind::Generate, None)
112 }
113
114 pub fn refactor(id: &'static str) -> AssistId {
115 AssistId(id, AssistKind::Refactor, None)
116 }
117
118 pub fn refactor_extract(id: &'static str) -> AssistId {
119 AssistId(id, AssistKind::RefactorExtract, None)
120 }
121
122 pub fn refactor_inline(id: &'static str) -> AssistId {
123 AssistId(id, AssistKind::RefactorInline, None)
124 }
125
126 pub fn refactor_rewrite(id: &'static str) -> AssistId {
127 AssistId(id, AssistKind::RefactorRewrite, None)
128 }
129}
130
131#[derive(Debug)]
134pub enum AssistResolveStrategy {
135 None,
137 All,
139 Single(SingleResolve),
141}
142
143#[derive(Debug)]
147pub struct SingleResolve {
148 pub assist_id: String,
150 pub assist_kind: AssistKind,
152 pub assist_subtype: Option<usize>,
154}
155
156impl AssistResolveStrategy {
157 pub fn should_resolve(&self, id: &AssistId) -> bool {
158 match self {
159 AssistResolveStrategy::None => false,
160 AssistResolveStrategy::All => true,
161 AssistResolveStrategy::Single(single_resolve) => {
162 single_resolve.assist_id == id.0
163 && single_resolve.assist_kind == id.1
164 && single_resolve.assist_subtype == id.2
165 }
166 }
167 }
168}
169
170#[derive(Clone, Debug)]
171pub struct GroupLabel(pub String);
172
173#[derive(Clone, Debug, PartialEq, Eq)]
174pub enum ExprFillDefaultMode {
175 Todo,
176 Default,
177 Underscore,
178}
179impl Default for ExprFillDefaultMode {
180 fn default() -> Self {
181 Self::Todo
182 }
183}