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');
+        }
     }
 }