使用IntelliJ IDEA,如何查找变量可见性的原因?
以下是一个难以解决的示例:
- 假设您查看
类A
并看到一个变量something
。如果您跳转到源代码,您会发现它在trait X
中定义。但是您没有直接扩展X
特质。那么您扩展了什么,使得这个变量可见?如果有一个深度嵌套的层次结构,跟踪可能很困难。
是否有任何建议或解决方案?
编辑:如果您感兴趣,请为此功能投票:http://youtrack.jetbrains.com/issue/IDEA-124369
使用IntelliJ IDEA,如何查找变量可见性的原因?
以下是一个难以解决的示例:
类A
并看到一个变量something
。如果您跳转到源代码,您会发现它在trait X
中定义。但是您没有直接扩展X
特质。那么您扩展了什么,使得这个变量可见?如果有一个深度嵌套的层次结构,跟踪可能很困难。是否有任何建议或解决方案?
编辑:如果您感兴趣,请为此功能投票:http://youtrack.jetbrains.com/issue/IDEA-124369
import java.nio._
object TempObj extends App {
def func = 2
val p = file.Paths.get("some-path")
func
}
在“文件”上查找用法,会告诉你它来自“文件”包(在新标签页的标题中也显示完整的包名,例如:在项目文件中查找java.nio.file的用法)。 而在“func”上查找用法会告诉你它是一个方法(现在选项卡标题说:在项目和库中查找func()的用法)。
因此,现在你可以确定变量的可见性。这也适用于导入,因为它显示导入自哪个包,然后你可以查找该包的导入。
Ctrl B
)一样。你跳转之后就知道了包名。但是,你仍然不知道是什么让这个变量在你的上下文中可见。例如:trait A{def whereAmI=1}; trait B extends A; class Mystery extends B with Other with Other2 with Other3 {println(whereAmI)}
现在看着 Mystery
的源代码,我无法理解这个变量来自哪里。它是来自 B
吗?还是来自 Other
?或者可能是来自扩展 A
的对象,并且我们导入了对象内容? - VasiliNovikov我知道两个几乎解决这个问题的方法。
正如你所提到的,Go-to-declaration可以解决局部变量的情况。
更一般地说,“查找用法”功能会给您一个漂亮的小窗口,按类型和文件列出变量的不同用途。从中,您可以看到它是否涉及静态导入。
虽然不是完美的,但只需花一点时间思考,这两种方法通常足以弄清楚您想要的内容。
使用ctrl+b或F4跳转到源代码。或者您可以使用ctrl+shift+a获取选项/操作。您还可以在http://gaerfield.github.io/ide-shortcuts/上找到快捷方式。希望能对您有所帮助。
深度嵌套的层次结构听起来不太好。我理解你对此的痛苦。
当你重写val或def时,在行号旁边有一个小圆圈,显示它来自哪里,即使它来自嵌套层次结构。按下命令键悬停在vals上还会显示一个小工具提示,告诉你它的来源。
这样有帮助吗?
aX
可用,因为您混入了C
(而C
也被混入了A
)。 - VasiliNovikov根据我的理解,您想要查看创建您使用的对象的代码,例如 Mystery someMystery;
。
这给了您两个选项来填充someMystery
:
someMystery = ...
,其中...是用于填充someMystery
的代码。如果是这种情况,您应该按照该代码(如有必要,使用ctrl+B)追踪到实际创建Mystery
对象的点。在任何情况下,我认为没有办法确定someMystery
实例是否比Mystery
具体的类更具体,因为它是在运行时而不是编译时决定的,所以您的下一个选择是在调试程序中运行并查看输入someMystery
的对象,尽管不能保证每次都得到相同类型的对象。
PS. 我的答案完全基于我对Java主题的理解,不能确定它是否也适用于Scala。
extends
继承关系。你知道,最终,这是trait X
的成员。但你没有直接继承X
。那么它从哪里进入你的代码呢?无论如何,这在问题中已经说明了。 - VasiliNovikov
Ctrl
+Click
(或Ctrl
+B
)可以带您到该项的源代码。 OP 正在寻找它在文件中被引入的位置(即大多数情况下所说的“导入”)。 - Javaru