Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/semantics.rs')
-rw-r--r--crates/hir/src/semantics.rs59
1 files changed, 27 insertions, 32 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index 4e9e3c44be..9996162485 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -10,7 +10,7 @@ use std::{
ops::{self, ControlFlow, Not},
};
-use base_db::FxIndexSet;
+use base_db::{FxIndexSet, all_crates, toolchain_channel};
use either::Either;
use hir_def::{
BuiltinDeriveImplId, DefWithBodyId, ExpressionStoreOwnerId, HasModule, MacroId, StructId,
@@ -24,6 +24,7 @@ use hir_def::{
};
use hir_expand::{
EditionedFileId, ExpandResult, FileRange, HirFileId, InMacroFile, MacroCallId,
+ attrs::AstPathExt,
builtin::{BuiltinFnLikeExpander, EagerExpander},
db::ExpandDatabase,
files::{FileRangeWrapper, HirFileRange, InRealFile},
@@ -298,14 +299,15 @@ impl<DB: HirDatabase + ?Sized> Semantics<'_, DB> {
hir_expand::attrs::expand_cfg_attr::<Infallible>(
extra_crate_attrs.chain(ast::attrs_including_inner(&item)),
cfg_options,
- |attr, _, _, _| {
- let hir_expand::attrs::Meta::TokenTree { path, tt } = attr else {
+ |attr, _| {
+ let ast::Meta::TokenTreeMeta(attr) = attr else {
return ControlFlow::Continue(());
};
- if path.segments.len() != 1 {
+ let (Some(segment), Some(tt)) = (attr.path().as_one_segment(), attr.token_tree())
+ else {
return ControlFlow::Continue(());
- }
- let lint_attr = match path.segments[0].text() {
+ };
+ let lint_attr = match &*segment {
"allow" => LintAttr::Allow,
"expect" => LintAttr::Expect,
"warn" => LintAttr::Warn,
@@ -392,7 +394,7 @@ impl<DB: HirDatabase + ?Sized> Semantics<'_, DB> {
}
pub fn is_nightly(&self, krate: Crate) -> bool {
- let toolchain = self.db.toolchain_channel(krate.into());
+ let toolchain = toolchain_channel(self.db.as_dyn_database(), krate.into());
// `toolchain == None` means we're in some detached files. Since we have no information on
// the toolchain being used, let's just allow unstable items to be listed.
matches!(toolchain, Some(base_db::ReleaseChannel::Nightly) | None)
@@ -458,7 +460,7 @@ impl<'db> SemanticsImpl<'db> {
pub fn parse(&self, file_id: EditionedFileId) -> ast::SourceFile {
let hir_file_id = file_id.into();
- let tree = self.db.parse(file_id).tree();
+ let tree = file_id.parse(self.db).tree();
self.cache(tree.syntax().clone(), hir_file_id);
tree
}
@@ -467,7 +469,7 @@ impl<'db> SemanticsImpl<'db> {
pub fn first_crate(&self, file: FileId) -> Option<Crate> {
match self.file_to_module_defs(file).next() {
Some(module) => Some(module.krate(self.db)),
- None => self.db.all_crates().last().copied().map(Into::into),
+ None => all_crates(self.db).last().copied().map(Into::into),
}
}
@@ -484,7 +486,7 @@ impl<'db> SemanticsImpl<'db> {
pub fn parse_guess_edition(&self, file_id: FileId) -> ast::SourceFile {
let file_id = self.attach_first_edition(file_id);
- let tree = self.db.parse(file_id).tree();
+ let tree = file_id.parse(self.db).tree();
self.cache(tree.syntax().clone(), file_id.into());
tree
}
@@ -554,17 +556,6 @@ impl<'db> SemanticsImpl<'db> {
Some(InFile::new(file_id.into(), node))
}
- pub fn check_cfg_attr(&self, attr: &ast::TokenTree) -> Option<bool> {
- let file_id = self.find_file(attr.syntax()).file_id;
- let krate = match file_id {
- HirFileId::FileId(file_id) => {
- self.file_to_module_defs(file_id.file_id(self.db)).next()?.krate(self.db).id
- }
- HirFileId::MacroFile(macro_file) => self.db.lookup_intern_macro_call(macro_file).krate,
- };
- hir_expand::check_cfg_attr_value(self.db, attr, krate)
- }
-
/// Expands the macro if it isn't one of the built-in ones that expand to custom syntax or dummy
/// expansions.
pub fn expand_allowed_builtins(
@@ -608,8 +599,8 @@ impl<'db> SemanticsImpl<'db> {
Some(self.expand(macro_call_id).map(|it| InFile::new(macro_call_id.into(), it)))
}
- pub fn expand_derive_as_pseudo_attr_macro(&self, attr: &ast::Attr) -> Option<SyntaxNode> {
- let adt = attr.syntax().parent().and_then(ast::Adt::cast)?;
+ pub fn expand_derive_as_pseudo_attr_macro(&self, attr: &ast::Meta) -> Option<SyntaxNode> {
+ let adt = attr.parent_attr()?.syntax().parent().and_then(ast::Adt::cast)?;
let src = self.wrap_node_infile(attr.clone());
let call_id = self.with_ctx(|ctx| {
ctx.attr_to_derive_macro_call(src.with_value(&adt), src).map(|(_, it, _)| it)
@@ -617,7 +608,7 @@ impl<'db> SemanticsImpl<'db> {
Some(self.parse_or_expand(call_id.into()))
}
- pub fn resolve_derive_macro(&self, attr: &ast::Attr) -> Option<Vec<Option<Macro>>> {
+ pub fn resolve_derive_macro(&self, attr: &ast::Meta) -> Option<Vec<Option<Macro>>> {
let calls = self.derive_macro_calls(attr)?;
self.with_ctx(|ctx| {
Some(
@@ -644,7 +635,7 @@ impl<'db> SemanticsImpl<'db> {
pub fn expand_derive_macro(
&self,
- attr: &ast::Attr,
+ attr: &ast::Meta,
) -> Option<Vec<Option<ExpandResult<SyntaxNode>>>> {
let res: Vec<_> = self
.derive_macro_calls(attr)?
@@ -662,9 +653,9 @@ impl<'db> SemanticsImpl<'db> {
fn derive_macro_calls(
&self,
- attr: &ast::Attr,
+ attr: &ast::Meta,
) -> Option<Vec<Option<Either<MacroCallId, BuiltinDeriveImplId>>>> {
- let adt = attr.syntax().parent().and_then(ast::Adt::cast)?;
+ let adt = attr.parent_attr()?.syntax().parent().and_then(ast::Adt::cast)?;
let file_id = self.find_file(adt.syntax()).file_id;
let adt = InFile::new(file_id, &adt);
let src = InFile::new(file_id, attr.clone());
@@ -773,7 +764,11 @@ impl<'db> SemanticsImpl<'db> {
let attr = self.wrap_node_infile(actual_macro_call.clone());
let adt = actual_macro_call.syntax().parent().and_then(ast::Adt::cast)?;
let macro_call_id = self.with_ctx(|ctx| {
- ctx.attr_to_derive_macro_call(attr.with_value(&adt), attr).map(|(_, it, _)| it)
+ ctx.attr_to_derive_macro_call(
+ attr.with_value(&adt),
+ attr.with_value(attr.value.meta()?),
+ )
+ .map(|(_, it, _)| it)
})?;
hir_expand::db::expand_speculative(
self.db,
@@ -1328,7 +1323,7 @@ impl<'db> SemanticsImpl<'db> {
// text ranges of the outer ones, and then all of the inner ones up
// to the invoking attribute so that the inbetween is ignored.
// FIXME: Should cfg_attr be handled differently?
- let (attr, _, _, _) = attr_ids
+ let (attr, _) = attr_ids
.invoc_attr()
.find_attr_range_with_source(db, loc.krate, &item);
let start = attr.syntax().text_range().start();
@@ -1435,7 +1430,7 @@ impl<'db> SemanticsImpl<'db> {
let derive_call = ctx
.attr_to_derive_macro_call(
InFile::new(expansion, &adt),
- InFile::new(expansion, attr.clone()),
+ InFile::new(expansion, meta.clone()),
)?
.1;
@@ -2461,7 +2456,7 @@ fn macro_call_to_macro_id(
Either::Left(it) => {
let node = match it.file_id {
HirFileId::FileId(file_id) => {
- it.to_ptr(db).to_node(&db.parse(file_id).syntax_node())
+ it.to_ptr(db).to_node(&file_id.parse(db).syntax_node())
}
HirFileId::MacroFile(macro_file) => {
let expansion_info = ctx.cache.get_or_insert_expansion(ctx.db, macro_file);
@@ -2473,7 +2468,7 @@ fn macro_call_to_macro_id(
Either::Right(it) => {
let node = match it.file_id {
HirFileId::FileId(file_id) => {
- it.to_ptr(db).to_node(&db.parse(file_id).syntax_node())
+ it.to_ptr(db).to_node(&file_id.parse(db).syntax_node())
}
HirFileId::MacroFile(macro_file) => {
let expansion_info = ctx.cache.get_or_insert_expansion(ctx.db, macro_file);