Ich habe einen Lint, der auf x.len() == 0
warnt, was darauf hindeutet, stattdessen x.is_empty()
zu verwenden. Allerdings wollte ich die falsch positiven Ergebnisse loswerden, wenn x
keine is_empty(self: &Self)
Methode hat.
So begann die Suche nach Methoden innerhalb von Rustc.
Erster Schritt, hole x
: Ich habe die node
von Expr
bis ExprMethodCall(ref method, _, ref args)
gefunden (und sichergestellt, dass args.len() == 1
und method.node.as_str() == "len"
) und nur &*args[0]
verwendet, was ich auch getan habe Rufen Sie von jetzt an expr
auf.
Nächster Schritt, erhalten Sie den Typ von x
: Dies kann einfach mit rustc::middle::ty::expr_ty(cx.tcx, expr)
getan werden. Beachten Sie, dass dies ein rustc::middle::ty::Ty
(und nicht ein syntax::ast::Ty
ist, was zu einiger Verwirrung führte).
Um die Methoden nachzuschlagen, sahen die ctxt.impl_items
und ctxt.trait_item_def_ids
vielversprechend aus, also erhalte ich die DefId
für meinen Typ mit rustc::middle::ty::ty::ty_to_def_id(ty)
und versuche, die IDs zu bekommen. Dieser Ansatz hat jedoch einige Probleme:
Für
%Vor% Ich habe einfach keine DefID. Das ist aber in Ordnung, weil wir in diesem Fall ty_vec
haben, und std::vec::Vec
hat bekanntermaßen sowohl len()
als auch is_empty()
.
Die gute Nachricht ist, dass der ctxt.trait_item_def_ids
einen passenden Eintrag für ein Merkmal mit einer is_empty
Methode hat. Leider, für das folgende Beispiel:
Ich habe kein TraitOrItemId
für irgendeinen Impl-Gegenstand bekommen, was ein bisschen unglücklich ist. Kann jemand, der eingeweiht ist, mir helfen, meine Impl-Gegenstände zu finden?
Ich habe es! Das Problem war, dass ich versuche, eine DefId für den -Typ zu bekommen, nicht für den impl
. Wenn ich cx.tcx.inherent_impls.get(id)
durchging, erhielt ich ein Vec von DefId
s für inhärente Impls, die ich dann über die impl_items
lookup abfragen konnte, die ich bereits implementiert hatte.
Schauen Sie in rust-clippy / src / len_zero.rs nach für eine Beispielimplementierung. Bearbeiten: Beachten Sie, dass die Implementierung O (N) ist, wobei N die Anzahl der Methoden des Typs ist (entweder direkt impl
oder nach Merkmalen) - vielleicht wird rustc eines Tages erlauben Sie eine schnellere Suche ...