You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/07/30 15:24:38 UTC
[groovy] 02/02: GROOVY-10712: STC: for-in loop over iterator
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit d250ef17bc7d0d37e7a19e1507b73b4eea18d06c
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Jul 30 10:15:06 2022 -0500
GROOVY-10712: STC: for-in loop over iterator
2_5_X backport
---
.../transform/stc/StaticTypeCheckingVisitor.java | 35 ++++++++++++----------
src/test/groovy/transform/stc/LoopsSTCTest.groovy | 6 ++--
2 files changed, 22 insertions(+), 19 deletions(-)
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 edf4617707..532457bbe4 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1973,32 +1973,35 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
}
/**
- * Given a loop collection type, returns the inferred type of the loop element. Used, for
- * example, to infer the element type of a (for e in list) loop.
+ * Returns the inferred loop element type given a loop collection type. Used,
+ * for example, to infer the element type of a {@code for (e in list)} loop.
*
* @param collectionType the type of the collection
* @return the inferred component type
+ * @see #inferComponentType
*/
public static ClassNode inferLoopElementType(final ClassNode collectionType) {
ClassNode componentType = collectionType.getComponentType();
if (componentType == null) {
if (implementsInterfaceOrIsSubclassOf(collectionType, ITERABLE_TYPE)) {
- ClassNode intf = GenericsUtils.parameterizeType(collectionType, ITERABLE_TYPE);
- GenericsType[] genericsTypes = intf.getGenericsTypes();
- componentType = genericsTypes[0].getType();
- } else if (implementsInterfaceOrIsSubclassOf(collectionType, MAP_TYPE)) {
- // GROOVY-6240
- ClassNode intf = GenericsUtils.parameterizeType(collectionType, MAP_TYPE);
- GenericsType[] genericsTypes = intf.getGenericsTypes();
+ ClassNode col = GenericsUtils.parameterizeType(collectionType, ITERABLE_TYPE);
+ componentType = col.getGenericsTypes()[0].getType();
+
+ } else if (implementsInterfaceOrIsSubclassOf(collectionType, MAP_TYPE)) { // GROOVY-6240
+ ClassNode col = GenericsUtils.parameterizeType(collectionType, MAP_TYPE);
componentType = MAP_ENTRY_TYPE.getPlainNodeReference();
- componentType.setGenericsTypes(genericsTypes);
- } else if (STRING_TYPE.equals(collectionType)) {
+ componentType.setGenericsTypes(col.getGenericsTypes());
+
+ } else if (implementsInterfaceOrIsSubclassOf(collectionType, ENUMERATION_TYPE)) { // GROOVY-6123
+ ClassNode col = GenericsUtils.parameterizeType(collectionType, ENUMERATION_TYPE);
+ componentType = col.getGenericsTypes()[0].getType();
+
+ } else if (implementsInterfaceOrIsSubclassOf(collectionType, Iterator_TYPE)) { // GROOVY-10712
+ ClassNode col = GenericsUtils.parameterizeType(collectionType, Iterator_TYPE);
+ componentType = col.getGenericsTypes()[0].getType();
+
+ } else if (collectionType.equals(STRING_TYPE)) {
componentType = STRING_TYPE;
- } else if (ENUMERATION_TYPE.equals(collectionType)) {
- // GROOVY-6123
- ClassNode intf = GenericsUtils.parameterizeType(collectionType, ENUMERATION_TYPE);
- GenericsType[] genericsTypes = intf.getGenericsTypes();
- componentType = genericsTypes[0].getType();
} else {
componentType = OBJECT_TYPE;
}
diff --git a/src/test/groovy/transform/stc/LoopsSTCTest.groovy b/src/test/groovy/transform/stc/LoopsSTCTest.groovy
index db2d219bb9..7291043f50 100644
--- a/src/test/groovy/transform/stc/LoopsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/LoopsSTCTest.groovy
@@ -215,14 +215,14 @@ class LoopsSTCTest extends StaticTypeCheckingTestCase {
'''
}
- // GROOVY-8487
+ // GROOVY-8487, GROOVY-10712
void testForInLoopOnIterator() {
assertScript '''
def list = []
for (item in ['a','b','c'].iterator()) {
- list.add(item)
+ list.add(item.toUpperCase())
}
- assert list.join('') == 'abc'
+ assert list == ['A','B','C']
'''
}