mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-10 15:14:32 +00:00
Add handling file_system_edit in test assists
This commit is contained in:
parent
c3d21ea05a
commit
c8f5792a36
2 changed files with 60 additions and 16 deletions
|
@ -4,10 +4,10 @@ use std::mem;
|
||||||
|
|
||||||
use algo::find_covering_element;
|
use algo::find_covering_element;
|
||||||
use hir::Semantics;
|
use hir::Semantics;
|
||||||
use ide_db::base_db::{FileId, FileRange};
|
use ide_db::base_db::{AnchoredPathBuf, FileId, FileRange};
|
||||||
use ide_db::{
|
use ide_db::{
|
||||||
label::Label,
|
label::Label,
|
||||||
source_change::{SourceChange, SourceFileEdit},
|
source_change::{FileSystemEdit, SourceChange, SourceFileEdit},
|
||||||
RootDatabase,
|
RootDatabase,
|
||||||
};
|
};
|
||||||
use syntax::{
|
use syntax::{
|
||||||
|
@ -209,6 +209,7 @@ pub(crate) struct AssistBuilder {
|
||||||
file_id: FileId,
|
file_id: FileId,
|
||||||
is_snippet: bool,
|
is_snippet: bool,
|
||||||
source_file_edits: Vec<SourceFileEdit>,
|
source_file_edits: Vec<SourceFileEdit>,
|
||||||
|
file_system_edits: Vec<FileSystemEdit>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AssistBuilder {
|
impl AssistBuilder {
|
||||||
|
@ -218,6 +219,7 @@ impl AssistBuilder {
|
||||||
file_id,
|
file_id,
|
||||||
is_snippet: false,
|
is_snippet: false,
|
||||||
source_file_edits: Vec::default(),
|
source_file_edits: Vec::default(),
|
||||||
|
file_system_edits: Vec::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,12 +284,18 @@ impl AssistBuilder {
|
||||||
algo::diff(&node, &new).into_text_edit(&mut self.edit);
|
algo::diff(&node, &new).into_text_edit(&mut self.edit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub(crate) fn create_file(&mut self, dst: AnchoredPathBuf, content: impl Into<String>) {
|
||||||
|
let file_system_edit = FileSystemEdit::CreateFile { dst: dst.clone() };
|
||||||
|
self.file_system_edits.push(file_system_edit);
|
||||||
|
self.edit_file(dst.anchor);
|
||||||
|
self.insert(TextSize::from(0), content)
|
||||||
|
}
|
||||||
|
|
||||||
fn finish(mut self) -> SourceChange {
|
fn finish(mut self) -> SourceChange {
|
||||||
self.commit();
|
self.commit();
|
||||||
SourceChange {
|
SourceChange {
|
||||||
source_file_edits: mem::take(&mut self.source_file_edits),
|
source_file_edits: mem::take(&mut self.source_file_edits),
|
||||||
file_system_edits: Default::default(),
|
file_system_edits: mem::take(&mut self.file_system_edits),
|
||||||
is_snippet: self.is_snippet,
|
is_snippet: self.is_snippet,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ mod generated;
|
||||||
|
|
||||||
use hir::Semantics;
|
use hir::Semantics;
|
||||||
use ide_db::base_db::{fixture::WithFixture, FileId, FileRange, SourceDatabaseExt};
|
use ide_db::base_db::{fixture::WithFixture, FileId, FileRange, SourceDatabaseExt};
|
||||||
|
use ide_db::source_change::FileSystemEdit;
|
||||||
use ide_db::RootDatabase;
|
use ide_db::RootDatabase;
|
||||||
use syntax::TextRange;
|
use syntax::TextRange;
|
||||||
use test_utils::{assert_eq_text, extract_offset, extract_range};
|
use test_utils::{assert_eq_text, extract_offset, extract_range};
|
||||||
|
@ -47,7 +48,7 @@ fn check_doc_test(assist_id: &str, before: &str, after: &str) {
|
||||||
let before = db.file_text(file_id).to_string();
|
let before = db.file_text(file_id).to_string();
|
||||||
let frange = FileRange { file_id, range: selection.into() };
|
let frange = FileRange { file_id, range: selection.into() };
|
||||||
|
|
||||||
let mut assist = Assist::resolved(&db, &AssistConfig::default(), frange)
|
let assist = Assist::resolved(&db, &AssistConfig::default(), frange)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.find(|assist| assist.assist.id.0 == assist_id)
|
.find(|assist| assist.assist.id.0 == assist_id)
|
||||||
.unwrap_or_else(|| {
|
.unwrap_or_else(|| {
|
||||||
|
@ -63,9 +64,12 @@ fn check_doc_test(assist_id: &str, before: &str, after: &str) {
|
||||||
});
|
});
|
||||||
|
|
||||||
let actual = {
|
let actual = {
|
||||||
let change = assist.source_change.source_file_edits.pop().unwrap();
|
|
||||||
let mut actual = before;
|
let mut actual = before;
|
||||||
change.edit.apply(&mut actual);
|
for source_file_edit in assist.source_change.source_file_edits {
|
||||||
|
if source_file_edit.file_id == file_id {
|
||||||
|
source_file_edit.edit.apply(&mut actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
actual
|
actual
|
||||||
};
|
};
|
||||||
assert_eq_text!(&after, &actual);
|
assert_eq_text!(&after, &actual);
|
||||||
|
@ -99,11 +103,42 @@ fn check(handler: Handler, before: &str, expected: ExpectedResult, assist_label:
|
||||||
(Some(assist), ExpectedResult::After(after)) => {
|
(Some(assist), ExpectedResult::After(after)) => {
|
||||||
let mut source_change = assist.source_change;
|
let mut source_change = assist.source_change;
|
||||||
assert!(!source_change.source_file_edits.is_empty());
|
assert!(!source_change.source_file_edits.is_empty());
|
||||||
let skip_header = source_change.source_file_edits.len() == 1;
|
let skip_header = source_change.source_file_edits.len() == 1
|
||||||
|
&& source_change.file_system_edits.len() == 0;
|
||||||
source_change.source_file_edits.sort_by_key(|it| it.file_id);
|
source_change.source_file_edits.sort_by_key(|it| it.file_id);
|
||||||
|
|
||||||
|
let mut created_file_ids = Vec::new();
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
|
for file_system_edit in source_change.file_system_edits.clone() {
|
||||||
|
match file_system_edit {
|
||||||
|
FileSystemEdit::CreateFile { dst } => {
|
||||||
|
created_file_ids.push(dst.anchor);
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for source_file_edit in source_change.source_file_edits {
|
for source_file_edit in source_change.source_file_edits {
|
||||||
|
if created_file_ids.contains(&source_file_edit.file_id) {
|
||||||
|
let target_dst = source_change
|
||||||
|
.file_system_edits
|
||||||
|
.iter()
|
||||||
|
.find_map(|f| match f {
|
||||||
|
FileSystemEdit::CreateFile { dst } => {
|
||||||
|
if dst.anchor == source_file_edit.file_id {
|
||||||
|
Some(&dst.path)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
format_to!(buf, "//- {}\n", target_dst);
|
||||||
|
let mut text = String::new();
|
||||||
|
source_file_edit.edit.apply(&mut text);
|
||||||
|
buf.push_str(&text);
|
||||||
|
} else {
|
||||||
let mut text = db.file_text(source_file_edit.file_id).as_ref().to_owned();
|
let mut text = db.file_text(source_file_edit.file_id).as_ref().to_owned();
|
||||||
source_file_edit.edit.apply(&mut text);
|
source_file_edit.edit.apply(&mut text);
|
||||||
if !skip_header {
|
if !skip_header {
|
||||||
|
@ -114,6 +149,7 @@ fn check(handler: Handler, before: &str, expected: ExpectedResult, assist_label:
|
||||||
}
|
}
|
||||||
buf.push_str(&text);
|
buf.push_str(&text);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
assert_eq_text!(after, &buf);
|
assert_eq_text!(after, &buf);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue