diff options
Diffstat (limited to 'crates/ide/src/runnables.rs')
-rw-r--r-- | crates/ide/src/runnables.rs | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/crates/ide/src/runnables.rs b/crates/ide/src/runnables.rs index 96462a7b0..a2a0ad43d 100644 --- a/crates/ide/src/runnables.rs +++ b/crates/ide/src/runnables.rs | |||
@@ -2,7 +2,7 @@ use std::fmt; | |||
2 | 2 | ||
3 | use assists::utils::test_related_attribute; | 3 | use assists::utils::test_related_attribute; |
4 | use cfg::CfgExpr; | 4 | use cfg::CfgExpr; |
5 | use hir::{AsAssocItem, Attrs, HirFileId, InFile, Semantics}; | 5 | use hir::{AsAssocItem, HasAttrs, InFile, Semantics}; |
6 | use ide_db::RootDatabase; | 6 | use ide_db::RootDatabase; |
7 | use itertools::Itertools; | 7 | use itertools::Itertools; |
8 | use syntax::{ | 8 | use syntax::{ |
@@ -105,7 +105,7 @@ pub(crate) fn runnable( | |||
105 | match item { | 105 | match item { |
106 | ast::Struct(it) => runnable_struct(sema, it, file_id), | 106 | ast::Struct(it) => runnable_struct(sema, it, file_id), |
107 | ast::Fn(it) => runnable_fn(sema, it, file_id), | 107 | ast::Fn(it) => runnable_fn(sema, it, file_id), |
108 | ast::Module(it) => runnable_mod(sema, it, file_id), | 108 | ast::Module(it) => runnable_mod(sema, it), |
109 | _ => None, | 109 | _ => None, |
110 | } | 110 | } |
111 | } | 111 | } |
@@ -116,9 +116,10 @@ fn runnable_fn( | |||
116 | fn_def: ast::Fn, | 116 | fn_def: ast::Fn, |
117 | file_id: FileId, | 117 | file_id: FileId, |
118 | ) -> Option<Runnable> { | 118 | ) -> Option<Runnable> { |
119 | let def = sema.to_def(&fn_def)?; | ||
119 | let name_string = fn_def.name()?.text().to_string(); | 120 | let name_string = fn_def.name()?.text().to_string(); |
120 | 121 | ||
121 | let attrs = Attrs::from_attrs_owner(sema.db, InFile::new(HirFileId::from(file_id), &fn_def)); | 122 | let attrs = def.attrs(sema.db); |
122 | let kind = if name_string == "main" { | 123 | let kind = if name_string == "main" { |
123 | RunnableKind::Bin | 124 | RunnableKind::Bin |
124 | } else { | 125 | } else { |
@@ -189,10 +190,10 @@ fn runnable_struct( | |||
189 | struct_def: ast::Struct, | 190 | struct_def: ast::Struct, |
190 | file_id: FileId, | 191 | file_id: FileId, |
191 | ) -> Option<Runnable> { | 192 | ) -> Option<Runnable> { |
193 | let def = sema.to_def(&struct_def)?; | ||
192 | let name_string = struct_def.name()?.text().to_string(); | 194 | let name_string = struct_def.name()?.text().to_string(); |
193 | 195 | ||
194 | let attrs = | 196 | let attrs = def.attrs(sema.db); |
195 | Attrs::from_attrs_owner(sema.db, InFile::new(HirFileId::from(file_id), &struct_def)); | ||
196 | if !has_runnable_doc_test(&attrs) { | 197 | if !has_runnable_doc_test(&attrs) { |
197 | return None; | 198 | return None; |
198 | } | 199 | } |
@@ -262,11 +263,7 @@ fn has_runnable_doc_test(attrs: &hir::Attrs) -> bool { | |||
262 | }) | 263 | }) |
263 | } | 264 | } |
264 | 265 | ||
265 | fn runnable_mod( | 266 | fn runnable_mod(sema: &Semantics<RootDatabase>, module: ast::Module) -> Option<Runnable> { |
266 | sema: &Semantics<RootDatabase>, | ||
267 | module: ast::Module, | ||
268 | file_id: FileId, | ||
269 | ) -> Option<Runnable> { | ||
270 | if !has_test_function_or_multiple_test_submodules(&module) { | 267 | if !has_test_function_or_multiple_test_submodules(&module) { |
271 | return None; | 268 | return None; |
272 | } | 269 | } |
@@ -279,7 +276,8 @@ fn runnable_mod( | |||
279 | .filter_map(|it| it.name(sema.db)) | 276 | .filter_map(|it| it.name(sema.db)) |
280 | .join("::"); | 277 | .join("::"); |
281 | 278 | ||
282 | let attrs = Attrs::from_attrs_owner(sema.db, InFile::new(HirFileId::from(file_id), &module)); | 279 | let def = sema.to_def(&module)?; |
280 | let attrs = def.attrs(sema.db); | ||
283 | let cfg = attrs.cfg(); | 281 | let cfg = attrs.cfg(); |
284 | let nav = module_def.to_nav(sema.db); | 282 | let nav = module_def.to_nav(sema.db); |
285 | Some(Runnable { nav, kind: RunnableKind::TestMod { path }, cfg }) | 283 | Some(Runnable { nav, kind: RunnableKind::TestMod { path }, cfg }) |