X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=crates%2Fhir%2Fsrc%2Fsemantics.rs;h=75f6b025779587ec935b97b721005d16a043ba8f;hb=749eeef3e75a3acc993fdd454ebadaa7e319509a;hp=0f63de9e725c2533395b93c095bbe271aa7cf97d;hpb=2c0f433fd2e838ae181f87019b6f1fefe33c6f54;p=rust.git diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 0f63de9e725..75f6b025779 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -25,9 +25,9 @@ db::HirDatabase, semantics::source_to_def::{ChildContainer, SourceToDefCache, SourceToDefCtx}, source_analyzer::{resolve_hir_path, resolve_hir_path_as_macro, SourceAnalyzer}, - Access, AssocItem, Callable, ConstParam, Crate, Field, Function, HasSource, HirFileId, Impl, - InFile, Label, LifetimeParam, Local, MacroDef, Module, ModuleDef, Name, Path, ScopeDef, Trait, - Type, TypeAlias, TypeParam, VariantDef, + Access, AssocItem, BuiltinAttr, Callable, ConstParam, Crate, Field, Function, HasSource, + HirFileId, Impl, InFile, Label, LifetimeParam, Local, MacroDef, Module, ModuleDef, Name, Path, + ScopeDef, ToolModule, Trait, Type, TypeAlias, TypeParam, VariantDef, }; #[derive(Debug, Clone, PartialEq, Eq)] @@ -43,6 +43,8 @@ pub enum PathResolution { SelfType(Impl), Macro(MacroDef), AssocItem(AssocItem), + BuiltinAttr(BuiltinAttr), + ToolModule(ToolModule), } impl PathResolution { @@ -63,9 +65,11 @@ fn in_type_ns(&self) -> Option { PathResolution::Def(ModuleDef::TypeAlias(alias)) => { Some(TypeNs::TypeAliasId((*alias).into())) } - PathResolution::Local(_) | PathResolution::Macro(_) | PathResolution::ConstParam(_) => { - None - } + PathResolution::BuiltinAttr(_) + | PathResolution::ToolModule(_) + | PathResolution::Local(_) + | PathResolution::Macro(_) + | PathResolution::ConstParam(_) => None, PathResolution::TypeParam(param) => Some(TypeNs::GenericParam((*param).into())), PathResolution::SelfType(impl_def) => Some(TypeNs::SelfType((*impl_def).into())), PathResolution::AssocItem(AssocItem::Const(_) | AssocItem::Function(_)) => None, @@ -143,6 +147,10 @@ pub fn parse(&self, file_id: FileId) -> ast::SourceFile { self.imp.parse(file_id) } + pub fn parse_or_expand(&self, file_id: HirFileId) -> Option { + self.imp.parse_or_expand(file_id) + } + pub fn expand(&self, macro_call: &ast::MacroCall) -> Option { self.imp.expand(macro_call) } @@ -228,6 +236,7 @@ pub fn token_ancestors_with_macros( token.parent().into_iter().flat_map(move |it| self.ancestors_with_macros(it)) } + /// Iterates the ancestors of the given node, climbing up macro expansions while doing so. pub fn ancestors_with_macros(&self, node: SyntaxNode) -> impl Iterator + '_ { self.imp.ancestors_with_macros(node) } @@ -411,6 +420,12 @@ fn parse(&self, file_id: FileId) -> ast::SourceFile { tree } + fn parse_or_expand(&self, file_id: HirFileId) -> Option { + let node = self.db.parse_or_expand(file_id)?; + self.cache(node.clone(), file_id); + Some(node) + } + fn expand(&self, macro_call: &ast::MacroCall) -> Option { let sa = self.analyze(macro_call.syntax()); let file_id = sa.expand(self.db, InFile::new(sa.file_id, macro_call))?; @@ -838,7 +853,7 @@ fn resolve_macro_call(&self, macro_call: &ast::MacroCall) -> Option { fn resolve_attr_macro_call(&self, item: &ast::Item) -> Option { let item_in_file = self.find_file(item.syntax().clone()).with_value(item.clone()); let macro_call_id = self.with_ctx(|ctx| ctx.item_to_macro_call(item_in_file))?; - Some(MacroDef { id: self.db.lookup_intern_macro(macro_call_id).def }) + Some(MacroDef { id: self.db.lookup_intern_macro_call(macro_call_id).def }) } fn resolve_path(&self, path: &ast::Path) -> Option { @@ -887,13 +902,13 @@ fn to_module_def(&self, file: FileId) -> impl Iterator { } fn scope(&self, node: &SyntaxNode) -> SemanticsScope<'db> { - let sa = self.analyze(node); - SemanticsScope { db: self.db, file_id: sa.file_id, resolver: sa.resolver } + let SourceAnalyzer { file_id, resolver, .. } = self.analyze(node); + SemanticsScope { db: self.db, file_id, resolver } } fn scope_at_offset(&self, node: &SyntaxNode, offset: TextSize) -> SemanticsScope<'db> { - let sa = self.analyze_with_offset(node, offset); - SemanticsScope { db: self.db, file_id: sa.file_id, resolver: sa.resolver } + let SourceAnalyzer { file_id, resolver, .. } = self.analyze_with_offset(node, offset); + SemanticsScope { db: self.db, file_id, resolver } } fn scope_for_def(&self, def: Trait) -> SemanticsScope<'db> { @@ -914,9 +929,11 @@ fn source(&self, def: Def) -> Option> fn analyze(&self, node: &SyntaxNode) -> SourceAnalyzer { self.analyze_impl(node, None) } + fn analyze_with_offset(&self, node: &SyntaxNode, offset: TextSize) -> SourceAnalyzer { self.analyze_impl(node, Some(offset)) } + fn analyze_impl(&self, node: &SyntaxNode, offset: Option) -> SourceAnalyzer { let _p = profile::span("Semantics::analyze_impl"); let node = self.find_file(node.clone()); @@ -1147,8 +1164,7 @@ pub fn krate(&self) -> Option { } /// Note: `FxHashSet` should be treated as an opaque type, passed into `Type - // FIXME: rename to visible_traits to not repeat scope? - pub fn traits_in_scope(&self) -> FxHashSet { + pub fn visible_traits(&self) -> FxHashSet { let resolver = &self.resolver; resolver.traits_in_scope(self.db.upcast()) }