मेरे पास एक लिंट है जो x.len() == 0
पर चेतावनी देती है, जो इसके बजाय x.is_empty()
का उपयोग करने का सुझाव देती है। हालांकि, अगर x
में is_empty(self: &Self)
विधि है तो मैं झूठी सकारात्मकताओं से छुटकारा पाना चाहता था।प्रकार और नाम दिए गए कंपाइलर के भीतर कोई विधि कैसे देखें?
इस प्रकार rustc के भीतर से तरीकों को देखने के लिए खोज शुरू हुई।
प्रथम चरण, x
मिल: मैं एक ExprMethodCall(ref method, _, ref args)
करने के लिए Expr
की node
का मिलान नहीं हुआ (और यह सुनिश्चित करें कि args.len() == 1
और method.node.as_str() == "len"
बनाया) और बस &*args[0]
इस्तेमाल किया है, जो मैं अब से expr
कॉल करेंगे।
अगला चरण, x
का प्रकार प्राप्त करें: यह आसानी से rustc::middle::ty::expr_ty(cx.tcx, expr)
का उपयोग करके किया जा सकता है। ध्यान दें कि यह rustc::middle::ty::Ty
है (और syntax::ast::Ty
नहीं, जिससे कुछ भ्रम पैदा हुआ)।
तरीकों को देखने के लिए, ctxt.impl_items
और ctxt.trait_item_def_ids
होनहार देखा, तो मैं rustc::middle::ty::ty::ty_to_def_id(ty)
के साथ अपने प्रकार के लिए DefId
हो और आईडी प्राप्त करने की कोशिश। हालांकि, इस पद्धति में कुछ समस्या है:
लिए
let x = [1, 2];
x.len() == 2 // <- lookee here
मैं बस नहीं DefId है। यह ठीक है, क्योंकि हमारे पास उस मामले में ty_vec
है, और std::vec::Vec
दोनों len()
और is_empty()
दोनों के लिए जाना जाता है।
अच्छा संदेश यह है कि ctxt.trait_item_def_ids
is_empty
विधि के साथ एक विशेषता के लिए उपयुक्त प्रविष्टि है। अफसोस, निम्नलिखित उदाहरण के लिए:
struct One;
impl One { fn is_empty(self: &Self) -> bool { false } }
मैं किसी भी impl आइटम है, जो थोड़ा दुर्भाग्यपूर्ण है के लिए कोई TraitOrItemId
मिला है। क्या कोई मुझे रुस्ट करने के लिए गुप्त कर सकता है मुझे मेरे इम्प्ले आइटम ढूंढने में मदद करता है?