and*_*dyf 18 java eclipse eclipse-jdt
这是我的示例java代码:
public class Test {
public static void foo() {
Foo.InnerKey key = new Foo.InnerKey();
getInstance().query(key);
}
public static void bar() {
Bar.InnerKey key = new Bar.InnerKey();
getInstance().query(key);
}
public static MyIF getInstance(){
// TODO code to get instance
return null;
}
}
interface MyIF {
public void query(Foo.InnerKey key); // Method to open call hierarchy
public void query(Bar.InnerKey key);
}
class Foo {
static class InnerKey {}
}
class Bar {
static class InnerKey {}
}
Run Code Online (Sandbox Code Playgroud)
当我query(Foo.InnerKey key)从Eclipse(kepler)打开方法的调用层次结构时,我得到了两个foo&bar方法,这bar是不期望的.

但是在netbeans(7.3.1)中,调用层次结果是可以的:

这是Eclipse的错误吗?谢谢.
Bal*_*der 10
这绝对是一个应该报告的JDT错误.并且该bug与调用层次结构没有直接关系,而是与org.eclipse.jdt.core搜索API直接相关,在搜索方法引用时,其中参数是另一种类型的成员类型(例如Foo.InnerKey).因此,这个错误表现为每个JDT功能,它依赖于使用JDT搜索引擎查找方法引用.例如,在显示MyIF#query(Foo.InnerKey)对Java搜索的引用或使用Java搜索时,您也会得到错误的结果,以搜索该方法MyIF#query(Foo.InnerKey).在这些情况下,搜索引擎不仅会返回对MyIF#query(Foo.InnerKey)预期的引用,还会返回引用MyIF#query(Bar.InnerKey).
发生此错误的相关代码在org.eclipse.jdt.internal.core.search.matching.MethodLocator#matchMethod(MethodBinding, boolean).看起来,这个bug是通过修复JDT Bug 41018引入的.
以下是MethodLocator类中相关代码的片段:
protected int matchMethod(MethodBinding method, boolean skipImpossibleArg) {
[...]
// verify each parameter
for (int i = 0; i < parameterCount; i++) {
TypeBinding argType = method.parameters[i];
int newLevel = IMPOSSIBLE_MATCH;
if (argType.isMemberType()) {
// only compare source name for member type (bug 41018)
newLevel = CharOperation.match(this.pattern.parameterSimpleNames[i], argType.sourceName(), this.isCaseSensitive)
? ACCURATE_MATCH
: IMPOSSIBLE_MATCH;
} else {
// TODO (frederic) use this call to refine accuracy on parameter types
// newLevel = resolveLevelForType(this.pattern.parameterSimpleNames[i], this.pattern.parameterQualifications[i], this.pattern.parametersTypeArguments[i], 0, argType);
newLevel = resolveLevelForType(this.pattern.parameterSimpleNames[i], this.pattern.parameterQualifications[i], argType);
[...]
}
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是if (argType.isMemberType())用于修复Bug 41018的声明.该评论还指出,对于成员类型,仅比较源名称.如果删除了这个if语句,那么bug就会消失,并且调用层次结构会显示正确的引用(但我想这当然会重新引入bug 41018 - 我没有对此进行测试).
编辑
另外,在显示源代码Javadoc时似乎也存在一个错误MyIF#query(Bar.InnerKey)- 无论是在方法上使用Javadoc-Hover还是在Javadoc视图中显示方法时.
public interface MyIF {
/**
* Javadoc for: query(Foo.InnerKey key)
*/
public void query(Foo.InnerKey key); // Method to open call hierarchy
/**
* Javadoc for: query(Bar.InnerKey key)
*/
public void query(Bar.InnerKey key);
}
Run Code Online (Sandbox Code Playgroud)
将鼠标悬停在Test类(例如getInstance().query(key))中的查询方法引用上时,会找到两种方法,并且可以选择一种方法(无法区分这两种方法).
打开Javadoc视图并选择Test类中的任何查询方法引用时,Javadoc视图始终只显示源类中第一个找到的方法的Javadoc(即MyIF#query(Foo.InnerKey)).
这似乎与上述错误没有直接关系,并且在删除上面提到的if语句时也无法解决...
| 归档时间: |
|
| 查看次数: |
1114 次 |
| 最近记录: |