Что делает переменную видимой (intellij idea)
С идеей intellij, как мне узнать, что делает переменную видимой?
Пример, когда это трудно:
- Предположим, вы смотрите на
class A
и видите переменную something
. Если вы перейдете к источнику, вы увидите, что он определен в trait X
. Но вы extend
не чертите X
напрямую. Что вы расширяете, что делает эту переменную видимой? Если у вас глубоко вложенная иерархия, отслеживание может быть сложным.
Любые рекомендации или решения?
ОБНОВЛЕНИЕ: если вам нравится этот запрос, рассмотрите возможность голосования за него: http://youtrack.jetbrains.com/issue/IDEA-124369
Ответы
Ответ 1
Я знаю два почти решения этой проблемы.
Переходя к декларации, как вы упомянули, решает эту проблему в случае локальных переменных.
В более общем плане функция "find usages" дает вам аккуратную небольшую разбивку по типу и файлу различных применений переменной. Из этого вы можете увидеть, связано ли это с статическим импортом.
Это не идеально, но с минуту подумал, что этих двух, как правило, достаточно, чтобы выяснить, что вы хотите.
Ответ 2
Используйте ctrl + b или F4, чтобы перейти к исходному коду. В качестве альтернативы вы можете использовать ctrl + shift + a, чтобы получить опцию/действие. Вы можете найти ярлыки в http://gaerfield.github.io/ide-shortcuts/. Надеюсь, это поможет.
Ответ 3
Я не думаю, что IntelliJ IDEA имеет любой ярлык для "нахождения того, что делает переменную видимой".
Однако вы можете определить его, используя опцию "Найти использование" (Alt + F7). Например:
import java.nio._
object TempObj extends App {
def func = 2
val p = file.Paths.get("some-path")
func
}
Итак, найдите "Использование" в "файле", сообщите, что он из пакета "файл" (в заголовке новой вкладки он также показывает полное имя пакета, например: "Поиск использования файла java.nio.file в файлах проекта" ),
В то время как "Поиск использования" в func скажет вам, что его метод (и заголовок "Tab" теперь говорит: "Найти функции func() в Project и Libraries)
Итак, теперь вы можете определить, что именно делает переменную видимой. Это также работает для импорта, поскольку он показывает пакет, из которого он импортируется, и затем вы можете искать импорт этих пакетов.
Ответ 4
Из того, что я понял, вы хотите увидеть код, который создает объект, который вы используете, например Mystery someMystery;
.
Это дает вам два варианта заполнения someMystery
:
-
someMystery = ...
где... ваш код для заполнения
someMystery
, и если это так, вы должны следовать
этот код (с помощью ctrl + B, насколько вам нужно) до той точки, где он
фактически создает объект Mystery
.
- Используйте CDI, чтобы заполнить этот экземпляр объекта для вас, и в этом случае вы должны изучить механизм CDI, чтобы узнать, как заполняется экземпляр объекта.
В любом случае ИМО не может точно знать, является ли экземпляр someMystery
более конкретным классом, чем Mystery
, потому что он решен во время выполнения, а не во время компиляции, поэтому ваша следующая ставка будет запустить программу в отладке и посмотреть, какой объект входит в someMystery
, хотя вы не гарантируете каждый раз получать тот же тип объекта.
PS. Мой ответ основан исключительно на моем понимании темы в java, не могу сказать, действительно ли это для scala.
Ответ 5
Возможно, это не совсем тот ответ, который вы надеялись получить.
Однако, цитируя себя,
Если у вас глубоко вложенная иерархия, отслеживание может быть сложным.
Рассматривали ли вы использование композиции вместо наследования? Возможно, это устранит необходимость в функции, которую вы ищете.
Ответ 6
Если вы хотите, чтобы класс, поле или метод были видимыми, вам необходимо реализовать их как общедоступные. Если это был ваш вопрос.