Skip to content

Commit 0060908

Browse files
committed
GROOVY-5441
1 parent 359b06c commit 0060908

File tree

4 files changed

+70
-0
lines changed

4 files changed

+70
-0
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/basic/GenericsTests.java

+43
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,49 @@ public void testGenericTypecast2() {
367367
"----------\n");
368368
}
369369

370+
@Test // GROOVY-5441
371+
public void testGenericsArityErrors() {
372+
//@formatter:off
373+
String[] sources = {
374+
"Script.groovy",
375+
"groovy.lang.Tuple2<Object> tooFew\n" +
376+
"java.util.List<Object,Object> tooMany\n" +
377+
"def (\n" +
378+
" java.util.Map<Object> tooFew2,\n" +
379+
" java.lang.Object<Object> tooMany2\n" +
380+
") = [null,null]\n",
381+
};
382+
//@formatter:on
383+
384+
runNegativeTest(sources,
385+
"----------\n" +
386+
"1. ERROR in Script.groovy (at line 1)\n" +
387+
"\tgroovy.lang.Tuple2<Object> tooFew\n" +
388+
"\t^^^^^^^^^^^^^^^^^^\n" +
389+
"Groovy:The class groovy.lang.Tuple2<Object> (supplied with 1 type parameter) refers to the class groovy.lang.Tuple2<T1,T2> which takes 2 parameters\n" +
390+
"----------\n" +
391+
"2. ERROR in Script.groovy (at line 2)\n" +
392+
"\tjava.util.List<Object,Object> tooMany\n" +
393+
"\t^^^^^^^^^^^^^^\n" +
394+
"Groovy:The class java.util.List<Object,Object> (supplied with 2 type parameters) refers to the class java.util.List<E> which takes 1 parameter\n" +
395+
"----------\n" +
396+
"3. ERROR in Script.groovy (at line 4)\n" +
397+
"\tjava.util.Map<Object> tooFew2,\n" +
398+
"\t^^^^^^^^^^^^^\n" +
399+
"Groovy:The class java.util.Map<Object> (supplied with 1 type parameter) refers to the class java.util.Map<K,V> which takes 2 parameters\n" +
400+
"----------\n" +
401+
"4. ERROR in Script.groovy (at line 5)\n" +
402+
"\tjava.lang.Object<Object> tooMany2\n" +
403+
"\t^^^^^^^^^^^^^^^^\n" +
404+
"The type Object is not generic; it cannot be parameterized with arguments <Object>\n" +
405+
"----------\n" +
406+
"5. ERROR in Script.groovy (at line 5)\n" +
407+
"\tjava.lang.Object<Object> tooMany2\n" +
408+
"\t^^^^^^^^^^^^^^^^\n" +
409+
"Groovy:The class java.lang.Object<Object> (supplied with 1 type parameter) refers to the class java.lang.Object which takes no parameters\n" +
410+
"----------\n");
411+
}
412+
370413
@Test
371414
public void testCallingGenericConstructors() {
372415
//@formatter:off

base/org.codehaus.groovy25/src/org/codehaus/groovy/control/GenericsVisitor.java

+9
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.codehaus.groovy.ast.expr.DeclarationExpression;
3232
import org.codehaus.groovy.ast.expr.Expression;
3333
import org.codehaus.groovy.ast.expr.TupleExpression;
34+
import org.codehaus.groovy.ast.expr.VariableExpression;
3435
import org.codehaus.groovy.transform.trait.Traits;
3536

3637
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isUnboundedWildcard;
@@ -119,11 +120,19 @@ public void visitDeclarationExpression(DeclarationExpression expression) {
119120
if (expression.isMultipleAssignmentDeclaration()) {
120121
TupleExpression tExpr = expression.getTupleExpression();
121122
for (Expression nextExpr : tExpr.getExpressions()) {
123+
/* GRECLIPSE edit -- GROOVY-5441
122124
ClassNode declType = nextExpr.getType();
125+
*/
126+
ClassNode declType = ((VariableExpression)nextExpr).getOriginType();
127+
// GRECLIPSE end
123128
checkGenericsUsage(declType, declType.redirect());
124129
}
125130
} else {
131+
/* GRECLIPSE edit -- GROOVY-5441
126132
ClassNode declType = expression.getVariableExpression().getType();
133+
*/
134+
ClassNode declType = expression.getVariableExpression().getOriginType();
135+
// GRECLIPSE end
127136
checkGenericsUsage(declType, declType.redirect());
128137
}
129138
super.visitDeclarationExpression(expression);

base/org.codehaus.groovy30/src/org/codehaus/groovy/control/GenericsVisitor.java

+9
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.codehaus.groovy.ast.expr.DeclarationExpression;
3232
import org.codehaus.groovy.ast.expr.Expression;
3333
import org.codehaus.groovy.ast.expr.TupleExpression;
34+
import org.codehaus.groovy.ast.expr.VariableExpression;
3435
import org.codehaus.groovy.transform.trait.Traits;
3536

3637
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isUnboundedWildcard;
@@ -120,11 +121,19 @@ public void visitDeclarationExpression(DeclarationExpression expression) {
120121
if (expression.isMultipleAssignmentDeclaration()) {
121122
TupleExpression tExpr = expression.getTupleExpression();
122123
for (Expression nextExpr : tExpr.getExpressions()) {
124+
/* GRECLIPSE edit -- GROOVY-5441
123125
ClassNode declType = nextExpr.getType();
126+
*/
127+
ClassNode declType = ((VariableExpression)nextExpr).getOriginType();
128+
// GRECLIPSE end
124129
checkGenericsUsage(declType, declType.redirect());
125130
}
126131
} else {
132+
/* GRECLIPSE edit -- GROOVY-5441
127133
ClassNode declType = expression.getVariableExpression().getType();
134+
*/
135+
ClassNode declType = expression.getVariableExpression().getOriginType();
136+
// GRECLIPSE end
128137
checkGenericsUsage(declType, declType.redirect());
129138
}
130139
super.visitDeclarationExpression(expression);

base/org.codehaus.groovy40/src/org/codehaus/groovy/control/GenericsVisitor.java

+9
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.codehaus.groovy.ast.expr.DeclarationExpression;
3232
import org.codehaus.groovy.ast.expr.Expression;
3333
import org.codehaus.groovy.ast.expr.TupleExpression;
34+
import org.codehaus.groovy.ast.expr.VariableExpression;
3435
import org.codehaus.groovy.transform.trait.Traits;
3536

3637
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isUnboundedWildcard;
@@ -120,11 +121,19 @@ public void visitDeclarationExpression(DeclarationExpression expression) {
120121
if (expression.isMultipleAssignmentDeclaration()) {
121122
TupleExpression tExpr = expression.getTupleExpression();
122123
for (Expression nextExpr : tExpr.getExpressions()) {
124+
/* GRECLIPSE edit -- GROOVY-5441
123125
ClassNode declType = nextExpr.getType();
126+
*/
127+
ClassNode declType = ((VariableExpression)nextExpr).getOriginType();
128+
// GRECLIPSE end
124129
checkGenericsUsage(declType, declType.redirect());
125130
}
126131
} else {
132+
/* GRECLIPSE edit -- GROOVY-5441
127133
ClassNode declType = expression.getVariableExpression().getType();
134+
*/
135+
ClassNode declType = expression.getVariableExpression().getOriginType();
136+
// GRECLIPSE end
128137
checkGenericsUsage(declType, declType.redirect());
129138
}
130139
super.visitDeclarationExpression(expression);

0 commit comments

Comments
 (0)