Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/span/src/lib.rs')
-rw-r--r--crates/span/src/lib.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/crates/span/src/lib.rs b/crates/span/src/lib.rs
index bd270bfe2b..e12575b9b1 100644
--- a/crates/span/src/lib.rs
+++ b/crates/span/src/lib.rs
@@ -1,6 +1,7 @@
//! File and span related types.
use std::fmt::{self, Write};
+#[cfg(feature = "ra-salsa")]
use ra_salsa::InternId;
mod ast_id;
@@ -355,3 +356,71 @@ impl HirFileId {
}
}
}
+
+#[cfg(not(feature = "ra-salsa"))]
+mod intern_id_proxy {
+ use std::fmt;
+ use std::num::NonZeroU32;
+
+ pub(super) struct InternId {
+ value: NonZeroU32,
+ }
+
+ impl InternId {
+ pub(super) const MAX: u32 = 0xFFFF_FF00;
+
+ pub(super) const unsafe fn new_unchecked(value: u32) -> Self {
+ debug_assert!(value < InternId::MAX);
+ let value = unsafe { NonZeroU32::new_unchecked(value + 1) };
+ InternId { value }
+ }
+
+ pub(super) fn as_u32(self) -> u32 {
+ self.value.get() - 1
+ }
+
+ pub(super) fn as_usize(self) -> usize {
+ self.as_u32() as usize
+ }
+ }
+
+ impl From<InternId> for u32 {
+ fn from(raw: InternId) -> u32 {
+ raw.as_u32()
+ }
+ }
+
+ impl From<InternId> for usize {
+ fn from(raw: InternId) -> usize {
+ raw.as_usize()
+ }
+ }
+
+ impl From<u32> for InternId {
+ fn from(id: u32) -> InternId {
+ assert!(id < InternId::MAX);
+ unsafe { InternId::new_unchecked(id) }
+ }
+ }
+
+ impl From<usize> for InternId {
+ fn from(id: usize) -> InternId {
+ assert!(id < (InternId::MAX as usize));
+ unsafe { InternId::new_unchecked(id as u32) }
+ }
+ }
+
+ impl fmt::Debug for InternId {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ self.as_usize().fmt(f)
+ }
+ }
+
+ impl fmt::Display for InternId {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ self.as_usize().fmt(f)
+ }
+ }
+}
+#[cfg(not(feature = "ra-salsa"))]
+use intern_id_proxy::InternId;