我发现了Eclipse Groovy和自动完成的这个问题,并且遇到了同样的问题,然而,这已经快三年了,我使用的是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);
}
}
我使用的是EclipseKepler Service Release 2、Groovy编译器2.0.7和Groovy Eclipse插件版本2.8.0.xx-2013703-1600-e43-Release。
在Java>Editor>Content Assist>Advanced首选项菜单下,我已确保除了Groovy Content(Java Non-Type、Java、Java Type Proposals)之外,还选中了所有Java选项。
由于这似乎对一些人来说是通用的,我想知道我在这里可能缺少什么,这将允许内容辅助为Java对象方法工作。谢谢
我一直在思考这个问题,并有一个想法,我刚刚测试过,它允许内容辅助工作,尽管在较少的Groovy条件下:
问题的根源似乎是GroovyEclipse不能在Java对象上自动完成,如果它们是使用def
以Groovy的方式声明的,即:
def fooJava = [2, "baz"] as FooJava
def fooJava2 = new FooJava(3, "bar")
尽管在这两种情况下,类型在编译时都是已知的。我怀疑这与def
本质上是Object
的别名这一事实有关,尽管该类型在技术上是已知的,但它可能被视为Object
,因此这就是内容辅助操作的类型。
如果我以传统的Java方式声明,即:
FooJava fooJava3 = new FooJava(4, "foo")
然后,内容辅助允许我查找FooJava
对象的成员、方法等。
所以,我将来当然可以这样做来解决这个问题,但我确实想知道是否有什么方法可以让我的蛋糕也吃。
即,是否有人找到了一种方法来获得内容帮助,以处理通过def
语法声明的Java对象,只要类型已知?