Wie finde ich eine Methode innerhalb des Compilers mit dem Typ und einem Namen?

9

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:

%Vor%

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?

    
llogiq 01.06.2015, 09:17
quelle

1 Antwort

4

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 ...

    
llogiq 01.06.2015, 10:16
quelle

Tags und Links