You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by gr...@apache.org on 2019/10/02 08:39:36 UTC
[royale-asjs] 02/06: Support iteration over keys as well as values
(for-in as well as for-each-in)
This is an automated email from the ASF dual-hosted git repository.
gregdove pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
commit de4f34f0f00374d369f6e75ac5f20a21fa1c4194
Author: greg-dove <gr...@gmail.com>
AuthorDate: Wed Oct 2 12:26:24 2019 +1300
Support iteration over keys as well as values (for-in as well as for-each-in)
---
.../org/apache/royale/language/iterator/arrayLike.as | 11 +++++++----
.../language/LanguageTesterTestForEach.as | 19 ++++++++++++++-----
2 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as b/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as
index 38b1c65..45f6e07 100644
--- a/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as
+++ b/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as
@@ -19,16 +19,17 @@
package org.apache.royale.language.iterator
{
/**
- * Used by the compiler for classes with [RoyaleArrayLike] metadata when processing for each loops
+ * Used by the compiler for classes with [RoyaleArrayLike] metadata when processing for-in/for-each-in loops
* @param forInstance the instance to be checked
* @param lengthCheck either a string that represents a property to return length value, or a function method reference, e.g. instance.length()
* @param getAt the String name of the accessor for the item at index... e.g. 'getItemAt'. If null it will default to Array Access []
* @param lengthIsMethodCall true if the length accessor is an explicit method call instead of a getter
+ * @param keys true if the request is to iterate over keys (as opposed to values)
* @return a lightweight iterator Object with hasNext() and next() methods
*
* @royalesuppressexport
*/
- public function arrayLike(forInstance:Object, lengthCheck:String, getAt:String, lengthIsMethodCall:Boolean):Object{
+ public function arrayLike(forInstance:Object, lengthCheck:String, getAt:String, lengthIsMethodCall:Boolean, keys:Boolean = false):Object{
if (forInstance) {
var i:int = 0;
var ret:Object = { };
@@ -43,11 +44,13 @@ package org.apache.royale.language.iterator
}
if (getAt != null){
ret['next'] = function():*{
- return forInstance[getAt](i++);
+ if (keys) return (i++)+''; //for-in: for (var key:String in target)
+ return forInstance[getAt](i++);//for-each-in: for each(var something:Something in target)
}
} else {
ret['next'] = function():*{
- return forInstance[i++];
+ if (keys) return (i++)+''; //for-in: for (var key:String in target)
+ return forInstance[i++];//for-each-in: for each(var something:Something in target)
}
}
} else {
diff --git a/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as
index 2a2c2e2..4411688 100644
--- a/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as
+++ b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as
@@ -188,18 +188,27 @@ package flexUnitTests.language
[Test]
- public function tesTargetMutation():void{
+ public function testTargetMutation():void{
var arrayList:ArrayList = new ArrayList(['dog', 'cat','mouse','gerbil']);
var foundItems:Array = [];
- var charItems:Array = [];
- for each(_animal in arrayList) {
- foundItems.push(_animal);
+ for each(var animal:String in arrayList) {
+ foundItems.push(animal);
if (arrayList.length) arrayList.removeAll();//should stop iterating after first item
}
assertEquals(foundItems.toString(), 'dog', 'unexpected for each result');
}
+
+
+ [Test]
+ public function testForIn():void{
+ var arrayList:ArrayList = new ArrayList(['dog', 'cat','mouse','gerbil']);
-
+ var foundItems:Array = [];
+ for (var key:String in arrayList) {
+ foundItems.push(arrayList.getItemAt(uint(key)));
+ }
+ assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 'unexpected for in result');
+ }
}
}