Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/signatures.rs')
| -rw-r--r-- | crates/hir-def/src/signatures.rs | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/crates/hir-def/src/signatures.rs b/crates/hir-def/src/signatures.rs index aedfaaa6aa..e58befae20 100644 --- a/crates/hir-def/src/signatures.rs +++ b/crates/hir-def/src/signatures.rs @@ -8,9 +8,9 @@ use hir_expand::{ InFile, Intern, Lookup, name::{AsName, Name}, }; -use intern::{Symbol, sym}; +use intern::sym; use la_arena::{Arena, Idx}; -use rustc_abi::{IntegerType, ReprOptions}; +use rustc_abi::{ExternAbi, IntegerType, ReprOptions}; use syntax::{ AstNode, NodeOrToken, SyntaxNodePtr, T, ast::{self, HasGenericParams, HasName, HasVisibility, IsString}, @@ -607,7 +607,7 @@ pub struct FunctionSignature { pub store: ExpressionStore, pub params: Box<[TypeRefId]>, pub ret_type: Option<TypeRefId>, - pub abi: Option<Symbol>, + pub abi: ExternAbi, pub flags: FnFlags, } @@ -677,14 +677,18 @@ impl FunctionSignature { .abi() .map(|abi| { abi.abi_string() - .map_or_else(|| sym::C, |it| Symbol::intern(it.text_without_quotes())) + .and_then(|abi| abi.text_without_quotes().parse().ok()) + .unwrap_or(ExternAbi::FALLBACK) }) .or_else(|| match loc.container { - ItemContainerId::ExternBlockId(extern_block) => extern_block_abi(db, extern_block), + ItemContainerId::ExternBlockId(extern_block) => { + Some(extern_block_abi(db, extern_block)) + } ItemContainerId::ModuleId(_) | ItemContainerId::ImplId(_) | ItemContainerId::TraitId(_) => None, - }); + }) + .unwrap_or(ExternAbi::Rust); let (store, source_map, generic_params, params, ret_type, self_param, variadic) = lower_function(db, module, source, id); if self_param { @@ -771,8 +775,6 @@ impl FunctionSignature { pub fn is_intrinsic(db: &dyn DefDatabase, id: FunctionId) -> bool { let data = FunctionSignature::of(db, id); data.flags.contains(FnFlags::RUSTC_INTRINSIC) - // Keep this around for a bit until extern "rustc-intrinsic" abis are no longer used - || data.abi.as_ref().is_some_and(|abi| *abi == sym::rust_dash_intrinsic) } } @@ -1136,16 +1138,12 @@ impl EnumVariants { } } -pub(crate) fn extern_block_abi( - db: &dyn DefDatabase, - extern_block: ExternBlockId, -) -> Option<Symbol> { +#[salsa::tracked] +pub(crate) fn extern_block_abi(db: &dyn DefDatabase, extern_block: ExternBlockId) -> ExternAbi { let source = extern_block.lookup(db).source(db); - source.value.abi().map(|abi| { - match abi.abi_string() { - Some(tok) => Symbol::intern(tok.text_without_quotes()), - // `extern` default to be `extern "C"`. - _ => sym::C, - } - }) + source + .value + .abi() + .and_then(|abi| abi.abi_string()?.text_without_quotes().parse().ok()) + .unwrap_or(ExternAbi::FALLBACK) } |