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?
İlk adım, x
olsun: Ben bir Expr
ExprMethodCall(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?