2015-03-12 6 views
6

Wenn ich mit der rechten Maustaste auf ein Symbol klicke und den Befehl Find Usages ReSharper ausführt, scheint ReSharper die meiste Zeit damit zu verbringen, nach Resx-Dateien zu suchen. In der Mehrzahl der Fälle, in denen der Fortschrittsdialog sichtbar ist, sind die in diesem Dialogfeld angezeigten Dateinamen verschiedene .resx-Dateien in der Lösung.Warum sucht der Befehl ReSharper Find Usages resx-Dateien?

screenshot

Ist Dateien ReSharper Benutzer tatsächlich .resx? Warum sollte es das tun, und warum würde es so lange dauern? Kann ich dieses Verhalten ändern?


Einrichtung: ReSharper 8.2.0.2160 C# Edition. Visual Studio 2013 Premium.

Was ich habe versucht:

  • resx als Maske zum Items To Skip R # Präferenz-Code Inspection Hinzufügen, aber das macht keinen Unterschied
  • Verbräuche Suche erweiterte, deaktivieren Sie das Textuelle Vorkommen Option. Macht keinen Unterschied

Antwort

8

Die Antwort darauf ist alles wegen ReSharper zugrundeliegender Architektur. Beim Bearbeiten von Dateien erstellt ReSharper einen abstrakten Syntaxbaum, und jeder Knoten in der Struktur kann eine oder mehrere Referenzen auf ein Element im semantischen Modell haben. Mit anderen Worten, die Foo in dem Ausdruck new Foo(42) wird einen Verweis auf das semantische Element haben, das die Klasse Foo beschreibt. Jede Datei enthält viele Referenzen, da jede Verwendung eines Elements (Variable, Parameter, Methode, Eigenschaft, CSS-Klasse, HTML-Farbe, Dateisystempfad usw.) über eine oder mehrere Referenzen auf die Deklaration dieses Elements verfügt.

Diese Referenzen sind sehr mächtig. Sie aktivieren Ctrl + Klicken Sie auf Navigation, indem Sie einfach zu den Ziel (en) der Referenz navigieren. Sie können Code-Vervollständigung bereitstellen, indem sie die Kandidatenziele anzeigen, die eine Referenz an der aktuellen Stelle im Code erfüllen würden.

Und natürlich, sie auch Power Find Usages, durch die Suche nach allen Referenzen, die auf ein bestimmtes Element abzielen. Dies erfordert jedoch eine Rückwärtsbewegung vom Ziel zur Referenz. Der Brute-Force-Ansatz würde erfordern, das Ziel jeder Referenz in jeder Datei zu überprüfen und zu versuchen, das Ziel zu finden. Dies würde eindeutig nicht skalieren, und der Datensatz ist zu groß zum Zwischenspeichern.

Damit Find Usages in einer vernünftigen Zeitskala ausgeführt werden, verwaltet ReSharper auch einen Wortindex aller Wörter, die in allen Dateien verwendet werden (dies hilft auch bei der normalen Navigation). Wenn Sie Usage auf einem Symbol aufrufen (z. B. EnterDate im Screenshot in der Frage), verwendet ReSharper den Wortindex, um die zu suchenden Dateien einzugrenzen - es würde nach EnterDate suchen und nur die Dateien verwenden, die das Wort enthalten . Sobald die Anzahl der zu durchsuchenden Dateien reduziert wurde, müssen alle Referenzen gefunden werden, die auf das ursprüngliche Element ausgerichtet sind. Zu diesem Zweck wird der Syntaxbaum jeder Datei in der Teilmenge durchlaufen. Jeder Knoten wird auf Referenzen geprüft, die mit dem Namen des gesuchten Symbols übereinstimmen, z. EnterDate. Wenn es übereinstimmt, wird die Referenz aufgelöst, und das Ziel wird überprüft, um festzustellen, ob es mit demselben Element übereinstimmt - der EnterDate-Klasse oder der Eigenschaft oder was auch immer es tatsächlich war. Wenn es auf das erwartete Ziel verweist, wird es der Sammlung von Verwendungen hinzugefügt und für den Benutzer angezeigt.

(Die Dinge sind etwas komplexer als dies, dass in einer Referenz mehrere Namen haben könnte, zum Beispiel, wenn Sie versuchen und Verwendungen finden auf [Pure] muss ReSharper sowohl Pure oder PureAttribute alle Nutzungen finden. Zum Glück, diese alternativen Namen sind auch im Wortindex gespeichert und zur Reduzierung der zu durchsuchenden Dateien verwendet. Bei der Überprüfung der Referenzen werden alle alternativen Namen überprüft.)

Wenn Sie also eine RESX-Datei mit dem Text EnterDate haben, Es wird nach einem Verweis auf das Element EnterDate gesucht, das Sie suchen. ReSharper wird den Syntaxbaum der .resx-Datei durchsuchen und jede Referenz überprüfen, um festzustellen, ob sie mitübereinstimmt.

Wir überprüfen alle Dateien, auch wenn es für den Benutzer offensichtlich erscheint, dass das Zielelement in dieser Datei möglicherweise nicht verwendet werden kann, da wir zulassen, dass Verweise übergreifend sind. Das heißt, eine VB-Datei kann auf ein C# -Element verweisen, oder eine HTML-Datei kann auf ein CSS-Element verweisen, oder eine XAML-Datei verweist auf ein C# -Methodenelement und so weiter. Es gibt also keine Filterung auf "vernünftige" Verwendung. Wenn z. B. EnterDate eine Klasse ist, können Sie als Benutzer feststellen, dass sie sich nicht in einer RESX-Datei befindet, aber ReSharper kann das nicht wissen. Schließlich ist es völlig in Ordnung, einen Klassennamen im Attribut type einer Datei web.config oder als Parameter für typeof in einer VB-Datei zu verwenden. Oder ein Plugin könnte einen Referenzanbieter hinzufügen, der die Verwendung von Typnamen in RESX-Dateien ermöglicht. So behalten wir die Dinge einfach und durchsuchen alle Kandidatenreferenzen, auch wenn es im Fortschrittsdialog möglicherweise seltsam aussieht.

+0

Danke für die super detaillierte Antwort. Ich dachte, dass "AST" und "Wortindizes" an einer Erklärung beteiligt sein würden, warum resx-Dateien überprüft werden. Macht Sinn. Ich denke, die wirkliche Lösung für meine Situation besteht darin, Wege zu finden, um unsere große Code-Basis aufzulösen, die alle unsere Tools leistungsfähiger machen würde. –

+0

Oh, ich habe das Performance-Bit vergessen :) Ich weiß nicht, warum es mit .resx-Dateien langsamer sein sollte als alles andere - die Suche nach Verwendungen sollte ziemlich schnell sein, sogar bei großen Codebasen. Die einzige Zeit, die es langsam sein sollte, ist, wenn Sie nach etwas suchen, das vielen Dateien wie "Klasse" gemeinsam ist. Sie können Profile mithilfe des Profils im Hilfemenü im Profil finden und es absenden, oder versuchen Sie 9.1 EAP, um zu sehen, ob es dort besser ist - Find Usages hatte Updates in 9.0. – citizenmatt

+1

Diese Antwort erklärt nicht, ob man dieses Verhalten ändern kann (z. B. AST-Bäume für ".resx" -Dateien zu bauen ...) und "wir prüfen alle Dateien" ist eine Entscheidung, die ich dem Benutzer überlassen sollte. –

Verwandte Themen