2015-06-01 19 views
9

x.len() == 0 üzerinde uyarıyor, bunun yerine x.is_empty() kullanılmasını öneren bir ipim var. Ancak, x'un is_empty(self: &Self) yöntemine sahip olmaması durumunda yanlış pozitiflerden kurtulmak istedim. Derleyici içinde türü ve adı verilen bir yöntem nasıl aranır?

Böylece rustc içinden yöntemleri aramak için arayışı başladı.

İlk adım, x olsun: Ben bir ExprExprMethodCall(ref method, _, ref args) ila node eşleşti (ve emin args.len() == 1 ve method.node.as_str() == "len" yapılmış) Bundan sonra expr arayacak olan &*args[0] kullanılan ve sadece.

Sonraki adım, x tipini almak: Bu kolayca rustc::middle::ty::expr_ty(cx.tcx, expr) kullanılarak yapılabilir. Bu bir rustc::middle::ty::Ty (ve bazı karışıklıklara yol açan bir syntax::ast::Ty değil) olduğunu unutmayın.

ctxt.impl_items ve ctxt.trait_item_def_ids umut verici görünüyordu, yöntemler aramak için, bu yüzden rustc::middle::ty::ty::ty_to_def_id(ty) ile benim türü için DefId olsun ve kimlikleri elde etmeye çalışmak. Ancak, bu yaklaşım birkaç sorun vardır:

let x = [1, 2]; 
x.len() == 2 // <- lookee here 

için ben sadece hayır DefId var. Yani, biz bu durumda bir ty_vec çünkü olsa ok ve std::vec::Vec len() ve is_empty() ikisine de sahip olduğu bilinmektedir.

iyi bir mesaj ctxt.trait_item_def_ids bir is_empty yöntemi ile bir özellik için uygun bir giriş var olmasıdır. Ne yazık ki, şu örneğin:

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

ben biraz talihsiz herhangi impl öğesi için hiçbir TraitOrItemId aldık. Rustc'e özel birisi benim impl öğelerimi bulmama yardım edebilir mi?

cevap

4

Aldım! Sorun, impl için değil tip için bir DefId almaya çalışıyorum. cx.tcx.inherent_impls.get(id) geçiyor ben o zaman ben zaten uygulanan impl_items araması ile sorgulayabilir olabilir doğasında impls, bana DefId s a Daha fazla verdi. örnek uygulama için rust-clippy/src/len_zero.rs yılında

bak. Düzenleme: Uygulama O (K) N tip yöntemleri (direkt impl veya özelliklerin yoluyla) sayısıdır olduğunu unutmayın - ... belki rustc birgün daha hızlı arama sağlayacak

İlgili konular