2016-06-22 14 views
3

Ich habe diese Codebasis, die ziemlich groß ist (+/- 500k Zeilen). Ich suche darin nach allen Methodenaufrufen, die einen einzelnen Parameter verwenden und dieser Parameter ist ein bestimmter Typ.Finden Sie alle Methodenaufrufe mit einem bestimmten Parametertyp mit IntelliJ

Das bedeutet, ich möchte in der Lage sein, Verfahren zu finden, ruft wie folgt aus:

public class Foo { } 
public class Bar { } 

public class Doer{ 
    public void doSomethingFoo(Foo foo) { } 
    public void doSomethingObject(Object object) { } 
} 

public class Usage { 
    Doer doer = new Doer(); 
    public doSomething() { 
    Foo anObject = new Foo(); 
    Bar bar = new Bar(); 

    doer.doSomethingFoo(anObject); 
    doer.doSomethingObject(anObject); 

    doer.doSomethingObject(bar); 
    } 
} 

Da sowohl doer.doSomethingFoo(anObject) und doer.doSomethingObject(anObject) genannt werden, diese beiden Aussagen sollten von der Suche zurückgegeben werden. Ebenso wird doer.doSomethingObject(bar) nicht zurückgegeben. Natürlich weiß ich nicht, dass doer existiert.

Ich versuche, die strukturelle Suche von IntelliJ dazu zu verwenden.

$Instance$ -> Text/regexp = .* 
$Method$ -> Text/regexp = .* 
$Parameter$ -> Text/regexp = Foo 
       Minimum count = 1  // Minimum one Foo parameter 
       Maximum count = 1  // Maximum one Foo parameter 

Dies gibt alles, was einen Parameter foo (Groß- und Kleinschreibung, scheinbar) genannt hat: Ich habe die folgende Vorlage $Instance$.$Method$($Parameter$), mit den folgenden Parametern verwendet. Also mache ich hier wahrscheinlich etwas falsch. Aber was? Wie kann ich alle Aufrufe an eine Methode erhalten, bei der der einzige Parameter vom Typ Foo ist?

Antwort

1

Sie sind fast da. Alles, was Sie jetzt tun müssen, ist die Expression type (regexp) von $ Parameter $ auf Foo und lassen Sie Text/regexp leer. Zusätzlich können Sie das Kontrollkästchen Apply constraint within type hierarchy aktivieren, um auch Unterklassen von Foo zu finden.

Beachten Sie, dass Sie die Text/regexp aller Variablen leer lassen können. Dies entspricht .*.

+0

Das ist einfach toll! Ich glaube jedoch nicht, dass ich es wirklich selbst gefunden hätte: Die Texte scheinen nicht wirklich klar zu sein, was diese Optionen bewirken. –

+0

Welche Texte haben Sie angeschaut? Vielleicht können wir sie verbessern? –

+0

Nun, für einen "Text/Regexp für Java-Ausdruck Typ". "Java Expression Type" ist völlig unklar, ich habe es nur auf dieser Basis abgetan. (Ich bin kein englischer Muttersprachler, um vollständig zu sein). Ich testete tatsächlich "text/regexp für den formalen Argumenttyp der Methode", was eher so aussah, wie ich es wollte, aber ich konnte zum Beispiel den 'doer.doSomethingObject (foo)' Aufruf nicht bekommen. Für den "Java-Ausdruckstyp" würde ich etwas wie "Java-Argument-Klasse oder Schnittstelle" verwenden. Ich weiß, was ein "Typ" ist, aber ich erwarte nicht, es hier zu lesen, besonders wenn "Strg + N" "Klassenname eingeben" sagt und auch Interfaces zurückgibt. –

Verwandte Themen