aboutsummaryrefslogtreecommitdiff
path: root/crates/ide
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide')
-rw-r--r--crates/ide/src/diagnostics.rs10
-rw-r--r--crates/ide/src/diagnostics/fixes.rs21
-rw-r--r--crates/ide/src/display/navigation_target.rs23
-rw-r--r--crates/ide/src/hover.rs62
-rw-r--r--crates/ide/src/references/rename.rs57
5 files changed, 126 insertions, 47 deletions
diff --git a/crates/ide/src/diagnostics.rs b/crates/ide/src/diagnostics.rs
index 9157704dc..049f808dc 100644
--- a/crates/ide/src/diagnostics.rs
+++ b/crates/ide/src/diagnostics.rs
@@ -613,10 +613,12 @@ fn test_fn() {
613 source_file_edits: [], 613 source_file_edits: [],
614 file_system_edits: [ 614 file_system_edits: [
615 CreateFile { 615 CreateFile {
616 anchor: FileId( 616 dst: AnchoredPathBuf {
617 0, 617 anchor: FileId(
618 ), 618 0,
619 dst: "foo.rs", 619 ),
620 path: "foo.rs",
621 },
620 }, 622 },
621 ], 623 ],
622 is_snippet: false, 624 is_snippet: false,
diff --git a/crates/ide/src/diagnostics/fixes.rs b/crates/ide/src/diagnostics/fixes.rs
index ba046232a..13240672f 100644
--- a/crates/ide/src/diagnostics/fixes.rs
+++ b/crates/ide/src/diagnostics/fixes.rs
@@ -6,9 +6,9 @@ use hir::{
6 Diagnostic, IncorrectCase, MissingFields, MissingOkInTailExpr, NoSuchField, 6 Diagnostic, IncorrectCase, MissingFields, MissingOkInTailExpr, NoSuchField,
7 RemoveThisSemicolon, UnresolvedModule, 7 RemoveThisSemicolon, UnresolvedModule,
8 }, 8 },
9 HasSource, HirDisplay, Semantics, VariantDef, 9 HasSource, HirDisplay, InFile, Semantics, VariantDef,
10}; 10};
11use ide_db::base_db::FileId; 11use ide_db::base_db::{AnchoredPathBuf, FileId};
12use ide_db::{ 12use ide_db::{
13 source_change::{FileSystemEdit, SourceFileEdit}, 13 source_change::{FileSystemEdit, SourceFileEdit},
14 RootDatabase, 14 RootDatabase,
@@ -36,8 +36,10 @@ impl DiagnosticWithFix for UnresolvedModule {
36 Some(Fix::new( 36 Some(Fix::new(
37 "Create module", 37 "Create module",
38 FileSystemEdit::CreateFile { 38 FileSystemEdit::CreateFile {
39 anchor: self.file.original_file(sema.db), 39 dst: AnchoredPathBuf {
40 dst: self.candidate.clone(), 40 anchor: self.file.original_file(sema.db),
41 path: self.candidate.clone(),
42 },
41 } 43 }
42 .into(), 44 .into(),
43 unresolved_module.syntax().text_range(), 45 unresolved_module.syntax().text_range(),
@@ -68,7 +70,8 @@ impl DiagnosticWithFix for MissingFields {
68 } 70 }
69 71
70 let root = sema.db.parse_or_expand(self.file)?; 72 let root = sema.db.parse_or_expand(self.file)?;
71 let old_field_list = self.field_list_parent.to_node(&root).record_expr_field_list()?; 73 let field_list_parent = self.field_list_parent.to_node(&root);
74 let old_field_list = field_list_parent.record_expr_field_list()?;
72 let mut new_field_list = old_field_list.clone(); 75 let mut new_field_list = old_field_list.clone();
73 for f in self.missed_fields.iter() { 76 for f in self.missed_fields.iter() {
74 let field = 77 let field =
@@ -85,7 +88,7 @@ impl DiagnosticWithFix for MissingFields {
85 Some(Fix::new( 88 Some(Fix::new(
86 "Fill struct fields", 89 "Fill struct fields",
87 SourceFileEdit { file_id: self.file.original_file(sema.db), edit }.into(), 90 SourceFileEdit { file_id: self.file.original_file(sema.db), edit }.into(),
88 sema.original_range(&old_field_list.syntax()).range, 91 sema.original_range(&field_list_parent.syntax()).range,
89 )) 92 ))
90 } 93 }
91} 94}
@@ -128,9 +131,9 @@ impl DiagnosticWithFix for IncorrectCase {
128 let root = sema.db.parse_or_expand(self.file)?; 131 let root = sema.db.parse_or_expand(self.file)?;
129 let name_node = self.ident.to_node(&root); 132 let name_node = self.ident.to_node(&root);
130 133
131 let file_id = self.file.original_file(sema.db); 134 let name_node = InFile::new(self.file, name_node.syntax());
132 let offset = name_node.syntax().text_range().start(); 135 let frange = name_node.original_file_range(sema.db);
133 let file_position = FilePosition { file_id, offset }; 136 let file_position = FilePosition { file_id: frange.file_id, offset: frange.range.start() };
134 137
135 let rename_changes = 138 let rename_changes =
136 rename_with_semantics(sema, file_position, &self.suggested_text).ok()?; 139 rename_with_semantics(sema, file_position, &self.suggested_text).ok()?;
diff --git a/crates/ide/src/display/navigation_target.rs b/crates/ide/src/display/navigation_target.rs
index 0c429a262..4790d648a 100644
--- a/crates/ide/src/display/navigation_target.rs
+++ b/crates/ide/src/display/navigation_target.rs
@@ -1,7 +1,7 @@
1//! FIXME: write short doc here 1//! FIXME: write short doc here
2 2
3use either::Either; 3use either::Either;
4use hir::{original_range, AssocItem, FieldSource, HasSource, InFile, ModuleSource}; 4use hir::{AssocItem, FieldSource, HasSource, InFile, ModuleSource};
5use ide_db::base_db::{FileId, SourceDatabase}; 5use ide_db::base_db::{FileId, SourceDatabase};
6use ide_db::{defs::Definition, RootDatabase}; 6use ide_db::{defs::Definition, RootDatabase};
7use syntax::{ 7use syntax::{
@@ -62,7 +62,8 @@ impl NavigationTarget {
62 pub(crate) fn from_module_to_decl(db: &RootDatabase, module: hir::Module) -> NavigationTarget { 62 pub(crate) fn from_module_to_decl(db: &RootDatabase, module: hir::Module) -> NavigationTarget {
63 let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default(); 63 let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default();
64 if let Some(src) = module.declaration_source(db) { 64 if let Some(src) = module.declaration_source(db) {
65 let frange = original_range(db, src.as_ref().map(|it| it.syntax())); 65 let node = src.as_ref().map(|it| it.syntax());
66 let frange = node.original_file_range(db);
66 let mut res = NavigationTarget::from_syntax( 67 let mut res = NavigationTarget::from_syntax(
67 frange.file_id, 68 frange.file_id,
68 name, 69 name,
@@ -104,8 +105,8 @@ impl NavigationTarget {
104 let name = 105 let name =
105 node.value.name().map(|it| it.text().clone()).unwrap_or_else(|| SmolStr::new("_")); 106 node.value.name().map(|it| it.text().clone()).unwrap_or_else(|| SmolStr::new("_"));
106 let focus_range = 107 let focus_range =
107 node.value.name().map(|it| original_range(db, node.with_value(it.syntax())).range); 108 node.value.name().map(|it| node.with_value(it.syntax()).original_file_range(db).range);
108 let frange = original_range(db, node.map(|it| it.syntax())); 109 let frange = node.map(|it| it.syntax()).original_file_range(db);
109 110
110 NavigationTarget::from_syntax( 111 NavigationTarget::from_syntax(
111 frange.file_id, 112 frange.file_id,
@@ -124,7 +125,7 @@ impl NavigationTarget {
124 ) -> NavigationTarget { 125 ) -> NavigationTarget {
125 let name = 126 let name =
126 named.value.name().map(|it| it.text().clone()).unwrap_or_else(|| SmolStr::new("_")); 127 named.value.name().map(|it| it.text().clone()).unwrap_or_else(|| SmolStr::new("_"));
127 let frange = original_range(db, node.map(|it| it.syntax())); 128 let frange = node.map(|it| it.syntax()).original_file_range(db);
128 129
129 NavigationTarget::from_syntax( 130 NavigationTarget::from_syntax(
130 frange.file_id, 131 frange.file_id,
@@ -236,7 +237,7 @@ impl ToNav for hir::Module {
236 (node.syntax(), node.name().map(|it| it.syntax().text_range())) 237 (node.syntax(), node.name().map(|it| it.syntax().text_range()))
237 } 238 }
238 }; 239 };
239 let frange = original_range(db, src.with_value(syntax)); 240 let frange = src.with_value(syntax).original_file_range(db);
240 NavigationTarget::from_syntax(frange.file_id, name, focus, frange.range, syntax.kind()) 241 NavigationTarget::from_syntax(frange.file_id, name, focus, frange.range, syntax.kind())
241 } 242 }
242} 243}
@@ -246,14 +247,14 @@ impl ToNav for hir::ImplDef {
246 let src = self.source(db); 247 let src = self.source(db);
247 let derive_attr = self.is_builtin_derive(db); 248 let derive_attr = self.is_builtin_derive(db);
248 let frange = if let Some(item) = &derive_attr { 249 let frange = if let Some(item) = &derive_attr {
249 original_range(db, item.syntax()) 250 item.syntax().original_file_range(db)
250 } else { 251 } else {
251 original_range(db, src.as_ref().map(|it| it.syntax())) 252 src.as_ref().map(|it| it.syntax()).original_file_range(db)
252 }; 253 };
253 let focus_range = if derive_attr.is_some() { 254 let focus_range = if derive_attr.is_some() {
254 None 255 None
255 } else { 256 } else {
256 src.value.self_ty().map(|ty| original_range(db, src.with_value(ty.syntax())).range) 257 src.value.self_ty().map(|ty| src.with_value(ty.syntax()).original_file_range(db).range)
257 }; 258 };
258 259
259 NavigationTarget::from_syntax( 260 NavigationTarget::from_syntax(
@@ -278,7 +279,7 @@ impl ToNav for hir::Field {
278 res 279 res
279 } 280 }
280 FieldSource::Pos(it) => { 281 FieldSource::Pos(it) => {
281 let frange = original_range(db, src.with_value(it.syntax())); 282 let frange = src.with_value(it.syntax()).original_file_range(db);
282 NavigationTarget::from_syntax( 283 NavigationTarget::from_syntax(
283 frange.file_id, 284 frange.file_id,
284 "".into(), 285 "".into(),
@@ -331,7 +332,7 @@ impl ToNav for hir::Local {
331 } 332 }
332 Either::Right(it) => it.syntax().clone(), 333 Either::Right(it) => it.syntax().clone(),
333 }; 334 };
334 let full_range = original_range(db, src.with_value(&node)); 335 let full_range = src.with_value(&node).original_file_range(db);
335 let name = match self.name(db) { 336 let name = match self.name(db) {
336 Some(it) => it.to_string().into(), 337 Some(it) => it.to_string().into(),
337 None => "".into(), 338 None => "".into(),
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs
index 1b6ff6d21..cf04c3de0 100644
--- a/crates/ide/src/hover.rs
+++ b/crates/ide/src/hover.rs
@@ -3357,4 +3357,66 @@ impl Foo {
3357 "#]], 3357 "#]],
3358 ); 3358 );
3359 } 3359 }
3360
3361 #[test]
3362 fn hover_doc_outer_inner() {
3363 check(
3364 r#"
3365/// Be quick;
3366mod Foo<|> {
3367 //! time is mana
3368
3369 /// This comment belongs to the function
3370 fn foo() {}
3371}
3372"#,
3373 expect![[r#"
3374 *Foo*
3375
3376 ```rust
3377 test
3378 ```
3379
3380 ```rust
3381 mod Foo
3382 ```
3383
3384 ---
3385
3386 Be quick;
3387 time is mana
3388 "#]],
3389 );
3390 }
3391
3392 #[test]
3393 fn hover_doc_outer_inner_attribue() {
3394 check(
3395 r#"
3396#[doc = "Be quick;"]
3397mod Foo<|> {
3398 #![doc = "time is mana"]
3399
3400 #[doc = "This comment belongs to the function"]
3401 fn foo() {}
3402}
3403"#,
3404 expect![[r#"
3405 *Foo*
3406
3407 ```rust
3408 test
3409 ```
3410
3411 ```rust
3412 mod Foo
3413 ```
3414
3415 ---
3416
3417 Be quick;
3418 time is mana
3419 "#]],
3420 );
3421 }
3360} 3422}
diff --git a/crates/ide/src/references/rename.rs b/crates/ide/src/references/rename.rs
index 64fe8bd65..44081f210 100644
--- a/crates/ide/src/references/rename.rs
+++ b/crates/ide/src/references/rename.rs
@@ -6,7 +6,7 @@ use std::{
6}; 6};
7 7
8use hir::{Module, ModuleDef, ModuleSource, Semantics}; 8use hir::{Module, ModuleDef, ModuleSource, Semantics};
9use ide_db::base_db::{FileRange, SourceDatabaseExt}; 9use ide_db::base_db::{AnchoredPathBuf, FileRange, SourceDatabaseExt};
10use ide_db::{ 10use ide_db::{
11 defs::{Definition, NameClass, NameRefClass}, 11 defs::{Definition, NameClass, NameRefClass},
12 RootDatabase, 12 RootDatabase,
@@ -182,12 +182,13 @@ fn rename_mod(
182 match src.value { 182 match src.value {
183 ModuleSource::SourceFile(..) => { 183 ModuleSource::SourceFile(..) => {
184 // mod is defined in path/to/dir/mod.rs 184 // mod is defined in path/to/dir/mod.rs
185 let dst = if module.is_mod_rs(sema.db) { 185 let path = if module.is_mod_rs(sema.db) {
186 format!("../{}/mod.rs", new_name) 186 format!("../{}/mod.rs", new_name)
187 } else { 187 } else {
188 format!("{}.rs", new_name) 188 format!("{}.rs", new_name)
189 }; 189 };
190 let move_file = FileSystemEdit::MoveFile { src: file_id, anchor: file_id, dst }; 190 let dst = AnchoredPathBuf { anchor: file_id, path };
191 let move_file = FileSystemEdit::MoveFile { src: file_id, dst };
191 file_system_edits.push(move_file); 192 file_system_edits.push(move_file);
192 } 193 }
193 ModuleSource::Module(..) => {} 194 ModuleSource::Module(..) => {}
@@ -771,10 +772,12 @@ mod foo<|>;
771 src: FileId( 772 src: FileId(
772 2, 773 2,
773 ), 774 ),
774 anchor: FileId( 775 dst: AnchoredPathBuf {
775 2, 776 anchor: FileId(
776 ), 777 2,
777 dst: "foo2.rs", 778 ),
779 path: "foo2.rs",
780 },
778 }, 781 },
779 ], 782 ],
780 is_snippet: false, 783 is_snippet: false,
@@ -837,10 +840,12 @@ use crate::foo<|>::FooContent;
837 src: FileId( 840 src: FileId(
838 1, 841 1,
839 ), 842 ),
840 anchor: FileId( 843 dst: AnchoredPathBuf {
841 1, 844 anchor: FileId(
842 ), 845 1,
843 dst: "quux.rs", 846 ),
847 path: "quux.rs",
848 },
844 }, 849 },
845 ], 850 ],
846 is_snippet: false, 851 is_snippet: false,
@@ -884,10 +889,12 @@ mod fo<|>o;
884 src: FileId( 889 src: FileId(
885 1, 890 1,
886 ), 891 ),
887 anchor: FileId( 892 dst: AnchoredPathBuf {
888 1, 893 anchor: FileId(
889 ), 894 1,
890 dst: "../foo2/mod.rs", 895 ),
896 path: "../foo2/mod.rs",
897 },
891 }, 898 },
892 ], 899 ],
893 is_snippet: false, 900 is_snippet: false,
@@ -932,10 +939,12 @@ mod outer { mod fo<|>o; }
932 src: FileId( 939 src: FileId(
933 1, 940 1,
934 ), 941 ),
935 anchor: FileId( 942 dst: AnchoredPathBuf {
936 1, 943 anchor: FileId(
937 ), 944 1,
938 dst: "bar.rs", 945 ),
946 path: "bar.rs",
947 },
939 }, 948 },
940 ], 949 ],
941 is_snippet: false, 950 is_snippet: false,
@@ -1016,10 +1025,12 @@ pub mod foo<|>;
1016 src: FileId( 1025 src: FileId(
1017 2, 1026 2,
1018 ), 1027 ),
1019 anchor: FileId( 1028 dst: AnchoredPathBuf {
1020 2, 1029 anchor: FileId(
1021 ), 1030 2,
1022 dst: "foo2.rs", 1031 ),
1032 path: "foo2.rs",
1033 },
1023 }, 1034 },
1024 ], 1035 ],
1025 is_snippet: false, 1036 is_snippet: false,