Найдите функциональность использования в качестве плагина IntelliJ

Я пытаюсь найти способ в IntelliJ IDEA найти все случаи использования нескольких вызовов методов библиотеки и классов в конкретном проекте.

Цель состоит в том, чтобы составить список классов, которые ссылаются на эти конкретные методы или классы.

Как я могу это сделать, я вижу, что есть MethodReferencesSearch, который выглядит так, как будто он может быть полезен, однако для метода поиска требуется экземпляр PsiMethod.

Как я могу создать экземпляр метода PSI, который соответствует методу в определенном классе lib (скажем, я хотел найти все случаи использования метода concat(...) в классе String Java

В основном я пытаюсь создать плагин, который будет генерировать график вызовов определенных методов из проекта. Например, что-то, что будет отображать набор маршрутов, ища вызовы определенных методов в библиотеке. т.е. если класс A вызывает x(T) с типом класса B, а класс B вызывает x(T) с типом класса C, у меня будет график, который выглядит как A -> B -> C и т. д. Найти использование — это здорово, это просто плохо работает для моих нужд.


person NightWolf    schedule 17.10.2013    source источник
comment
Разве функция поиска использований (alt + F7) уже не делает то, что вы описываете?   -  person Harald K    schedule 17.10.2013
comment
Если нет, возможно, вам больше нравится его функция «Анализ обратных зависимостей»?   -  person BambooleanLogic    schedule 17.10.2013
comment
Я в процессе создания плагина, который будет генерировать график вызовов определенных методов внутри проекта. Например, что-то, что будет отображать набор маршрутов, ища вызовы определенных методов в библиотеке. т.е. если класс A вызывает x(T) с типом класса B, а класс B вызывает x(T) с типом класса C, у меня будет график, который выглядит как A → B → C и т. д. Поиск использования великолепен, он просто плохо работает для моих нужд.   -  person NightWolf    schedule 17.10.2013


Ответы (2)


Вы можете получить истинный PsiMethod с помощью JavaPsiFacade.getInstance(...).findClass("java.lang.String", ...allScope(...)).findsMethodByName("concat", false)[0]. Затем этот метод можно передать в MethodReferenceSearch.

person Peter Gromov    schedule 17.10.2013
comment
Это большое спасибо! Есть ли эквивалент Scala? Как это работает для перегруженных методов? - person NightWolf; 18.10.2013
comment
findClass не зависит от языка, он также найдет классы Scala. Что касается перегруженных методов, то при поиске по имени их будет несколько, а нужный можно найти вручную. Или вы можете использовать findMethodsBySignature, но это немного сложнее. Чтобы создать метод шаблона, вы можете использовать JavaPsiFacade.getElementFactory.createMethodFromText. - person Peter Gromov; 18.10.2013

Я предполагаю, что вы не можете гарантировать, что у вас есть легкодоступное использование concat (например, в позиции курсора пользователя в открытом документе).

Хакерский способ сделать это - создать небольшой, правильный, автономный класс Java в строке, как показано ниже:

class Nothing { String s = "a".concat("b"); }

Затем есть способ (если я правильно помню) использовать IntelliJ для анализа класса, содержащегося в этой строке, тем самым предоставляя вам PsiReference для метода, который вы хотите найти (в данном случае concat).

Будет ли этот подход полезен для вас?

Если это так, я могу найти пример кода о том, как это можно сделать.

person vikingsteve    schedule 17.10.2013