Что делает переменную видимой (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

Если вы хотите, чтобы класс, поле или метод были видимыми, вам необходимо реализовать их как общедоступные. Если это был ваш вопрос.