Merge pull request #21171 from Veykril/push-puuqoostoysw

minor: Option-box `crate_lang_items` query result
diff --git a/crates/hir-def/src/lang_item.rs b/crates/hir-def/src/lang_item.rs
index 9feca9f..3f2cf09 100644
--- a/crates/hir-def/src/lang_item.rs
+++ b/crates/hir-def/src/lang_item.rs
@@ -31,8 +31,8 @@
 );
 
 /// Salsa query. This will look for lang items in a specific crate.
-#[salsa_macros::tracked(returns(ref))]
-pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> LangItems {
+#[salsa_macros::tracked(returns(as_deref))]
+pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangItems>> {
     let _p = tracing::info_span!("crate_lang_items_query").entered();
 
     let mut lang_items = LangItems::default();
@@ -93,7 +93,7 @@
         }
     }
 
-    lang_items
+    if lang_items.is_empty() { None } else { Some(Box::new(lang_items)) }
 }
 
 /// Salsa query. Look for a lang items, starting from the specified crate and recursively
@@ -102,7 +102,7 @@
 pub fn lang_items(db: &dyn DefDatabase, start_crate: Crate) -> LangItems {
     let _p = tracing::info_span!("lang_items_query").entered();
 
-    let mut result = crate_lang_items(db, start_crate).clone();
+    let mut result = crate_lang_items(db, start_crate).cloned().unwrap_or_default();
 
     // Our `CrateGraph` eagerly inserts sysroot dependencies like `core` or `std` into dependencies
     // even if the target crate has `#![no_std]`, `#![no_core]` or shadowed sysroot dependencies
@@ -174,6 +174,10 @@
         }
 
         impl LangItems {
+            fn is_empty(&self) -> bool {
+                $( self.$lang_item.is_none() )&&*
+            }
+
             /// Merges `self` with `other`, with preference to `self` items.
             fn merge_prefer_self(&mut self, other: &Self) {
                 $( self.$lang_item = self.$lang_item.or(other.$lang_item); )*