Skip to content

Commit

Permalink
restore deferred resolve of LazilyResolvedMethodBinding
Browse files Browse the repository at this point in the history
  • Loading branch information
eric-milles committed Aug 11, 2020
1 parent fd3747c commit c49c154
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import static org.junit.Assume.assumeTrue;

import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
import org.junit.Test;
import org.osgi.framework.Version;
Expand Down Expand Up @@ -1371,26 +1370,23 @@ public void testExtendingGenerics_GroovyExtendsJava13() {
}

/**
* https://issuetracker.springsource.com/browse/STS-3930
* https://jira.spring.io/browse/STS-3930
*
* @see org.codehaus.jdt.groovy.internal.compiler.ast.GroovyClassScope#buildFieldsAndMethods()
* @see org.codehaus.jdt.groovy.internal.compiler.ast.GroovyCompilationUnitDeclaration.UnitPopulator#getVariantsAllowingForDefaulting
*/
@Test
public void testExtendingGenerics_GroovyExtendsJava14() {
assumeTrue(JavaCore.getPlugin().getBundle().getVersion().compareTo(Version.parseVersion("3.10")) >= 0);

//@formatter:off
String[] sources = {
"Groovy.groovy",
"class Groovy {\n" +
" static <T> List<T> method(Class<T> factory, ClassLoader loader = Groovy.class.classLoader) {\n" +
" null\n" +
" static <T> List<T> method(Class<T> factory, ClassLoader loader = this.classLoader) {\n" +
" }\n" +
"}",

"Java.java",
"public class Java {\n" +
" public static void method() {\n" +
" public static void test() {\n" +
" Groovy.method(Java.class);\n" +
" }\n" +
"}",
Expand All @@ -1402,9 +1398,10 @@ public void testExtendingGenerics_GroovyExtendsJava14() {

/**
* https://github.com/groovy/groovy-eclipse/issues/144
*
* <pre>
* java.lang.NullPointerException
* at org.codehaus.jdt.groovy.internal.compiler.ast.GroovyClassScope.fixupTypeParameters(GroovyClassScope.java:559)
* </pre>
*/
@Test
public void testExtendingGenerics_GroovyExtendsJava15() {
Expand Down Expand Up @@ -1456,7 +1453,7 @@ public void testExtendingGenerics_GroovyExtendsJava16() {

/**
* https://github.com/groovy/groovy-eclipse/issues/174
*
* <pre>
* java.lang.NullPointerException
* at com.sun.beans.TypeResolver.resolve(TypeResolver.java:203)
* at com.sun.beans.TypeResolver.resolve(TypeResolver.java:162)
Expand All @@ -1474,6 +1471,7 @@ public void testExtendingGenerics_GroovyExtendsJava16() {
* at MIData.$getStaticMetaClass(MIData.groovy)
* at MIData.<init>(MIData.groovy)
* at Main.main(Main.groovy:3)
* </pre>
*/
@Test
public void testExtendingGenerics_GroovyExtendsJava17() {
Expand Down Expand Up @@ -1537,12 +1535,13 @@ public void testExtendingGenerics_GroovyExtendsJava18() {

/**
* https://issues.apache.org/jira/browse/GROOVY-7722
*
* <pre>
* java.lang.StackOverflowError
* at org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse(GenericsUtils.java:358)
* at org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse(GenericsUtils.java:403)
* at org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse(GenericsUtils.java:403)
* ...
* </pre>
*/
@Test
public void testExtendingGenerics_GroovyExtendsJava19() {
Expand Down Expand Up @@ -1572,12 +1571,13 @@ public void testExtendingGenerics_GroovyExtendsJava19() {

/**
* https://issues.apache.org/jira/browse/GROOVY-7864
*
* <pre>
* java.lang.StackOverflowError
* at org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse(GenericsUtils.java:358)
* at org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse(GenericsUtils.java:403)
* at org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse(GenericsUtils.java:403)
* ...
* </pre>
*/
@Test
public void testExtendingGenerics_GroovyExtendsJava20() {
Expand Down Expand Up @@ -2108,30 +2108,6 @@ public void testHalfFinishedGenericsProgramWithMultipleSuppressionValuesWithOneS
"----------\n");
}

@Test // https://jira.spring.io/browse/STS-3930
public void testSts3930() {
//@formatter:off
String[] sources = {
"demo/GroovyDemo.groovy",
"package demo\n" +
"class GroovyDemo {\n" +
" static <T> List someMethod(Class<T> factoryClass, ClassLoader classLoader = this.classLoader) {\n" +
" }\n" +
"}\n",

"demo/JavaDemo.java",
"package demo;\n" +
"public class JavaDemo {\n" +
" public static void staticMethod() {\n" +
" GroovyDemo.someMethod(JavaDemo.class);\n" +
" }\n" +
"}\n",
};
//@formatter:on

runConformTest(sources, "");
}

@Test
public void testWildcards1() {
//@formatter:off
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,11 @@
import org.eclipse.jdt.internal.compiler.lookup.LazilyResolvedMethodBinding;
import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
import org.eclipse.jdt.internal.compiler.lookup.MethodScope;
import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding;
import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
import org.eclipse.jdt.internal.compiler.lookup.Scope;
import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
import org.eclipse.jdt.internal.core.nd.util.CharArrayMap;

public class GroovyClassScope extends ClassScope {

Expand Down Expand Up @@ -415,36 +412,6 @@ protected void buildFieldsAndMethods() {
}
}
}

/*
* Fix generic methods with default parameter values. For those methods
* type variables and parameter arguments should be the same as it is
* for all other methods.
*/
for (MethodBinding method : referenceContext.binding.methods()) {
if (method.parameters != null && method.parameters.length > 0 &&
method.typeVariables != null && method.typeVariables.length > 0) {
CharArrayMap<TypeVariableBinding> bindings = new CharArrayMap<>();
for (TypeVariableBinding tvb : method.typeVariables) {
bindings.put(tvb.sourceName, tvb);
}
for (TypeBinding parameter : method.parameters) {
if (parameter instanceof ParameterizedTypeBinding) {
TypeBinding[] arguments = ((ParameterizedTypeBinding) parameter).arguments;
if (arguments != null) {
for (int i = 0, n = arguments.length; i < n; i += 1) {
if (arguments[i] instanceof TypeVariableBinding) {
TypeBinding argument = bindings.get(arguments[i].sourceName());
if (argument != null && arguments[i].id != argument.id) {
arguments[i] = argument;
}
}
}
}
}
}
}
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2721,7 +2721,7 @@ private void fixupSourceLocationsForFieldDeclaration(FieldDeclaration fieldDecl,
* In the given list of groovy parameters, some are defined as defaulting to an initial value. This method computes all the
* variants of defaulting parameters allowed and returns a List of Argument arrays. Each argument array represents a variation.
*/
private static List<Argument[]> getVariantsAllowingForDefaulting(Parameter[] groovyParameters, Argument[] javaArguments) {
private List<Argument[]> getVariantsAllowingForDefaulting(Parameter[] groovyParameters, Argument[] javaArguments) {
List<Argument[]> variants = new ArrayList<>();

final int nParams = groovyParameters.length;
Expand All @@ -2740,7 +2740,17 @@ private static List<Argument[]> getVariantsAllowingForDefaulting(Parameter[] gro
// create a variation based on the non-null entries left in the array
for (int p = 0; p < nParams; p += 1) {
if (wipableParameters[p] != null) {
variantArgs.add(javaArguments[p]);
if (javaArguments[p].type.isParameterizedTypeReference()) {
// STS-3930: TypeVariableBinding#declaringElement must equal the method variant for type parameter resolution to work
Argument clone = new Argument(javaArguments[p].name, toPos(javaArguments[p].sourceStart, javaArguments[p].sourceEnd),
createTypeReferenceForClassNode(groovyParameters[p].getType()), javaArguments[p].modifiers);
if (javaArguments[p].isVarArgs()) clone.type.bits |= ASTNode.IsVarArgs;
clone.annotations = javaArguments[p].annotations;
clone.declarationSourceStart = clone.sourceStart;
variantArgs.add(clone);
} else {
variantArgs.add(javaArguments[p]);
}
if (wipableParameters[p].hasInitialExpression()) {
nextToLetDefault = p;
}
Expand Down

0 comments on commit c49c154

Please sign in to comment.