diff options
author | Aleksey Kladov <[email protected]> | 2020-01-16 16:33:07 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2020-01-16 16:33:07 +0000 |
commit | 595b06a1b8fcd215c828d65ee1dd1a30c2697de9 (patch) | |
tree | f8c33cb55704c2023a5f999ebb46fda0ba4c48ab /crates/ra_ide | |
parent | 9a6c26e34806a05260170029ace4b64adf484a23 (diff) |
Create modules via SourceBinder
Diffstat (limited to 'crates/ra_ide')
-rw-r--r-- | crates/ra_ide/src/completion/completion_context.rs | 10 | ||||
-rw-r--r-- | crates/ra_ide/src/diagnostics.rs | 6 | ||||
-rw-r--r-- | crates/ra_ide/src/impls.rs | 18 | ||||
-rw-r--r-- | crates/ra_ide/src/parent_module.rs | 29 | ||||
-rw-r--r-- | crates/ra_ide/src/references/classify.rs | 22 | ||||
-rw-r--r-- | crates/ra_ide/src/references/name_definition.rs | 2 | ||||
-rw-r--r-- | crates/ra_ide/src/runnables.rs | 4 |
7 files changed, 37 insertions, 54 deletions
diff --git a/crates/ra_ide/src/completion/completion_context.rs b/crates/ra_ide/src/completion/completion_context.rs index 48d69f7e5..deaacda6c 100644 --- a/crates/ra_ide/src/completion/completion_context.rs +++ b/crates/ra_ide/src/completion/completion_context.rs | |||
@@ -52,15 +52,11 @@ impl<'a> CompletionContext<'a> { | |||
52 | original_parse: &'a Parse<ast::SourceFile>, | 52 | original_parse: &'a Parse<ast::SourceFile>, |
53 | position: FilePosition, | 53 | position: FilePosition, |
54 | ) -> Option<CompletionContext<'a>> { | 54 | ) -> Option<CompletionContext<'a>> { |
55 | let src = hir::ModuleSource::from_position(db, position); | 55 | let mut sb = hir::SourceBinder::new(db); |
56 | let module = hir::Module::from_definition( | 56 | let module = sb.to_module_def(position.file_id); |
57 | db, | ||
58 | hir::InFile { file_id: position.file_id.into(), value: src }, | ||
59 | ); | ||
60 | let token = | 57 | let token = |
61 | original_parse.tree().syntax().token_at_offset(position.offset).left_biased()?; | 58 | original_parse.tree().syntax().token_at_offset(position.offset).left_biased()?; |
62 | let analyzer = hir::SourceAnalyzer::new( | 59 | let analyzer = sb.analyze( |
63 | db, | ||
64 | hir::InFile::new(position.file_id.into(), &token.parent()), | 60 | hir::InFile::new(position.file_id.into(), &token.parent()), |
65 | Some(position.offset), | 61 | Some(position.offset), |
66 | ); | 62 | ); |
diff --git a/crates/ra_ide/src/diagnostics.rs b/crates/ra_ide/src/diagnostics.rs index 478368529..f403b3bcf 100644 --- a/crates/ra_ide/src/diagnostics.rs +++ b/crates/ra_ide/src/diagnostics.rs | |||
@@ -23,6 +23,7 @@ pub enum Severity { | |||
23 | 23 | ||
24 | pub(crate) fn diagnostics(db: &RootDatabase, file_id: FileId) -> Vec<Diagnostic> { | 24 | pub(crate) fn diagnostics(db: &RootDatabase, file_id: FileId) -> Vec<Diagnostic> { |
25 | let _p = profile("diagnostics"); | 25 | let _p = profile("diagnostics"); |
26 | let mut sb = hir::SourceBinder::new(db); | ||
26 | let parse = db.parse(file_id); | 27 | let parse = db.parse(file_id); |
27 | let mut res = Vec::new(); | 28 | let mut res = Vec::new(); |
28 | 29 | ||
@@ -108,10 +109,7 @@ pub(crate) fn diagnostics(db: &RootDatabase, file_id: FileId) -> Vec<Diagnostic> | |||
108 | fix: Some(fix), | 109 | fix: Some(fix), |
109 | }) | 110 | }) |
110 | }); | 111 | }); |
111 | let source_file = db.parse(file_id).tree(); | 112 | if let Some(m) = sb.to_module_def(file_id) { |
112 | let src = | ||
113 | hir::InFile { file_id: file_id.into(), value: hir::ModuleSource::SourceFile(source_file) }; | ||
114 | if let Some(m) = hir::Module::from_definition(db, src) { | ||
115 | m.diagnostics(db, &mut sink); | 113 | m.diagnostics(db, &mut sink); |
116 | }; | 114 | }; |
117 | drop(sink); | 115 | drop(sink); |
diff --git a/crates/ra_ide/src/impls.rs b/crates/ra_ide/src/impls.rs index fb9396195..9834025d3 100644 --- a/crates/ra_ide/src/impls.rs +++ b/crates/ra_ide/src/impls.rs | |||
@@ -1,6 +1,6 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use hir::{ImplBlock, SourceBinder}; | 3 | use hir::{Crate, ImplBlock, SourceBinder}; |
4 | use ra_db::SourceDatabase; | 4 | use ra_db::SourceDatabase; |
5 | use ra_syntax::{algo::find_node_at_offset, ast, AstNode}; | 5 | use ra_syntax::{algo::find_node_at_offset, ast, AstNode}; |
6 | 6 | ||
@@ -14,21 +14,17 @@ pub(crate) fn goto_implementation( | |||
14 | let syntax = parse.tree().syntax().clone(); | 14 | let syntax = parse.tree().syntax().clone(); |
15 | let mut sb = SourceBinder::new(db); | 15 | let mut sb = SourceBinder::new(db); |
16 | 16 | ||
17 | let src = hir::ModuleSource::from_position(db, position); | 17 | let krate = sb.to_module_def(position.file_id)?.krate(); |
18 | let module = hir::Module::from_definition( | ||
19 | db, | ||
20 | hir::InFile { file_id: position.file_id.into(), value: src }, | ||
21 | )?; | ||
22 | 18 | ||
23 | if let Some(nominal_def) = find_node_at_offset::<ast::NominalDef>(&syntax, position.offset) { | 19 | if let Some(nominal_def) = find_node_at_offset::<ast::NominalDef>(&syntax, position.offset) { |
24 | return Some(RangeInfo::new( | 20 | return Some(RangeInfo::new( |
25 | nominal_def.syntax().text_range(), | 21 | nominal_def.syntax().text_range(), |
26 | impls_for_def(&mut sb, position, &nominal_def, module)?, | 22 | impls_for_def(&mut sb, position, &nominal_def, krate)?, |
27 | )); | 23 | )); |
28 | } else if let Some(trait_def) = find_node_at_offset::<ast::TraitDef>(&syntax, position.offset) { | 24 | } else if let Some(trait_def) = find_node_at_offset::<ast::TraitDef>(&syntax, position.offset) { |
29 | return Some(RangeInfo::new( | 25 | return Some(RangeInfo::new( |
30 | trait_def.syntax().text_range(), | 26 | trait_def.syntax().text_range(), |
31 | impls_for_trait(&mut sb, position, &trait_def, module)?, | 27 | impls_for_trait(&mut sb, position, &trait_def, krate)?, |
32 | )); | 28 | )); |
33 | } | 29 | } |
34 | 30 | ||
@@ -39,7 +35,7 @@ fn impls_for_def( | |||
39 | sb: &mut SourceBinder<RootDatabase>, | 35 | sb: &mut SourceBinder<RootDatabase>, |
40 | position: FilePosition, | 36 | position: FilePosition, |
41 | node: &ast::NominalDef, | 37 | node: &ast::NominalDef, |
42 | module: hir::Module, | 38 | krate: Crate, |
43 | ) -> Option<Vec<NavigationTarget>> { | 39 | ) -> Option<Vec<NavigationTarget>> { |
44 | let ty = match node { | 40 | let ty = match node { |
45 | ast::NominalDef::StructDef(def) => { | 41 | ast::NominalDef::StructDef(def) => { |
@@ -56,7 +52,6 @@ fn impls_for_def( | |||
56 | } | 52 | } |
57 | }; | 53 | }; |
58 | 54 | ||
59 | let krate = module.krate(); | ||
60 | let impls = ImplBlock::all_in_crate(sb.db, krate); | 55 | let impls = ImplBlock::all_in_crate(sb.db, krate); |
61 | 56 | ||
62 | Some( | 57 | Some( |
@@ -72,12 +67,11 @@ fn impls_for_trait( | |||
72 | sb: &mut SourceBinder<RootDatabase>, | 67 | sb: &mut SourceBinder<RootDatabase>, |
73 | position: FilePosition, | 68 | position: FilePosition, |
74 | node: &ast::TraitDef, | 69 | node: &ast::TraitDef, |
75 | module: hir::Module, | 70 | krate: Crate, |
76 | ) -> Option<Vec<NavigationTarget>> { | 71 | ) -> Option<Vec<NavigationTarget>> { |
77 | let src = hir::InFile { file_id: position.file_id.into(), value: node.clone() }; | 72 | let src = hir::InFile { file_id: position.file_id.into(), value: node.clone() }; |
78 | let tr = sb.to_def(src)?; | 73 | let tr = sb.to_def(src)?; |
79 | 74 | ||
80 | let krate = module.krate(); | ||
81 | let impls = ImplBlock::for_trait(sb.db, krate, tr); | 75 | let impls = ImplBlock::for_trait(sb.db, krate, tr); |
82 | 76 | ||
83 | Some(impls.into_iter().map(|imp| imp.to_nav(sb.db)).collect()) | 77 | Some(impls.into_iter().map(|imp| imp.to_nav(sb.db)).collect()) |
diff --git a/crates/ra_ide/src/parent_module.rs b/crates/ra_ide/src/parent_module.rs index f5a788c07..2dbccfc3b 100644 --- a/crates/ra_ide/src/parent_module.rs +++ b/crates/ra_ide/src/parent_module.rs | |||
@@ -1,17 +1,23 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use ra_db::{CrateId, FileId, FilePosition, SourceDatabase}; | 3 | use ra_db::{CrateId, FileId, FilePosition, SourceDatabase}; |
4 | use ra_syntax::{ | ||
5 | algo::find_node_at_offset, | ||
6 | ast::{self, AstNode}, | ||
7 | }; | ||
4 | 8 | ||
5 | use crate::{db::RootDatabase, NavigationTarget}; | 9 | use crate::{db::RootDatabase, NavigationTarget}; |
6 | 10 | ||
7 | /// This returns `Vec` because a module may be included from several places. We | 11 | /// This returns `Vec` because a module may be included from several places. We |
8 | /// don't handle this case yet though, so the Vec has length at most one. | 12 | /// don't handle this case yet though, so the Vec has length at most one. |
9 | pub(crate) fn parent_module(db: &RootDatabase, position: FilePosition) -> Vec<NavigationTarget> { | 13 | pub(crate) fn parent_module(db: &RootDatabase, position: FilePosition) -> Vec<NavigationTarget> { |
10 | let src = hir::ModuleSource::from_position(db, position); | 14 | let mut sb = hir::SourceBinder::new(db); |
11 | let module = match hir::Module::from_definition( | 15 | let parse = db.parse(position.file_id); |
12 | db, | 16 | let module = match find_node_at_offset::<ast::Module>(parse.tree().syntax(), position.offset) { |
13 | hir::InFile { file_id: position.file_id.into(), value: src }, | 17 | Some(module) => sb.to_def(hir::InFile::new(position.file_id.into(), module)), |
14 | ) { | 18 | None => sb.to_module_def(position.file_id), |
19 | }; | ||
20 | let module = match module { | ||
15 | None => return Vec::new(), | 21 | None => return Vec::new(), |
16 | Some(it) => it, | 22 | Some(it) => it, |
17 | }; | 23 | }; |
@@ -21,14 +27,11 @@ pub(crate) fn parent_module(db: &RootDatabase, position: FilePosition) -> Vec<Na | |||
21 | 27 | ||
22 | /// Returns `Vec` for the same reason as `parent_module` | 28 | /// Returns `Vec` for the same reason as `parent_module` |
23 | pub(crate) fn crate_for(db: &RootDatabase, file_id: FileId) -> Vec<CrateId> { | 29 | pub(crate) fn crate_for(db: &RootDatabase, file_id: FileId) -> Vec<CrateId> { |
24 | let source_file = db.parse(file_id).tree(); | 30 | let mut sb = hir::SourceBinder::new(db); |
25 | let src = hir::ModuleSource::SourceFile(source_file); | 31 | let module = match sb.to_module_def(file_id) { |
26 | let module = | 32 | Some(it) => it, |
27 | match hir::Module::from_definition(db, hir::InFile { file_id: file_id.into(), value: src }) | 33 | None => return Vec::new(), |
28 | { | 34 | }; |
29 | Some(it) => it, | ||
30 | None => return Vec::new(), | ||
31 | }; | ||
32 | let krate = module.krate(); | 35 | let krate = module.krate(); |
33 | vec![krate.into()] | 36 | vec![krate.into()] |
34 | } | 37 | } |
diff --git a/crates/ra_ide/src/references/classify.rs b/crates/ra_ide/src/references/classify.rs index cb7da1fff..46cba30a3 100644 --- a/crates/ra_ide/src/references/classify.rs +++ b/crates/ra_ide/src/references/classify.rs | |||
@@ -1,6 +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::{InFile, Module, ModuleSource, PathResolution, SourceBinder}; | 3 | use hir::{InFile, PathResolution, SourceBinder}; |
4 | use ra_prof::profile; | 4 | use ra_prof::profile; |
5 | use ra_syntax::{ast, match_ast, AstNode}; | 5 | use ra_syntax::{ast, match_ast, AstNode}; |
6 | use test_utils::tested_by; | 6 | use test_utils::tested_by; |
@@ -35,16 +35,7 @@ pub(crate) fn classify_name( | |||
35 | Some(from_struct_field(sb.db, field)) | 35 | Some(from_struct_field(sb.db, field)) |
36 | }, | 36 | }, |
37 | ast::Module(it) => { | 37 | ast::Module(it) => { |
38 | let def = { | 38 | let def = sb.to_def(name.with_value(it))?; |
39 | if !it.has_semi() { | ||
40 | let ast = hir::ModuleSource::Module(it); | ||
41 | let src = name.with_value(ast); | ||
42 | hir::Module::from_definition(sb.db, src) | ||
43 | } else { | ||
44 | let src = name.with_value(it); | ||
45 | sb.to_def(src) | ||
46 | } | ||
47 | }?; | ||
48 | Some(from_module_def(sb.db, def.into(), None)) | 39 | Some(from_module_def(sb.db, def.into(), None)) |
49 | }, | 40 | }, |
50 | ast::StructDef(it) => { | 41 | ast::StructDef(it) => { |
@@ -103,8 +94,7 @@ pub(crate) fn classify_name( | |||
103 | let src = name.with_value(it); | 94 | let src = name.with_value(it); |
104 | let def = sb.to_def(src.clone())?; | 95 | let def = sb.to_def(src.clone())?; |
105 | 96 | ||
106 | let module_src = ModuleSource::from_child_node(sb.db, src.as_ref().map(|it| it.syntax())); | 97 | let module = sb.to_module_def(src.file_id.original_file(sb.db))?; |
107 | let module = Module::from_definition(sb.db, src.with_value(module_src))?; | ||
108 | 98 | ||
109 | Some(NameDefinition { | 99 | Some(NameDefinition { |
110 | visibility: None, | 100 | visibility: None, |
@@ -157,10 +147,9 @@ pub(crate) fn classify_name_ref( | |||
157 | } | 147 | } |
158 | } | 148 | } |
159 | 149 | ||
160 | let ast = ModuleSource::from_child_node(sb.db, name_ref.with_value(&parent)); | ||
161 | // FIXME: find correct container and visibility for each case | 150 | // FIXME: find correct container and visibility for each case |
162 | let container = Module::from_definition(sb.db, name_ref.with_value(ast))?; | ||
163 | let visibility = None; | 151 | let visibility = None; |
152 | let container = sb.to_module_def(name_ref.file_id.original_file(sb.db))?; | ||
164 | 153 | ||
165 | if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { | 154 | if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { |
166 | tested_by!(goto_def_for_macros); | 155 | tested_by!(goto_def_for_macros); |
@@ -178,12 +167,13 @@ pub(crate) fn classify_name_ref( | |||
178 | PathResolution::Def(def) => Some(from_module_def(sb.db, def, Some(container))), | 167 | PathResolution::Def(def) => Some(from_module_def(sb.db, def, Some(container))), |
179 | PathResolution::AssocItem(item) => Some(from_assoc_item(sb.db, item)), | 168 | PathResolution::AssocItem(item) => Some(from_assoc_item(sb.db, item)), |
180 | PathResolution::Local(local) => { | 169 | PathResolution::Local(local) => { |
181 | let container = local.module(sb.db); | ||
182 | let kind = NameKind::Local(local); | 170 | let kind = NameKind::Local(local); |
171 | let container = local.module(sb.db); | ||
183 | Some(NameDefinition { kind, container, visibility: None }) | 172 | Some(NameDefinition { kind, container, visibility: None }) |
184 | } | 173 | } |
185 | PathResolution::TypeParam(par) => { | 174 | PathResolution::TypeParam(par) => { |
186 | let kind = NameKind::TypeParam(par); | 175 | let kind = NameKind::TypeParam(par); |
176 | let container = par.module(sb.db); | ||
187 | Some(NameDefinition { kind, container, visibility }) | 177 | Some(NameDefinition { kind, container, visibility }) |
188 | } | 178 | } |
189 | PathResolution::Macro(def) => { | 179 | PathResolution::Macro(def) => { |
diff --git a/crates/ra_ide/src/references/name_definition.rs b/crates/ra_ide/src/references/name_definition.rs index 8c67c8863..1e4226ab9 100644 --- a/crates/ra_ide/src/references/name_definition.rs +++ b/crates/ra_ide/src/references/name_definition.rs | |||
@@ -25,6 +25,8 @@ pub enum NameKind { | |||
25 | #[derive(PartialEq, Eq)] | 25 | #[derive(PartialEq, Eq)] |
26 | pub(crate) struct NameDefinition { | 26 | pub(crate) struct NameDefinition { |
27 | pub visibility: Option<ast::Visibility>, | 27 | pub visibility: Option<ast::Visibility>, |
28 | /// FIXME: this doesn't really make sense. For example, builtin types don't | ||
29 | /// really have a module. | ||
28 | pub container: Module, | 30 | pub container: Module, |
29 | pub kind: NameKind, | 31 | pub kind: NameKind, |
30 | } | 32 | } |
diff --git a/crates/ra_ide/src/runnables.rs b/crates/ra_ide/src/runnables.rs index e213e1a06..7533692f6 100644 --- a/crates/ra_ide/src/runnables.rs +++ b/crates/ra_ide/src/runnables.rs | |||
@@ -66,8 +66,8 @@ fn runnable_mod(db: &RootDatabase, file_id: FileId, module: ast::Module) -> Opti | |||
66 | return None; | 66 | return None; |
67 | } | 67 | } |
68 | let range = module.syntax().text_range(); | 68 | let range = module.syntax().text_range(); |
69 | let src = hir::ModuleSource::from_child_node(db, InFile::new(file_id.into(), &module.syntax())); | 69 | let mut sb = hir::SourceBinder::new(db); |
70 | let module = hir::Module::from_definition(db, InFile::new(file_id.into(), src))?; | 70 | let module = sb.to_def(InFile::new(file_id.into(), module))?; |
71 | 71 | ||
72 | let path = module.path_to_root(db).into_iter().rev().filter_map(|it| it.name(db)).join("::"); | 72 | let path = module.path_to_root(db).into_iter().rev().filter_map(|it| it.name(db)).join("::"); |
73 | Some(Runnable { range, kind: RunnableKind::TestMod { path } }) | 73 | Some(Runnable { range, kind: RunnableKind::TestMod { path } }) |