Skip to content

Commit

Permalink
Fix for #1159: provide trait method link for helper built from Class
Browse files Browse the repository at this point in the history
  • Loading branch information
eric-milles committed Sep 14, 2020
1 parent 242ef15 commit df33394
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 8 deletions.
Expand Up @@ -28,6 +28,7 @@
import org.codehaus.groovy.ast.FieldNode;
import org.codehaus.groovy.ast.InnerClassNode;
import org.codehaus.groovy.ast.MethodNode;
import org.codehaus.groovy.ast.Parameter;
import org.codehaus.groovy.ast.expr.ClassExpression;
import org.codehaus.groovy.ast.expr.Expression;
import org.codehaus.groovy.ast.expr.ListExpression;
Expand All @@ -46,6 +47,7 @@
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;

/**
* A collection of utility methods used to deal with traits.
Expand Down Expand Up @@ -135,8 +137,16 @@ static TraitHelpersTuple findHelpers(final ClassNode trait) {
// precompiled trait
try {
final ClassLoader classLoader = trait.getTypeClass().getClassLoader();
String helperClassName = Traits.helperClassName(trait);
helperClassNode = ClassHelper.make(Class.forName(helperClassName, false, classLoader));
helperClassNode = ClassHelper.make(Class.forName(Traits.helperClassName(trait), false, classLoader));
// GRECLIPSE add -- link helper methods to trait methods
for (MethodNode method : helperClassNode.getMethods()) {
Parameter[] params = method.getParameters();
if (params.length > 0 && params[0].getType().equals(trait)) {
params = Arrays.copyOfRange(params, 1, params.length);
Optional.ofNullable(trait.getMethod(method.getName(), params)).ifPresent(method::setOriginal);
}
}
// GRECLIPSE end
try {
fieldHelperClassNode = ClassHelper.make(classLoader.loadClass(Traits.fieldHelperClassName(trait)));
} catch (ClassNotFoundException e) {
Expand Down
Expand Up @@ -28,6 +28,7 @@
import org.codehaus.groovy.ast.FieldNode;
import org.codehaus.groovy.ast.InnerClassNode;
import org.codehaus.groovy.ast.MethodNode;
import org.codehaus.groovy.ast.Parameter;
import org.codehaus.groovy.ast.expr.ClassExpression;
import org.codehaus.groovy.ast.expr.Expression;
import org.codehaus.groovy.ast.expr.ListExpression;
Expand All @@ -46,6 +47,7 @@
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;

/**
* A collection of utility methods used to deal with traits.
Expand Down Expand Up @@ -147,8 +149,16 @@ static TraitHelpersTuple findHelpers(final ClassNode trait) {
// precompiled trait
try {
final ClassLoader classLoader = trait.getTypeClass().getClassLoader();
String helperClassName = Traits.helperClassName(trait);
helperClassNode = ClassHelper.make(Class.forName(helperClassName, false, classLoader));
helperClassNode = ClassHelper.make(Class.forName(Traits.helperClassName(trait), false, classLoader));
// GRECLIPSE add -- link helper methods to trait methods
for (MethodNode method : helperClassNode.getMethods()) {
Parameter[] params = method.getParameters();
if (params.length > 0 && params[0].getType().equals(trait)) {
params = Arrays.copyOfRange(params, 1, params.length);
Optional.ofNullable(trait.getMethod(method.getName(), params)).ifPresent(method::setOriginal);
}
}
// GRECLIPSE end
try {
fieldHelperClassNode = ClassHelper.make(classLoader.loadClass(Traits.fieldHelperClassName(trait)));
staticFieldHelperClassNode = ClassHelper.make(classLoader.loadClass(Traits.staticFieldHelperClassName(trait)));
Expand Down
Expand Up @@ -28,6 +28,7 @@
import org.codehaus.groovy.ast.FieldNode;
import org.codehaus.groovy.ast.InnerClassNode;
import org.codehaus.groovy.ast.MethodNode;
import org.codehaus.groovy.ast.Parameter;
import org.codehaus.groovy.ast.expr.ClassExpression;
import org.codehaus.groovy.ast.expr.Expression;
import org.codehaus.groovy.ast.expr.ListExpression;
Expand All @@ -46,6 +47,7 @@
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;

/**
* A collection of utility methods used to deal with traits.
Expand Down Expand Up @@ -147,8 +149,16 @@ static TraitHelpersTuple findHelpers(final ClassNode trait) {
// precompiled trait
try {
final ClassLoader classLoader = trait.getTypeClass().getClassLoader();
String helperClassName = Traits.helperClassName(trait);
helperClassNode = ClassHelper.make(Class.forName(helperClassName, false, classLoader));
helperClassNode = ClassHelper.make(Class.forName(Traits.helperClassName(trait), false, classLoader));
// GRECLIPSE add -- link helper methods to trait methods
for (MethodNode method : helperClassNode.getMethods()) {
Parameter[] params = method.getParameters();
if (params.length > 0 && params[0].getType().equals(trait)) {
params = Arrays.copyOfRange(params, 1, params.length);
Optional.ofNullable(trait.getMethod(method.getName(), params)).ifPresent(method::setOriginal);
}
}
// GRECLIPSE end
try {
fieldHelperClassNode = ClassHelper.make(classLoader.loadClass(Traits.fieldHelperClassName(trait)));
staticFieldHelperClassNode = ClassHelper.make(classLoader.loadClass(Traits.staticFieldHelperClassName(trait)));
Expand All @@ -159,7 +169,7 @@ static TraitHelpersTuple findHelpers(final ClassNode trait) {
throw new GroovyBugError("Couldn't find trait helper classes on compile classpath!",e);
}
}
return new TraitHelpersTuple(helperClassNode, fieldHelperClassNode, staticFieldHelperClassNode);
return new TraitHelpersTuple(helperClassNode, fieldHelperClassNode, staticFieldHelperClassNode);
}

/**
Expand Down
Expand Up @@ -3934,7 +3934,7 @@ final class SemanticHighlightingTests extends GroovyEclipseTestSuite {
new HighlightedTypedPosition(contents.indexOf('T'), 1, TRAIT),
new HighlightedTypedPosition(contents.indexOf('test'), 4, METHOD),
new HighlightedTypedPosition(contents.lastIndexOf('T'), 1, TRAIT),
new HighlightedTypedPosition(contents.lastIndexOf('getFoo'), 6, STATIC_CALL))
new HighlightedTypedPosition(contents.lastIndexOf('getFoo'), 6, METHOD_CALL))
}

//
Expand Down

0 comments on commit df33394

Please sign in to comment.