2015-06-01 3 views
9

मेरे पास एक लिंट है जो 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_idsis_empty विधि के साथ एक विशेषता के लिए उपयुक्त प्रविष्टि है। अफसोस, निम्नलिखित उदाहरण के लिए:

struct One; 
impl One { fn is_empty(self: &Self) -> bool { false } } 

मैं किसी भी impl आइटम है, जो थोड़ा दुर्भाग्यपूर्ण है के लिए कोई TraitOrItemId मिला है। क्या कोई मुझे रुस्ट करने के लिए गुप्त कर सकता है मुझे मेरे इम्प्ले आइटम ढूंढने में मदद करता है?

उत्तर

4

मुझे मिल गया! समस्या यह थी कि के लिए नहीं, प्रकार टाइप करने के लिए मैं DefId प्राप्त करने का प्रयास कर रहा था। cx.tcx.inherent_impls.get(id) के माध्यम से जाने से मुझे DefId एस का निहित अंतर्निहित इंप्रेशन के लिए एक वीसीसी मिली, जिसे मैं पहले से लागू impl_items लुकअप के माध्यम से पूछताछ कर सकता था।

उदाहरण कार्यान्वयन के लिए rust-clippy/src/len_zero.rs में देखें। संपादित करें: नोट कार्यान्वयन है कि हे (एन) जहां एन प्रकार के तरीकों (या तो प्रत्यक्ष impl या लक्षण के आधार पर) की संख्या है - शायद rustc किसी दिन एक तेजी से देखने की अनुमति देगा ...

संबंधित मुद्दे