查找可以实例化的相关类型

Find related types that can be instantiated

在 Eclipse(Mars,FWIW)中,我正在尝试构建与另一种类型相关的类型列表。 "related" 我的意思是我可能有时想要类型 X 的超类型,而在另一时间我可能想要类型 X 的子类型。到目前为止,一切都很好。这听起来很像 Eclipse "Open Type" dialog restricted to a particular interface。但是...

我只想要实际可以在代码中特定点使用的类型。比如说,我想替换下面的 null

myFoo.setBar(null);

其中setBar()声明如下:

public class Foo {
    // ...
    public void setBar(Bar theNewBar) {
        this.myBar = theNewBar;
    }
    // ...
}

我不关心对 Bar 或其子类型的现有实例的引用,我只关心 Bar 本身及其可以在现场实例化的子类型,就好像我是即将写作:

myFoo.setBar(new SubBar());

因此,具体来说,声明为 private 的类型将被排除在外。 Local 类型将被排除在外(除非我可以确定它们是在我当时正在使用的方法中声明的。在其他地方声明的匿名内部 classes 已经过时了。也是...等待它...根据其声明插件中定义的访问规则不可见的任何类型(即它的插件不 export 它)。(毕竟这是 Eclipse,我关心关于符合插件模型。)有一些 Code Assist 选项将排除这些类型(CODEASSIST_DISCOURAGED_REFERENCE_CHECK 和 CODEASSIST_FORBIDDEN_REFERENCE_CHECK 做我想做的,我想)但 Code Assist 无法区分子类型或超类型。

所以基本上,如果我不能直接实例化它,我不能为它写一个匿名内部class,我不想看到它。

我试过使用 ITypeHierarchy,但我在创建它或在它 returns 的 ITypes 中看不到任何可用于区分的方法我上面提到的标准。

IType.isLocal()IType.isAnonymous() 帮助。我可以使用它们来排除本地和匿名类型。但其他人呢?比如我不关心一个类型是protected还是package default,我关心的是我能不能实例化它。某些 protectedpackage default 类型可以在代码中的任何给定点实例化,而其他类型则不能。

,但是,我想看看如果将声明插件添加到我的 manifest.mf 依赖项中可以实例化的类型。

我怎样才能找到我想要的类型(使用 ITypeHierarchy 或任何其他机制),或者从 ITypeHierarchy 中排除我不需要的类型?

IType is an IMember, which has the int getFlags() 方法返回由 Flags 定义的标志,它有很好的辅助方法,例如:

Flags.isAbstract(iType.getFlags())
Flags.isInterface(iType.getFlags())
Flags.isPackageDefault(iType.getFlags()) // You then compare package yourself
Flags.isProtected(iType.getFlags()) // You then compare package yourself
Flags.isPublic(iType.getFlags())