diff options
author | Seivan Heidari <[email protected]> | 2019-11-18 19:53:40 +0000 |
---|---|---|
committer | Seivan Heidari <[email protected]> | 2019-11-18 19:53:40 +0000 |
commit | 4bdb6351ac557851607df9d142c9e573c0fb5e1d (patch) | |
tree | 48b349958afceeeebecccd63e55004d5a924baff /crates/ra_ide_api/src/references/classify.rs | |
parent | aceeb0b85ee8228503f970ea602af71ff22216a0 (diff) | |
parent | a4f21801c54c65eafa337edc5e86de2c46b37544 (diff) |
Merge branch 'master' of https://github.com/rust-analyzer/rust-analyzer into feature/themes
Diffstat (limited to 'crates/ra_ide_api/src/references/classify.rs')
-rw-r--r-- | crates/ra_ide_api/src/references/classify.rs | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/crates/ra_ide_api/src/references/classify.rs b/crates/ra_ide_api/src/references/classify.rs index 5ca9da15e..ea9d20e71 100644 --- a/crates/ra_ide_api/src/references/classify.rs +++ b/crates/ra_ide_api/src/references/classify.rs | |||
@@ -1,7 +1,6 @@ | |||
1 | //! Functions that are used to classify an element from its definition or reference. | 1 | //! Functions that are used to classify an element from its definition or reference. |
2 | 2 | ||
3 | use hir::{FromSource, Module, ModuleSource, Path, PathResolution, Source, SourceAnalyzer}; | 3 | use hir::{FromSource, Module, ModuleSource, Path, PathResolution, Source, SourceAnalyzer}; |
4 | use ra_db::FileId; | ||
5 | use ra_prof::profile; | 4 | use ra_prof::profile; |
6 | use ra_syntax::{ast, match_ast, AstNode}; | 5 | use ra_syntax::{ast, match_ast, AstNode}; |
7 | use test_utils::tested_by; | 6 | use test_utils::tested_by; |
@@ -12,19 +11,14 @@ use super::{ | |||
12 | }; | 11 | }; |
13 | use crate::db::RootDatabase; | 12 | use crate::db::RootDatabase; |
14 | 13 | ||
15 | pub(crate) fn classify_name( | 14 | pub(crate) fn classify_name(db: &RootDatabase, name: Source<&ast::Name>) -> Option<NameDefinition> { |
16 | db: &RootDatabase, | ||
17 | file_id: FileId, | ||
18 | name: &ast::Name, | ||
19 | ) -> Option<NameDefinition> { | ||
20 | let _p = profile("classify_name"); | 15 | let _p = profile("classify_name"); |
21 | let parent = name.syntax().parent()?; | 16 | let parent = name.ast.syntax().parent()?; |
22 | let file_id = file_id.into(); | ||
23 | 17 | ||
24 | match_ast! { | 18 | match_ast! { |
25 | match parent { | 19 | match parent { |
26 | ast::BindPat(it) => { | 20 | ast::BindPat(it) => { |
27 | let src = hir::Source { file_id, ast: it }; | 21 | let src = name.with_ast(it); |
28 | let local = hir::Local::from_source(db, src)?; | 22 | let local = hir::Local::from_source(db, src)?; |
29 | Some(NameDefinition { | 23 | Some(NameDefinition { |
30 | visibility: None, | 24 | visibility: None, |
@@ -34,7 +28,7 @@ pub(crate) fn classify_name( | |||
34 | }, | 28 | }, |
35 | ast::RecordFieldDef(it) => { | 29 | ast::RecordFieldDef(it) => { |
36 | let ast = hir::FieldSource::Named(it); | 30 | let ast = hir::FieldSource::Named(it); |
37 | let src = hir::Source { file_id, ast }; | 31 | let src = name.with_ast(ast); |
38 | let field = hir::StructField::from_source(db, src)?; | 32 | let field = hir::StructField::from_source(db, src)?; |
39 | Some(from_struct_field(db, field)) | 33 | Some(from_struct_field(db, field)) |
40 | }, | 34 | }, |
@@ -42,42 +36,42 @@ pub(crate) fn classify_name( | |||
42 | let def = { | 36 | let def = { |
43 | if !it.has_semi() { | 37 | if !it.has_semi() { |
44 | let ast = hir::ModuleSource::Module(it); | 38 | let ast = hir::ModuleSource::Module(it); |
45 | let src = hir::Source { file_id, ast }; | 39 | let src = name.with_ast(ast); |
46 | hir::Module::from_definition(db, src) | 40 | hir::Module::from_definition(db, src) |
47 | } else { | 41 | } else { |
48 | let src = hir::Source { file_id, ast: it }; | 42 | let src = name.with_ast(it); |
49 | hir::Module::from_declaration(db, src) | 43 | hir::Module::from_declaration(db, src) |
50 | } | 44 | } |
51 | }?; | 45 | }?; |
52 | Some(from_module_def(db, def.into(), None)) | 46 | Some(from_module_def(db, def.into(), None)) |
53 | }, | 47 | }, |
54 | ast::StructDef(it) => { | 48 | ast::StructDef(it) => { |
55 | let src = hir::Source { file_id, ast: it }; | 49 | let src = name.with_ast(it); |
56 | let def = hir::Struct::from_source(db, src)?; | 50 | let def = hir::Struct::from_source(db, src)?; |
57 | Some(from_module_def(db, def.into(), None)) | 51 | Some(from_module_def(db, def.into(), None)) |
58 | }, | 52 | }, |
59 | ast::EnumDef(it) => { | 53 | ast::EnumDef(it) => { |
60 | let src = hir::Source { file_id, ast: it }; | 54 | let src = name.with_ast(it); |
61 | let def = hir::Enum::from_source(db, src)?; | 55 | let def = hir::Enum::from_source(db, src)?; |
62 | Some(from_module_def(db, def.into(), None)) | 56 | Some(from_module_def(db, def.into(), None)) |
63 | }, | 57 | }, |
64 | ast::TraitDef(it) => { | 58 | ast::TraitDef(it) => { |
65 | let src = hir::Source { file_id, ast: it }; | 59 | let src = name.with_ast(it); |
66 | let def = hir::Trait::from_source(db, src)?; | 60 | let def = hir::Trait::from_source(db, src)?; |
67 | Some(from_module_def(db, def.into(), None)) | 61 | Some(from_module_def(db, def.into(), None)) |
68 | }, | 62 | }, |
69 | ast::StaticDef(it) => { | 63 | ast::StaticDef(it) => { |
70 | let src = hir::Source { file_id, ast: it }; | 64 | let src = name.with_ast(it); |
71 | let def = hir::Static::from_source(db, src)?; | 65 | let def = hir::Static::from_source(db, src)?; |
72 | Some(from_module_def(db, def.into(), None)) | 66 | Some(from_module_def(db, def.into(), None)) |
73 | }, | 67 | }, |
74 | ast::EnumVariant(it) => { | 68 | ast::EnumVariant(it) => { |
75 | let src = hir::Source { file_id, ast: it }; | 69 | let src = name.with_ast(it); |
76 | let def = hir::EnumVariant::from_source(db, src)?; | 70 | let def = hir::EnumVariant::from_source(db, src)?; |
77 | Some(from_module_def(db, def.into(), None)) | 71 | Some(from_module_def(db, def.into(), None)) |
78 | }, | 72 | }, |
79 | ast::FnDef(it) => { | 73 | ast::FnDef(it) => { |
80 | let src = hir::Source { file_id, ast: it }; | 74 | let src = name.with_ast(it); |
81 | let def = hir::Function::from_source(db, src)?; | 75 | let def = hir::Function::from_source(db, src)?; |
82 | if parent.parent().and_then(ast::ItemList::cast).is_some() { | 76 | if parent.parent().and_then(ast::ItemList::cast).is_some() { |
83 | Some(from_assoc_item(db, def.into())) | 77 | Some(from_assoc_item(db, def.into())) |
@@ -86,7 +80,7 @@ pub(crate) fn classify_name( | |||
86 | } | 80 | } |
87 | }, | 81 | }, |
88 | ast::ConstDef(it) => { | 82 | ast::ConstDef(it) => { |
89 | let src = hir::Source { file_id, ast: it }; | 83 | let src = name.with_ast(it); |
90 | let def = hir::Const::from_source(db, src)?; | 84 | let def = hir::Const::from_source(db, src)?; |
91 | if parent.parent().and_then(ast::ItemList::cast).is_some() { | 85 | if parent.parent().and_then(ast::ItemList::cast).is_some() { |
92 | Some(from_assoc_item(db, def.into())) | 86 | Some(from_assoc_item(db, def.into())) |
@@ -95,7 +89,7 @@ pub(crate) fn classify_name( | |||
95 | } | 89 | } |
96 | }, | 90 | }, |
97 | ast::TypeAliasDef(it) => { | 91 | ast::TypeAliasDef(it) => { |
98 | let src = hir::Source { file_id, ast: it }; | 92 | let src = name.with_ast(it); |
99 | let def = hir::TypeAlias::from_source(db, src)?; | 93 | let def = hir::TypeAlias::from_source(db, src)?; |
100 | if parent.parent().and_then(ast::ItemList::cast).is_some() { | 94 | if parent.parent().and_then(ast::ItemList::cast).is_some() { |
101 | Some(from_assoc_item(db, def.into())) | 95 | Some(from_assoc_item(db, def.into())) |
@@ -104,11 +98,11 @@ pub(crate) fn classify_name( | |||
104 | } | 98 | } |
105 | }, | 99 | }, |
106 | ast::MacroCall(it) => { | 100 | ast::MacroCall(it) => { |
107 | let src = hir::Source { file_id, ast: it}; | 101 | let src = name.with_ast(it); |
108 | let def = hir::MacroDef::from_source(db, src.clone())?; | 102 | let def = hir::MacroDef::from_source(db, src.clone())?; |
109 | 103 | ||
110 | let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax())); | 104 | let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax())); |
111 | let module = Module::from_definition(db, Source::new(file_id, module_src))?; | 105 | let module = Module::from_definition(db, src.with_ast(module_src))?; |
112 | 106 | ||
113 | Some(NameDefinition { | 107 | Some(NameDefinition { |
114 | visibility: None, | 108 | visibility: None, |