This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new d736cdd GROOVY-10319: STC: array `clone()` is public and returns
array's type
d736cdd is described below
commit d736cdd98448277f01222c05171a416b39a9f315
Author: Eric Milles <[email protected]>
AuthorDate: Tue Oct 19 12:13:00 2021 -0500
GROOVY-10319: STC: array `clone()` is public and returns array's type
---
.../classgen/asm/sc/StaticInvocationWriter.java | 3 ++-
.../transform/stc/StaticTypeCheckingVisitor.java | 11 +++++++++++
.../stc/ArraysAndCollectionsSTCTest.groovy | 22 +++++++++++++++++++++-
3 files changed, 34 insertions(+), 2 deletions(-)
diff --git
a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
index 3311fb0..20a5483 100644
---
a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
+++
b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
@@ -626,10 +626,11 @@ public class StaticInvocationWriter extends
InvocationWriter {
origMCE.getArguments()
);
MethodNode methodTarget = origMCE.getMethodTarget();
+ newMCE.setImplicitThis(origMCE.isImplicitThis());
newMCE.setMethodTarget(methodTarget);
newMCE.setSafe(false);
- newMCE.setImplicitThis(origMCE.isImplicitThis());
newMCE.setSourcePosition(origMCE);
+
newMCE.getObjectExpression().setSourcePosition(origMCE.getObjectExpression());
newMCE.visit(controller.getAcg());
compileStack.removeVar(slot.getIndex());
ClassNode returnType = operandStack.getTopOperand();
diff --git
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 49fe89a..9c2ce3d 100644
---
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -4744,6 +4744,17 @@ public class StaticTypeCheckingVisitor extends
ClassCodeVisitorSupport {
* @return the methods that are defined on the receiver completed with
stubs for future methods
*/
protected List<MethodNode> findMethodsWithGenerated(final ClassNode
receiver, final String name) {
+ if (receiver.isArray()) {
+ if (name.equals("clone")) { // GROOVY-10319: array clone --
<https://docs.oracle.com/javase/specs/jls/se8/html/jls-10.html#jls-10.7>
+ MethodNode clone = new MethodNode("clone", Opcodes.ACC_PUBLIC,
OBJECT_TYPE, Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, null);
+ clone.setDeclaringClass(OBJECT_TYPE); // retain Object for
declaringClass and returnType
+ clone.setNodeMetaData(INFERRED_RETURN_TYPE, receiver);
+ return Collections.singletonList(clone);
+ } else {
+ return OBJECT_TYPE.getMethods(name);
+ }
+ }
+
List<MethodNode> methods = receiver.getMethods(name);
if (receiver.isAbstract()) {
collectAllInterfaceMethodsByName(receiver, name, methods);
diff --git a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
index d86840c..f375092 100644
--- a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
@@ -661,7 +661,27 @@ class ArraysAndCollectionsSTCTest extends
StaticTypeCheckingTestCase {
assert node.getNodeMetaData(INFERRED_TYPE) ==
int_TYPE.makeArray().makeArray()
})
int[][] array = [[1]] as int[][]
- array[0].length
+ assert array[0].length == 1
+ '''
+ }
+
+ // GROOVY-10319
+ void testArrayClone() {
+ assertScript '''
+ package p // must be in package for protected method check
+
+ @groovy.transform.ToString(includeFields=true)
+ class C implements Cloneable {
+ private int[] array = [1]
+ @Override
+ C clone() {
+ C c = (C) super.clone()
+ c.array = array.clone()
+ return c
+ }
+ }
+
+ assert new C().clone().toString() == 'p.C([1])'
'''
}