You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (JIRA)" <ji...@apache.org> on 2019/08/06 17:35:00 UTC
[jira] [Commented] (GROOVY-9059) Failed to parse/compile generic
methods with "extends"
[ https://issues.apache.org/jira/browse/GROOVY-9059?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16901316#comment-16901316 ]
Eric Milles commented on GROOVY-9059:
-------------------------------------
Taking another look at this, it appears that {{GenericsUtils.addMethodGenerics}} is where the information loss occurs for groovyc.
{code:java}
public static Map<String, ClassNode> addMethodGenerics(MethodNode current, Map<String, ClassNode> oldSpec) {
Map<String, ClassNode> ret = new HashMap<String, ClassNode>(oldSpec);
// ret starts with the original type specs, now add gts for the current method if any
GenericsType[] sgts = current.getGenericsTypes();
if (sgts != null) {
for (GenericsType sgt : sgts) {
String name = sgt.getName();
if (sgt.isPlaceholder()) {
ClassNode redirect;
if (sgt.getUpperBounds() != null) {
redirect = sgt.getUpperBounds()[0];
} else if (sgt.getLowerBound() != null) {
redirect = sgt.getLowerBound();
} else {
redirect = ClassHelper.OBJECT_TYPE;
}
ClassNode type = ClassHelper.makeWithoutCaching(name);
type.setGenericsPlaceHolder(true); // type is "O" and redirect is "T -> Object"
type.setRedirect(redirect); // after this, type is "O -> Object"; "T" has been lost
ret.put(name, type);
} else {
ret.put(name, sgt.getType());
}
}
}
return ret;
}
{code}
For the {{correctToGenericsSpec}} calls to work after this, "T" must be retained in the redirect of "O".
> Failed to parse/compile generic methods with "extends"
> ------------------------------------------------------
>
> Key: GROOVY-9059
> URL: https://issues.apache.org/jira/browse/GROOVY-9059
> Project: Groovy
> Issue Type: Bug
> Components: Static compilation
> Affects Versions: 2.4.16, 3.0.0-alpha-4, 2.5.6
> Reporter: Xiaoguang Wang
> Priority: Major
> Attachments: image-2019-03-30-13-10-20-819.png
>
>
>
> {code:java}
> import groovy.transform.CompileStatic
> // This bug affects: groovy-2.4.16, groovy-2.5.6, groovy-3.0.0-alpha-4
> // This bug also affect IDEA's syntax parser
> interface X<T> {
> // Intellij IDEA reports that 'public' is not necessary
> // BUT without the 'public' modifier, there is a syntax error
> public <T> T foo(T o);
> }
> interface Y<T> {
> public <O extends T> O foo(O o);
> }
> @CompileStatic
> class TestGroovyGeneric {
> static void main(String[] args) {
> def x = new X<String>() {
> // it compiles
> // BUT: Intellij IDEA reports: ERROR: Method 'foo' is not implemented
> @Override
> String foo(String o) { return o }
> }
> // Strangely, such code compiles
> // BUT: Intellij IDEA reports: ERROR: Method 'foo' is not implemented
> def y1 = new Y<String>() {
> @Override
> public <String> String foo(String o) { return o }
> }
> // Can not compile:
> // BUT: Intellij IDEA reports no error ....
> def y2 = new Y<String>() {
> @Override
> String foo(String o) { return o }
> }
> }
> }
> {code}
> !image-2019-03-30-13-10-20-819.png!
>
--
This message was sent by Atlassian JIRA
(v7.6.14#76016)