diff --git a/base/org.codehaus.groovy24/src/org/codehaus/groovy/transform/trait/Traits.java b/base/org.codehaus.groovy24/src/org/codehaus/groovy/transform/trait/Traits.java index 64b68977f0..90c81f4062 100644 --- a/base/org.codehaus.groovy24/src/org/codehaus/groovy/transform/trait/Traits.java +++ b/base/org.codehaus.groovy24/src/org/codehaus/groovy/transform/trait/Traits.java @@ -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; @@ -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. @@ -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) { diff --git a/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/trait/Traits.java b/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/trait/Traits.java index 3fea6c3687..f8e1e528d4 100644 --- a/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/trait/Traits.java +++ b/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/trait/Traits.java @@ -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; @@ -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. @@ -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))); diff --git a/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/trait/Traits.java b/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/trait/Traits.java index 3fea6c3687..ef8946047c 100644 --- a/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/trait/Traits.java +++ b/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/trait/Traits.java @@ -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; @@ -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. @@ -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))); @@ -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); } /** diff --git a/ide-test/org.codehaus.groovy.eclipse.tests/src/org/codehaus/groovy/eclipse/test/ui/SemanticHighlightingTests.groovy b/ide-test/org.codehaus.groovy.eclipse.tests/src/org/codehaus/groovy/eclipse/test/ui/SemanticHighlightingTests.groovy index e5b35da12a..62d65bfd60 100644 --- a/ide-test/org.codehaus.groovy.eclipse.tests/src/org/codehaus/groovy/eclipse/test/ui/SemanticHighlightingTests.groovy +++ b/ide-test/org.codehaus.groovy.eclipse.tests/src/org/codehaus/groovy/eclipse/test/ui/SemanticHighlightingTests.groovy @@ -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)) } //