diff options
Diffstat (limited to 'crates/ra_ide_db/src/source_change.rs')
-rw-r--r-- | crates/ra_ide_db/src/source_change.rs | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/crates/ra_ide_db/src/source_change.rs b/crates/ra_ide_db/src/source_change.rs new file mode 100644 index 000000000..3484f5588 --- /dev/null +++ b/crates/ra_ide_db/src/source_change.rs | |||
@@ -0,0 +1,107 @@ | |||
1 | //! This modules defines type to represent changes to the source code, that flow | ||
2 | //! from the server to the client. | ||
3 | //! | ||
4 | //! It can be viewed as a dual for `AnalysisChange`. | ||
5 | |||
6 | use ra_db::{FileId, RelativePathBuf, SourceRootId}; | ||
7 | use ra_text_edit::TextEdit; | ||
8 | |||
9 | #[derive(Debug, Clone)] | ||
10 | pub struct SourceChange { | ||
11 | /// For display in the undo log in the editor | ||
12 | pub label: String, | ||
13 | pub source_file_edits: Vec<SourceFileEdit>, | ||
14 | pub file_system_edits: Vec<FileSystemEdit>, | ||
15 | pub is_snippet: bool, | ||
16 | } | ||
17 | |||
18 | impl SourceChange { | ||
19 | /// Creates a new SourceChange with the given label | ||
20 | /// from the edits. | ||
21 | pub fn from_edits<L: Into<String>>( | ||
22 | label: L, | ||
23 | source_file_edits: Vec<SourceFileEdit>, | ||
24 | file_system_edits: Vec<FileSystemEdit>, | ||
25 | ) -> Self { | ||
26 | SourceChange { | ||
27 | label: label.into(), | ||
28 | source_file_edits, | ||
29 | file_system_edits, | ||
30 | is_snippet: false, | ||
31 | } | ||
32 | } | ||
33 | |||
34 | /// Creates a new SourceChange with the given label, | ||
35 | /// containing only the given `SourceFileEdits`. | ||
36 | pub fn source_file_edits<L: Into<String>>(label: L, edits: Vec<SourceFileEdit>) -> Self { | ||
37 | let label = label.into(); | ||
38 | assert!(label.starts_with(char::is_uppercase)); | ||
39 | SourceChange { | ||
40 | label: label, | ||
41 | source_file_edits: edits, | ||
42 | file_system_edits: vec![], | ||
43 | is_snippet: false, | ||
44 | } | ||
45 | } | ||
46 | |||
47 | /// Creates a new SourceChange with the given label, | ||
48 | /// containing only the given `FileSystemEdits`. | ||
49 | pub(crate) fn file_system_edits<L: Into<String>>(label: L, edits: Vec<FileSystemEdit>) -> Self { | ||
50 | SourceChange { | ||
51 | label: label.into(), | ||
52 | source_file_edits: vec![], | ||
53 | file_system_edits: edits, | ||
54 | is_snippet: false, | ||
55 | } | ||
56 | } | ||
57 | |||
58 | /// Creates a new SourceChange with the given label, | ||
59 | /// containing only a single `SourceFileEdit`. | ||
60 | pub fn source_file_edit<L: Into<String>>(label: L, edit: SourceFileEdit) -> Self { | ||
61 | SourceChange::source_file_edits(label, vec![edit]) | ||
62 | } | ||
63 | |||
64 | /// Creates a new SourceChange with the given label | ||
65 | /// from the given `FileId` and `TextEdit` | ||
66 | pub fn source_file_edit_from<L: Into<String>>( | ||
67 | label: L, | ||
68 | file_id: FileId, | ||
69 | edit: TextEdit, | ||
70 | ) -> Self { | ||
71 | SourceChange::source_file_edit(label, SourceFileEdit { file_id, edit }) | ||
72 | } | ||
73 | |||
74 | /// Creates a new SourceChange with the given label | ||
75 | /// from the given `FileId` and `TextEdit` | ||
76 | pub fn file_system_edit<L: Into<String>>(label: L, edit: FileSystemEdit) -> Self { | ||
77 | SourceChange::file_system_edits(label, vec![edit]) | ||
78 | } | ||
79 | } | ||
80 | |||
81 | #[derive(Debug, Clone)] | ||
82 | pub struct SourceFileEdit { | ||
83 | pub file_id: FileId, | ||
84 | pub edit: TextEdit, | ||
85 | } | ||
86 | |||
87 | #[derive(Debug, Clone)] | ||
88 | pub enum FileSystemEdit { | ||
89 | CreateFile { source_root: SourceRootId, path: RelativePathBuf }, | ||
90 | MoveFile { src: FileId, dst_source_root: SourceRootId, dst_path: RelativePathBuf }, | ||
91 | } | ||
92 | |||
93 | pub struct SingleFileChange { | ||
94 | pub label: String, | ||
95 | pub edit: TextEdit, | ||
96 | } | ||
97 | |||
98 | impl SingleFileChange { | ||
99 | pub fn into_source_change(self, file_id: FileId) -> SourceChange { | ||
100 | SourceChange { | ||
101 | label: self.label, | ||
102 | source_file_edits: vec![SourceFileEdit { file_id, edit: self.edit }], | ||
103 | file_system_edits: Vec::new(), | ||
104 | is_snippet: false, | ||
105 | } | ||
106 | } | ||
107 | } | ||