Skip to content

Commit c51f96d

Browse files
committed
GROOVY-10249
#1113
1 parent 8328da8 commit c51f96d

File tree

4 files changed

+65
-3
lines changed

4 files changed

+65
-3
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.builder/src/org/eclipse/jdt/core/groovy/tests/builder/BasicGroovyBuildTests.java

+28-1
Original file line numberDiff line numberDiff line change
@@ -2979,10 +2979,37 @@ public void testTraitBasics2() throws Exception {
29792979
expectingCompiledClasses("C", "T", "T$Trait$FieldHelper", "T$Trait$Helper", "T$Trait$StaticFieldHelper");
29802980
}
29812981

2982-
@Test // https://github.com/groovy/groovy-eclipse/issues/1267
2982+
@Test // GROOVY-10249
29832983
public void testTraitBasics3() throws Exception {
29842984
IPath[] paths = createSimpleProject("Project", true);
29852985

2986+
//@formatter:off
2987+
env.addGroovyClass(paths[1], "C",
2988+
"class C implements T {\n" +
2989+
" static main(args) {\n" +
2990+
" setP()\n" +
2991+
" print p\n" +
2992+
" setP(1)\n" +
2993+
" print p\n" +
2994+
" setP(1,2)\n" +
2995+
" print p\n" +
2996+
" }\n" +
2997+
"}\n");
2998+
env.addGroovyClass(paths[1], "T",
2999+
"trait T {\n" +
3000+
" static Number[] p\n" +
3001+
"}\n");
3002+
//@formatter:on
3003+
3004+
fullBuild(paths[0]);
3005+
expectingNoProblems();
3006+
executeClass(paths[0], "C", "[][1][1, 2]", "");
3007+
}
3008+
3009+
@Test // https://github.com/groovy/groovy-eclipse/issues/1267
3010+
public void testTraitBasics4() throws Exception {
3011+
IPath[] paths = createSimpleProject("Project", true);
3012+
29863013
//@formatter:off
29873014
env.addGroovyClass(paths[1], "p", "C",
29883015
"package p\n" +

base-test/org.eclipse.jdt.groovy.core.tests.builder/src/org/eclipse/jdt/core/groovy/tests/search/TraitInferencingTests.java

+20
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,26 @@ public void testProperty19() {
368368
assertExprType(source, "setNumber", "java.lang.Void");
369369
}
370370

371+
@Test
372+
public void testProperty20() {
373+
createUnit("T",
374+
"trait T {\n" +
375+
" Number[] numbers\n" +
376+
"}\n");
377+
378+
//@formatter:off
379+
String source =
380+
"class C implements T {\n" +
381+
" void meth() {\n" +
382+
" def arr = numbers\n" +
383+
" }\n" +
384+
"}\n";
385+
//@formatter:on
386+
387+
assertDeclType(source, "numbers", "T");
388+
assertExprType(source, "numbers", "java.lang.Number[]");
389+
}
390+
371391
//
372392

373393
@Test

base/org.eclipse.jdt.groovy.core/src/org/codehaus/jdt/groovy/internal/compiler/ast/GroovyClassScope.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,8 @@ private Optional<MethodBinding> createSetterMethod(final PropertyNode propertyNo
387387
TypeBinding[] parameterTypes = {Scope.getBaseType(propertyNode.getType().getName().toCharArray())};
388388
return asGenerated(new MethodBinding(modifiers, nameChars, TypeBinding.VOID, parameterTypes, Binding.NO_EXCEPTIONS, referenceContext.binding));
389389
}
390-
return asGenerated(new LazilyResolvedMethodBinding(false, propertyNode.getName(), modifiers, nameChars, Binding.NO_EXCEPTIONS, referenceContext.binding));
390+
int va = (propertyNode.getType().isArray() ? Flags.AccVarargs : 0); // GROOVY-10249: see AsmClassGenerator#visitConstructorOrMethod
391+
return asGenerated(new LazilyResolvedMethodBinding(false, propertyNode.getName(), modifiers | va, nameChars, Binding.NO_EXCEPTIONS, referenceContext.binding));
391392
}
392393

393394
@Override

base/org.eclipse.jdt.groovy.core/src/org/codehaus/jdt/groovy/internal/compiler/ast/JDTResolver.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public class JDTResolver extends ResolveVisitor {
9595
commonTypes.put("java.lang.Short", ClassHelper.Short_TYPE);
9696
commonTypes.put("java.lang.Void", ClassHelper.void_WRAPPER_TYPE);
9797

98+
commonTypes.put("java.lang.Number", ClassHelper.Number_TYPE);
9899
commonTypes.put("java.lang.Object", ClassHelper.OBJECT_TYPE);
99100
commonTypes.put("java.lang.String", ClassHelper.STRING_TYPE);
100101

@@ -269,7 +270,20 @@ public ClassNode resolve(String name) {
269270
}
270271
}
271272

272-
int i = name.indexOf('<');
273+
int i = 0;
274+
while (name.charAt(i) == '[') {
275+
i += 1;
276+
}
277+
if (i > 0) { // resolve "name" from "[[Lname;" then make dims
278+
name = name.substring(i + 1, name.length() - 1);
279+
ClassNode type = resolve(name);
280+
for (; i > 0; i -= 1) {
281+
type = type.makeArray();
282+
}
283+
return type;
284+
}
285+
286+
i = name.indexOf('<');
273287
if (i > 0) {
274288
name = name.substring(0, i);
275289
}

0 commit comments

Comments
 (0)