Eclipse内容不支持Groovy文件中的Java对象

时间:2014-04-29 03:02:01

标签: java eclipse groovy content-assist

我发现了这个问题Eclipse Groovy and autocompletion并且遇到了同样的问题,但是,差不多三年了,我正在使用当前版本的 Groovy Eclipse 插件,并且似乎没有任何会混淆 ANTLR 的语法错误。

我也尝试使用 Groovy / Grails工具套件,并得到了相同的结果。

我已经模拟了一个简单的测试用例,其中内容辅助适用于 Groovy 对象'方法,以及 Java 对象'静态成员,但不是 Java 对象'方法

Groovy类:

package test_groovy

import test_groovy.FooJava

class FooGroovy
{
    def fooJava = [2, "baz"] as FooJava

    def x = 4

    def FooGroovy()
    {
        // empty constructor    
    }

    def useFooJava()
    {
        // only displays Groovy methods, not the java ones
        def str = fooJava.getStr()
        println "str: ${str}"

        // static members like this *can* be found via content assist
        def str2 = FooJava.FOO_STR
        println "str2: ${str2}"

        // This is also not found via content assist
        def str3 = fooJava.dumpToStr()
        println "str3: ${str3}"
    }

    def fooBar()
    {
        return x + 3
    }

    static void main(def args)
    {
        def fooGroovy = [] as FooGroovy

        // Groovy object methods can be found via content assist
        def res = fooGroovy.fooBar()
        println "res: ${res}"

        fooGroovy.useFooJava()
    }
}

Java类:

package test_groovy;

public class FooJava
{
    private long bar;
    private String str;

    public static final String FOO_STR = "foo";

    public FooJava(long bar, String str)
    {
        super();
        this.bar = bar;
        this.str = str;
    }

    public long getBar()
    {
        return bar;
    }

    public void setBar(long bar)
    {
        this.bar = bar;
    }

    public String getStr()
    {
        return str;
    }

    public void setStr(String str)
    {
        this.str = str;
    }

    public String dumpToStr()
    {
        return new String("Str: " + str + ", bar: " + bar);
    }

}

我正在使用 Eclipse Kepler Service Release 2, Groovy 编译器2.0.7和 Groovy Eclipse 插件版本2.8.0.xx-20130703 -1600-E43-RELEASE。

Java>下编辑>内容辅助>高级偏好设置菜单,除了 Groovy内容(Java非类型,Java,Java类型提案)之外,我还确保检查所有 Java 选项

由于这对某些人来说似乎总体上起作用,我想知道我在这里可能缺少哪些内容可以帮助 Java 对象方法。感谢。

1 个答案:

答案 0 :(得分:5)

我一直在考虑这个问题,并且考虑到了我刚刚测试过的内容辅助工作,尽管在 Groovy 条件下很少:

问题的根源似乎是 Groovy Eclipse 无法在 Java 对象上自动完成,如果它们在中声明的话使用def的Groovy 方式,即:

def fooJava = [2, "baz"] as FooJava
def fooJava2 = new FooJava(3, "bar")

即使在这两种情况下,类型在编译时都是已知的。我怀疑它与def本质上是Object的别名这一事实有关,即使该类型在技术上已知,它也可能被视为Object,因此& #39; s内容辅助操作的类型。

如果我用传统的 Java 方式声明它,即:

FooJava fooJava3 = new FooJava(4, "foo")

内容辅助允许我查找FooJava对象的成员,方法等。

所以,我今后肯定可以解决这个问题,但我确实想知道是否有任何方法可以让我的蛋糕也吃掉它。

即。有没有人找到一种方法来获取内容辅助来处理通过def语法声明的 Java 对象,只要该类型是已知的?