diff options
author | Paul Daniel Faria <[email protected]> | 2020-08-08 19:14:18 +0100 |
---|---|---|
committer | Paul Daniel Faria <[email protected]> | 2020-08-08 19:14:18 +0100 |
commit | 6cde0b1aa0f6b8623c6b81b2396f4a0345891233 (patch) | |
tree | 9d558ee8eeace0aadf241c190248d008e362d17f /crates/ra_hir | |
parent | a69f19a6a5899bdfb6fc498371650bf54263deff (diff) |
Add support for extern crate
This adds syntax highlighting, hover and goto def
functionality for extern crate
Diffstat (limited to 'crates/ra_hir')
-rw-r--r-- | crates/ra_hir/src/semantics.rs | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/crates/ra_hir/src/semantics.rs b/crates/ra_hir/src/semantics.rs index 307b336f2..e392130ab 100644 --- a/crates/ra_hir/src/semantics.rs +++ b/crates/ra_hir/src/semantics.rs | |||
@@ -8,7 +8,7 @@ use hir_def::{ | |||
8 | resolver::{self, HasResolver, Resolver}, | 8 | resolver::{self, HasResolver, Resolver}, |
9 | AsMacroCall, FunctionId, TraitId, VariantId, | 9 | AsMacroCall, FunctionId, TraitId, VariantId, |
10 | }; | 10 | }; |
11 | use hir_expand::{diagnostics::AstDiagnostic, hygiene::Hygiene, ExpansionInfo}; | 11 | use hir_expand::{diagnostics::AstDiagnostic, hygiene::Hygiene, name::AsName, ExpansionInfo}; |
12 | use hir_ty::associated_type_shorthand_candidates; | 12 | use hir_ty::associated_type_shorthand_candidates; |
13 | use itertools::Itertools; | 13 | use itertools::Itertools; |
14 | use ra_db::{FileId, FileRange}; | 14 | use ra_db::{FileId, FileRange}; |
@@ -24,8 +24,8 @@ use crate::{ | |||
24 | diagnostics::Diagnostic, | 24 | diagnostics::Diagnostic, |
25 | semantics::source_to_def::{ChildContainer, SourceToDefCache, SourceToDefCtx}, | 25 | semantics::source_to_def::{ChildContainer, SourceToDefCache, SourceToDefCtx}, |
26 | source_analyzer::{resolve_hir_path, resolve_hir_path_qualifier, SourceAnalyzer}, | 26 | source_analyzer::{resolve_hir_path, resolve_hir_path_qualifier, SourceAnalyzer}, |
27 | AssocItem, Callable, Field, Function, HirFileId, ImplDef, InFile, Local, MacroDef, Module, | 27 | AssocItem, Callable, Crate, Field, Function, HirFileId, ImplDef, InFile, Local, MacroDef, |
28 | ModuleDef, Name, Origin, Path, ScopeDef, Trait, Type, TypeAlias, TypeParam, VariantDef, | 28 | Module, ModuleDef, Name, Origin, Path, ScopeDef, Trait, Type, TypeAlias, TypeParam, VariantDef, |
29 | }; | 29 | }; |
30 | use resolver::TypeNs; | 30 | use resolver::TypeNs; |
31 | 31 | ||
@@ -228,6 +228,10 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { | |||
228 | self.imp.resolve_path(path) | 228 | self.imp.resolve_path(path) |
229 | } | 229 | } |
230 | 230 | ||
231 | pub fn resolve_extern_crate(&self, extern_crate: &ast::ExternCrate) -> Option<Crate> { | ||
232 | self.imp.resolve_extern_crate(extern_crate) | ||
233 | } | ||
234 | |||
231 | pub fn resolve_variant(&self, record_lit: ast::RecordExpr) -> Option<VariantDef> { | 235 | pub fn resolve_variant(&self, record_lit: ast::RecordExpr) -> Option<VariantDef> { |
232 | self.imp.resolve_variant(record_lit).map(VariantDef::from) | 236 | self.imp.resolve_variant(record_lit).map(VariantDef::from) |
233 | } | 237 | } |
@@ -443,6 +447,17 @@ impl<'db> SemanticsImpl<'db> { | |||
443 | self.analyze(path.syntax()).resolve_path(self.db, path) | 447 | self.analyze(path.syntax()).resolve_path(self.db, path) |
444 | } | 448 | } |
445 | 449 | ||
450 | fn resolve_extern_crate(&self, extern_crate: &ast::ExternCrate) -> Option<Crate> { | ||
451 | let krate = self.scope(extern_crate.syntax()).krate()?; | ||
452 | krate.dependencies(self.db).into_iter().find_map(|dep| { | ||
453 | if dep.name == extern_crate.name_ref()?.as_name() { | ||
454 | Some(dep.krate) | ||
455 | } else { | ||
456 | None | ||
457 | } | ||
458 | }) | ||
459 | } | ||
460 | |||
446 | fn resolve_variant(&self, record_lit: ast::RecordExpr) -> Option<VariantId> { | 461 | fn resolve_variant(&self, record_lit: ast::RecordExpr) -> Option<VariantId> { |
447 | self.analyze(record_lit.syntax()).resolve_variant(self.db, record_lit) | 462 | self.analyze(record_lit.syntax()).resolve_variant(self.db, record_lit) |
448 | } | 463 | } |
@@ -612,6 +627,10 @@ impl<'a> SemanticsScope<'a> { | |||
612 | Some(Module { id: self.resolver.module()? }) | 627 | Some(Module { id: self.resolver.module()? }) |
613 | } | 628 | } |
614 | 629 | ||
630 | pub fn krate(&self) -> Option<Crate> { | ||
631 | Some(Crate { id: self.resolver.krate()? }) | ||
632 | } | ||
633 | |||
615 | /// Note: `FxHashSet<TraitId>` should be treated as an opaque type, passed into `Type | 634 | /// Note: `FxHashSet<TraitId>` should be treated as an opaque type, passed into `Type |
616 | // FIXME: rename to visible_traits to not repeat scope? | 635 | // FIXME: rename to visible_traits to not repeat scope? |
617 | pub fn traits_in_scope(&self) -> FxHashSet<TraitId> { | 636 | pub fn traits_in_scope(&self) -> FxHashSet<TraitId> { |