Skip to content

Commit 3805067

Browse files
committed
Auto merge of #12905 - HKalbasi:master, r=Veykril
Generate rust type from json fix #10118 Should this be a diagnostic? I made it a diagnostic because of issue label.
2 parents b481b59 + 851f6db commit 3805067

20 files changed

+521
-182
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/hir/src/diagnostics.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::{MacroKind, Type};
1414

1515
macro_rules! diagnostics {
1616
($($diag:ident,)*) => {
17+
#[derive(Debug)]
1718
pub enum AnyDiagnostic {$(
1819
$diag(Box<$diag>),
1920
)*}

crates/ide-assists/src/assist_context.rs

Lines changed: 10 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,20 @@
11
//! See [`AssistContext`].
22
3-
use std::mem;
4-
53
use hir::Semantics;
6-
use ide_db::{
7-
base_db::{AnchoredPathBuf, FileId, FileRange},
8-
SnippetCap,
9-
};
10-
use ide_db::{
11-
label::Label,
12-
source_change::{FileSystemEdit, SourceChange},
13-
RootDatabase,
14-
};
4+
use ide_db::base_db::{FileId, FileRange};
5+
use ide_db::{label::Label, RootDatabase};
156
use syntax::{
167
algo::{self, find_node_at_offset, find_node_at_range},
17-
AstNode, AstToken, Direction, SourceFile, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxNodePtr,
18-
SyntaxToken, TextRange, TextSize, TokenAtOffset,
8+
AstNode, AstToken, Direction, SourceFile, SyntaxElement, SyntaxKind, SyntaxToken, TextRange,
9+
TextSize, TokenAtOffset,
1910
};
20-
use text_edit::{TextEdit, TextEditBuilder};
2111

2212
use crate::{
2313
assist_config::AssistConfig, Assist, AssistId, AssistKind, AssistResolveStrategy, GroupLabel,
2414
};
2515

16+
pub(crate) use ide_db::source_change::{SourceChangeBuilder, TreeMutator};
17+
2618
/// `AssistContext` allows to apply an assist or check if it could be applied.
2719
///
2820
/// Assists use a somewhat over-engineered approach, given the current needs.
@@ -163,7 +155,7 @@ impl Assists {
163155
id: AssistId,
164156
label: impl Into<String>,
165157
target: TextRange,
166-
f: impl FnOnce(&mut AssistBuilder),
158+
f: impl FnOnce(&mut SourceChangeBuilder),
167159
) -> Option<()> {
168160
let mut f = Some(f);
169161
self.add_impl(None, id, label.into(), target, &mut |it| f.take().unwrap()(it))
@@ -175,7 +167,7 @@ impl Assists {
175167
id: AssistId,
176168
label: impl Into<String>,
177169
target: TextRange,
178-
f: impl FnOnce(&mut AssistBuilder),
170+
f: impl FnOnce(&mut SourceChangeBuilder),
179171
) -> Option<()> {
180172
let mut f = Some(f);
181173
self.add_impl(Some(group), id, label.into(), target, &mut |it| f.take().unwrap()(it))
@@ -187,15 +179,15 @@ impl Assists {
187179
id: AssistId,
188180
label: String,
189181
target: TextRange,
190-
f: &mut dyn FnMut(&mut AssistBuilder),
182+
f: &mut dyn FnMut(&mut SourceChangeBuilder),
191183
) -> Option<()> {
192184
if !self.is_allowed(&id) {
193185
return None;
194186
}
195187

196188
let mut trigger_signature_help = false;
197189
let source_change = if self.resolve.should_resolve(&id) {
198-
let mut builder = AssistBuilder::new(self.file);
190+
let mut builder = SourceChangeBuilder::new(self.file);
199191
f(&mut builder);
200192
trigger_signature_help = builder.trigger_signature_help;
201193
Some(builder.finish())
@@ -216,132 +208,3 @@ impl Assists {
216208
}
217209
}
218210
}
219-
220-
pub(crate) struct AssistBuilder {
221-
edit: TextEditBuilder,
222-
file_id: FileId,
223-
source_change: SourceChange,
224-
trigger_signature_help: bool,
225-
226-
/// Maps the original, immutable `SyntaxNode` to a `clone_for_update` twin.
227-
mutated_tree: Option<TreeMutator>,
228-
}
229-
230-
pub(crate) struct TreeMutator {
231-
immutable: SyntaxNode,
232-
mutable_clone: SyntaxNode,
233-
}
234-
235-
impl TreeMutator {
236-
pub(crate) fn new(immutable: &SyntaxNode) -> TreeMutator {
237-
let immutable = immutable.ancestors().last().unwrap();
238-
let mutable_clone = immutable.clone_for_update();
239-
TreeMutator { immutable, mutable_clone }
240-
}
241-
242-
pub(crate) fn make_mut<N: AstNode>(&self, node: &N) -> N {
243-
N::cast(self.make_syntax_mut(node.syntax())).unwrap()
244-
}
245-
246-
pub(crate) fn make_syntax_mut(&self, node: &SyntaxNode) -> SyntaxNode {
247-
let ptr = SyntaxNodePtr::new(node);
248-
ptr.to_node(&self.mutable_clone)
249-
}
250-
}
251-
252-
impl AssistBuilder {
253-
pub(crate) fn new(file_id: FileId) -> AssistBuilder {
254-
AssistBuilder {
255-
edit: TextEdit::builder(),
256-
file_id,
257-
source_change: SourceChange::default(),
258-
trigger_signature_help: false,
259-
mutated_tree: None,
260-
}
261-
}
262-
263-
pub(crate) fn edit_file(&mut self, file_id: FileId) {
264-
self.commit();
265-
self.file_id = file_id;
266-
}
267-
268-
fn commit(&mut self) {
269-
if let Some(tm) = self.mutated_tree.take() {
270-
algo::diff(&tm.immutable, &tm.mutable_clone).into_text_edit(&mut self.edit)
271-
}
272-
273-
let edit = mem::take(&mut self.edit).finish();
274-
if !edit.is_empty() {
275-
self.source_change.insert_source_edit(self.file_id, edit);
276-
}
277-
}
278-
279-
pub(crate) fn make_mut<N: AstNode>(&mut self, node: N) -> N {
280-
self.mutated_tree.get_or_insert_with(|| TreeMutator::new(node.syntax())).make_mut(&node)
281-
}
282-
/// Returns a copy of the `node`, suitable for mutation.
283-
///
284-
/// Syntax trees in rust-analyzer are typically immutable, and mutating
285-
/// operations panic at runtime. However, it is possible to make a copy of
286-
/// the tree and mutate the copy freely. Mutation is based on interior
287-
/// mutability, and different nodes in the same tree see the same mutations.
288-
///
289-
/// The typical pattern for an assist is to find specific nodes in the read
290-
/// phase, and then get their mutable couterparts using `make_mut` in the
291-
/// mutable state.
292-
pub(crate) fn make_syntax_mut(&mut self, node: SyntaxNode) -> SyntaxNode {
293-
self.mutated_tree.get_or_insert_with(|| TreeMutator::new(&node)).make_syntax_mut(&node)
294-
}
295-
296-
/// Remove specified `range` of text.
297-
pub(crate) fn delete(&mut self, range: TextRange) {
298-
self.edit.delete(range)
299-
}
300-
/// Append specified `text` at the given `offset`
301-
pub(crate) fn insert(&mut self, offset: TextSize, text: impl Into<String>) {
302-
self.edit.insert(offset, text.into())
303-
}
304-
/// Append specified `snippet` at the given `offset`
305-
pub(crate) fn insert_snippet(
306-
&mut self,
307-
_cap: SnippetCap,
308-
offset: TextSize,
309-
snippet: impl Into<String>,
310-
) {
311-
self.source_change.is_snippet = true;
312-
self.insert(offset, snippet);
313-
}
314-
/// Replaces specified `range` of text with a given string.
315-
pub(crate) fn replace(&mut self, range: TextRange, replace_with: impl Into<String>) {
316-
self.edit.replace(range, replace_with.into())
317-
}
318-
/// Replaces specified `range` of text with a given `snippet`.
319-
pub(crate) fn replace_snippet(
320-
&mut self,
321-
_cap: SnippetCap,
322-
range: TextRange,
323-
snippet: impl Into<String>,
324-
) {
325-
self.source_change.is_snippet = true;
326-
self.replace(range, snippet);
327-
}
328-
pub(crate) fn replace_ast<N: AstNode>(&mut self, old: N, new: N) {
329-
algo::diff(old.syntax(), new.syntax()).into_text_edit(&mut self.edit)
330-
}
331-
pub(crate) fn create_file(&mut self, dst: AnchoredPathBuf, content: impl Into<String>) {
332-
let file_system_edit = FileSystemEdit::CreateFile { dst, initial_contents: content.into() };
333-
self.source_change.push_file_system_edit(file_system_edit);
334-
}
335-
pub(crate) fn move_file(&mut self, src: FileId, dst: AnchoredPathBuf) {
336-
let file_system_edit = FileSystemEdit::MoveFile { src, dst };
337-
self.source_change.push_file_system_edit(file_system_edit);
338-
}
339-
pub(crate) fn trigger_signature_help(&mut self) {
340-
self.trigger_signature_help = true;
341-
}
342-
343-
fn finish(mut self) -> SourceChange {
344-
self.commit();
345-
mem::take(&mut self.source_change)
346-
}
347-
}

crates/ide-assists/src/handlers/convert_tuple_struct_to_named_struct.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use syntax::{
55
match_ast, SyntaxNode,
66
};
77

8-
use crate::{assist_context::AssistBuilder, AssistContext, AssistId, AssistKind, Assists};
8+
use crate::{assist_context::SourceChangeBuilder, AssistContext, AssistId, AssistKind, Assists};
99

1010
// Assist: convert_tuple_struct_to_named_struct
1111
//
@@ -80,7 +80,7 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
8080

8181
fn edit_struct_def(
8282
ctx: &AssistContext<'_>,
83-
edit: &mut AssistBuilder,
83+
edit: &mut SourceChangeBuilder,
8484
strukt: &Either<ast::Struct, ast::Variant>,
8585
tuple_fields: ast::TupleFieldList,
8686
names: Vec<ast::Name>,
@@ -122,7 +122,7 @@ fn edit_struct_def(
122122

123123
fn edit_struct_references(
124124
ctx: &AssistContext<'_>,
125-
edit: &mut AssistBuilder,
125+
edit: &mut SourceChangeBuilder,
126126
strukt: Either<hir::Struct, hir::Variant>,
127127
names: &[ast::Name],
128128
) {
@@ -132,7 +132,7 @@ fn edit_struct_references(
132132
};
133133
let usages = strukt_def.usages(&ctx.sema).include_self_refs().all();
134134

135-
let edit_node = |edit: &mut AssistBuilder, node: SyntaxNode| -> Option<()> {
135+
let edit_node = |edit: &mut SourceChangeBuilder, node: SyntaxNode| -> Option<()> {
136136
match_ast! {
137137
match node {
138138
ast::TupleStructPat(tuple_struct_pat) => {
@@ -203,7 +203,7 @@ fn edit_struct_references(
203203

204204
fn edit_field_references(
205205
ctx: &AssistContext<'_>,
206-
edit: &mut AssistBuilder,
206+
edit: &mut SourceChangeBuilder,
207207
fields: impl Iterator<Item = ast::TupleField>,
208208
names: &[ast::Name],
209209
) {

crates/ide-assists/src/handlers/destructure_tuple_binding.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use syntax::{
88
TextRange,
99
};
1010

11-
use crate::assist_context::{AssistBuilder, AssistContext, Assists};
11+
use crate::assist_context::{AssistContext, Assists, SourceChangeBuilder};
1212

1313
// Assist: destructure_tuple_binding
1414
//
@@ -151,7 +151,7 @@ struct TupleData {
151151
}
152152
fn edit_tuple_assignment(
153153
ctx: &AssistContext<'_>,
154-
builder: &mut AssistBuilder,
154+
builder: &mut SourceChangeBuilder,
155155
data: &TupleData,
156156
in_sub_pattern: bool,
157157
) {
@@ -195,7 +195,7 @@ fn edit_tuple_assignment(
195195

196196
fn edit_tuple_usages(
197197
data: &TupleData,
198-
builder: &mut AssistBuilder,
198+
builder: &mut SourceChangeBuilder,
199199
ctx: &AssistContext<'_>,
200200
in_sub_pattern: bool,
201201
) {
@@ -211,7 +211,7 @@ fn edit_tuple_usages(
211211
}
212212
fn edit_tuple_usage(
213213
ctx: &AssistContext<'_>,
214-
builder: &mut AssistBuilder,
214+
builder: &mut SourceChangeBuilder,
215215
usage: &FileReference,
216216
data: &TupleData,
217217
in_sub_pattern: bool,
@@ -239,7 +239,7 @@ fn edit_tuple_usage(
239239

240240
fn edit_tuple_field_usage(
241241
ctx: &AssistContext<'_>,
242-
builder: &mut AssistBuilder,
242+
builder: &mut SourceChangeBuilder,
243243
data: &TupleData,
244244
index: TupleIndex,
245245
) {

crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use syntax::{
2020
SyntaxNode, T,
2121
};
2222

23-
use crate::{assist_context::AssistBuilder, AssistContext, AssistId, AssistKind, Assists};
23+
use crate::{assist_context::SourceChangeBuilder, AssistContext, AssistId, AssistKind, Assists};
2424

2525
// Assist: extract_struct_from_enum_variant
2626
//
@@ -374,7 +374,7 @@ fn apply_references(
374374

375375
fn process_references(
376376
ctx: &AssistContext<'_>,
377-
builder: &mut AssistBuilder,
377+
builder: &mut SourceChangeBuilder,
378378
visited_modules: &mut FxHashSet<Module>,
379379
enum_module_def: &ModuleDef,
380380
variant_hir_name: &Name,

crates/ide-assists/src/handlers/generate_deref.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use syntax::{
88
};
99

1010
use crate::{
11-
assist_context::{AssistBuilder, AssistContext, Assists},
11+
assist_context::{AssistContext, Assists, SourceChangeBuilder},
1212
utils::generate_trait_impl_text,
1313
AssistId, AssistKind,
1414
};
@@ -120,7 +120,7 @@ fn generate_tuple_deref(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()
120120
}
121121

122122
fn generate_edit(
123-
edit: &mut AssistBuilder,
123+
edit: &mut SourceChangeBuilder,
124124
strukt: ast::Struct,
125125
field_type_syntax: &SyntaxNode,
126126
field_name: impl Display,

crates/ide-assists/src/handlers/introduce_named_lifetime.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use syntax::{
55
AstNode, TextRange,
66
};
77

8-
use crate::{assist_context::AssistBuilder, AssistContext, AssistId, AssistKind, Assists};
8+
use crate::{assist_context::SourceChangeBuilder, AssistContext, AssistId, AssistKind, Assists};
99

1010
static ASSIST_NAME: &str = "introduce_named_lifetime";
1111
static ASSIST_LABEL: &str = "Introduce named lifetime";
@@ -140,7 +140,7 @@ enum NeedsLifetime {
140140
}
141141

142142
impl NeedsLifetime {
143-
fn make_mut(self, builder: &mut AssistBuilder) -> Self {
143+
fn make_mut(self, builder: &mut SourceChangeBuilder) -> Self {
144144
match self {
145145
Self::SelfParam(it) => Self::SelfParam(builder.make_mut(it)),
146146
Self::RefType(it) => Self::RefType(builder.make_mut(it)),

crates/ide-assists/src/handlers/remove_unused_param.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use syntax::{
88
use SyntaxKind::WHITESPACE;
99

1010
use crate::{
11-
assist_context::AssistBuilder, utils::next_prev, AssistContext, AssistId, AssistKind, Assists,
11+
assist_context::SourceChangeBuilder, utils::next_prev, AssistContext, AssistId, AssistKind,
12+
Assists,
1213
};
1314

1415
// Assist: remove_unused_param
@@ -88,7 +89,7 @@ pub(crate) fn remove_unused_param(acc: &mut Assists, ctx: &AssistContext<'_>) ->
8889

8990
fn process_usages(
9091
ctx: &AssistContext<'_>,
91-
builder: &mut AssistBuilder,
92+
builder: &mut SourceChangeBuilder,
9293
file_id: FileId,
9394
references: Vec<FileReference>,
9495
arg_to_remove: usize,

0 commit comments

Comments
 (0)