groovy / groovy-eclipse

Eclipse Groovy Development Tools
657 stars 192 forks source link

Wrong navigation/Javadoc hover on DateGroovyMethods overloading #947

Open mauromol opened 5 years ago

mauromol commented 5 years ago

Consider this:

package test56

class Test56 {
    static Date foo(String foo) {
        new Date()
    }

    static Date bar(String bar) {
        foo(bar).clearTime()
    }
}

Hit F2 or F3 over clearTime(): Greclipse thinks that the invoked method is org.codehaus.groovy.runtime.DateGroovyMethods.clearTime(java.sql.Date), but it is org.codehaus.groovy.runtime.DateGroovyMethods.clearTime(java.util.Date) indeed.

eric-milles commented 5 years ago

Resolved binary methods rely on JDT to find source ranges. org.eclipse.jdt.internal.core.SourceMapper has a map for each method signature (with unqualified types). So clearTime(java.sql.Date) and clearTime(java.util.Date) map to the same entry.

        SourceRange[] ranges = (SourceRange[]) this.sourceRanges.get(element); // element is [static java.util.Date clearTime(java.util.Date) {key=Lorg/codehaus/groovy/runtime/DateGroovyMethods;.clearTime(Ljava/util/Date;)Ljava/util/Date;}
        if (ranges == null) {
            return UNKNOWN_RANGE;
        } else {
            return ranges[0]; // selects the first of 2 matching source ranges
        }
eric-milles commented 5 years ago

This bug seems related. The Java editor's Open Declaration (F3) is finding 2 methods (due to missing packages in parameter types) and then presents a dialog to select the desired method (still missing packages). https://bugs.eclipse.org/bugs/show_bug.cgi?id=441489

The Groovy editor is resolving the target method more accurately, but the supporting framework for determining the source range of the element is not coded to handle overloads like this.

eric-milles commented 5 years ago

https://bugs.eclipse.org/bugs/show_bug.cgi?id=550625

eric-milles commented 2 years ago

https://github.com/eclipse-jdt/eclipse.jdt.core/issues/503