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 e52954b22a4599c75ba242955273627867e00e4d
Author: greg-dove <[email protected]>
AuthorDate: Sun Sep 29 15:16:21 2019 +1300

    RoyaleArrayLike support (IArrayList and BinaryData)
---
 frameworks/projects/Collections/pom.xml            |  14 ++
 .../src/main/config/compile-swf-config.xml         |   1 +
 .../src/main/royale/CollectionsClasses.as          |   2 +
 .../org/apache/royale/collections/ArrayList.as     |   2 +-
 .../org/apache/royale/collections/IArrayList.as    |  13 +-
 frameworks/projects/Core/pom.xml                   |  19 +-
 .../Core/src/main/config/compile-swf-config.xml    |   6 +-
 .../projects/Core/src/main/royale/CoreClasses.as   |   3 +
 .../royale/org/apache/royale/utils/BinaryData.as   |  11 +-
 .../Language/src/main/royale/LanguageClasses.as    |   2 +-
 .../apache/royale/language/iterator/arrayLike.as   |  73 +++++++
 .../main/royale/flexUnitTests/LanguageTester.as    |   8 +-
 .../language/LanguageTesterTestArraylikeGetSet.as  | 227 +++++++++++++++++++++
 .../language/LanguageTesterTestForEach.as          | 205 +++++++++++++++++++
 .../language/support/checkArrayLikeFunc.as         |  30 +--
 15 files changed, 587 insertions(+), 29 deletions(-)

diff --git a/frameworks/projects/Collections/pom.xml 
b/frameworks/projects/Collections/pom.xml
index a105423..59cb218 100644
--- a/frameworks/projects/Collections/pom.xml
+++ b/frameworks/projects/Collections/pom.xml
@@ -60,6 +60,20 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Language</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Language</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
       <artifactId>Core</artifactId>
       <version>0.9.6-SNAPSHOT</version>
       <type>swc</type>
diff --git 
a/frameworks/projects/Collections/src/main/config/compile-swf-config.xml 
b/frameworks/projects/Collections/src/main/config/compile-swf-config.xml
index 6116aec..1c00110 100644
--- a/frameworks/projects/Collections/src/main/config/compile-swf-config.xml
+++ b/frameworks/projects/Collections/src/main/config/compile-swf-config.xml
@@ -31,6 +31,7 @@
         <external-library-path>
             
<path-element>${env.AIR_HOME}/frameworks/libs/air/airglobal.swc</path-element>
             <path-element>../../../../../libs/Core.swc</path-element>
+            <path-element>../../../../../libs/Language.swc</path-element>
         </external-library-path>
 
                <mxml>
diff --git 
a/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as 
b/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as
index fe946df..ecc1033 100644
--- a/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as
+++ b/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as
@@ -43,6 +43,8 @@ internal class CollectionsClasses
        import org.apache.royale.collections.SortField; SortField;
        import org.apache.royale.collections.SortFieldCompareTypes; 
SortFieldCompareTypes;
        import org.apache.royale.collections.CompareUtils; CompareUtils;
+       
+       import org.apache.royale.language.iterator.arrayLike;arrayLike;
 
 }
 
diff --git 
a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as
 
b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as
index 38164aa..75ea856 100644
--- 
a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as
+++ 
b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as
@@ -34,7 +34,6 @@ package org.apache.royale.collections
                import flash.utils.IDataInput;
                import flash.utils.IDataOutput;
        }
-       
 
     //--------------------------------------
     //  Events
@@ -90,6 +89,7 @@ package org.apache.royale.collections
         *  @productversion Royale 0.0
         */
        [Event(name="itemUpdated", 
type="org.apache.royale.events.CollectionEvent")]
+       
 
     /**
      *  The ArrayList class provides an event-driven wrapper for the
diff --git 
a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as
 
b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as
index 32638b0..454d27f 100644
--- 
a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as
+++ 
b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as
@@ -27,8 +27,17 @@ package org.apache.royale.collections
     import org.apache.royale.collections.converters.IItemConverter;
 
     //--------------------------------------
-
-
+       
+       /**
+        *  Support for Arraylike access (typed index access via []) and also 
via iteration when used with for-each loops.
+        *
+        *  @langversion 3.0
+        *  @playerversion Flash 10.2
+        *  @playerversion AIR 2.6
+        *  @productversion Royale 0.0
+        */
+       
[RoyaleArrayLike(getValue="getItemAt",setValue="setItemAt",setterArgSequence="value,index",length="length",lengthAccess="getter")]
+       
     /**
      *  The ArrayList class provides an event-driven wrapper for the
         *  standard Array. Events are dispatched when items are added, removed,
diff --git a/frameworks/projects/Core/pom.xml b/frameworks/projects/Core/pom.xml
index 947ce17..49b3b6f 100644
--- a/frameworks/projects/Core/pom.xml
+++ b/frameworks/projects/Core/pom.xml
@@ -68,5 +68,22 @@
       </plugin>
     </plugins>
   </build>
-
+  <dependencies>
+    <!-- Language is included to permit a concrete reference
+     to the arrayLike iterator to be re-exported, so that it is always 
available -->
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Language</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Language</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+  </dependencies>
 </project>
diff --git a/frameworks/projects/Core/src/main/config/compile-swf-config.xml 
b/frameworks/projects/Core/src/main/config/compile-swf-config.xml
index 265d4d8..4d0d2a7 100644
--- a/frameworks/projects/Core/src/main/config/compile-swf-config.xml
+++ b/frameworks/projects/Core/src/main/config/compile-swf-config.xml
@@ -31,7 +31,11 @@
         <external-library-path>
             
<path-element>${env.AIR_HOME}/frameworks/libs/air/airglobal.swc</path-element>
         </external-library-path>
-        
+
+        <library-path>
+            <path-element>../../../../../libs/Language.swc</path-element>
+        </library-path>
+
         <allow-subclass-overrides>true</allow-subclass-overrides>
         
                <mxml>
diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as 
b/frameworks/projects/Core/src/main/royale/CoreClasses.as
index 4e258c7..6d03a3b 100644
--- a/frameworks/projects/Core/src/main/royale/CoreClasses.as
+++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as
@@ -324,6 +324,9 @@ internal class CoreClasses
 
     import org.apache.royale.core.TextLineMetrics; TextLineMetrics;
     import org.apache.royale.utils.ClassSelectorList; ClassSelectorList;
+       
+       //explicit support for RoyaleArrayLike for each iteration (BinaryData)
+       import org.apache.royale.language.iterator.arrayLike;arrayLike;
 }
 
 }
diff --git 
a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as
 
b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as
index 2143d31..483bfb1 100644
--- 
a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as
+++ 
b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as
@@ -27,7 +27,16 @@ COMPILE::JS
 {
     import goog.DEBUG;
 }
-
+    
+/**
+ *  Support for Arraylike access (typed index access via []) and also 
iteration when used with for-each loops.
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 10.2
+ *  @playerversion AIR 2.6
+ *  @productversion Royale 0.0
+ */
+[RoyaleArrayLike(getValue="readByteAt",setValue="writeByteAt",setterArgSequence="index,value",length="length",lengthAccess="getter")]
 
 /**
  *  The BinaryData class is a class that represents binary data.  The way
diff --git a/frameworks/projects/Language/src/main/royale/LanguageClasses.as 
b/frameworks/projects/Language/src/main/royale/LanguageClasses.as
index 2d4388e..f0e5ed3 100644
--- a/frameworks/projects/Language/src/main/royale/LanguageClasses.as
+++ b/frameworks/projects/Language/src/main/royale/LanguageClasses.as
@@ -31,10 +31,10 @@ internal class LanguageClasses
            import org.apache.royale.utils.Language; Language;
                import QName; QName;
                import Namespace; Namespace;
-
        }
        import org.apache.royale.language.string.match; match;
        import org.apache.royale.language.string.search; search;
+       import org.apache.royale.language.iterator.arrayLike; arrayLike;
 }
 
 }
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
new file mode 100644
index 0000000..38b1c65
--- /dev/null
+++ 
b/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as
@@ -0,0 +1,73 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.language.iterator
+{
+    /**
+     * Used by the compiler for classes with [RoyaleArrayLike] metadata when 
processing for each 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
+     * @return a lightweight iterator Object with hasNext() and next() methods
+     *
+     * @royalesuppressexport
+     */
+    public function arrayLike(forInstance:Object, lengthCheck:String, 
getAt:String,  lengthIsMethodCall:Boolean):Object{
+        if (forInstance) {
+            var i:int = 0;
+            var ret:Object = { };
+            if (lengthIsMethodCall) {
+                ret['hasNext'] = function():Boolean{
+                    return i < forInstance[lengthCheck]();
+                }
+            } else {
+                ret['hasNext'] = function():Boolean{
+                    return i < forInstance[lengthCheck]
+                }
+            }
+            if (getAt != null){
+                ret['next']  = function():*{
+                    return forInstance[getAt](i++);
+                }
+            } else {
+                ret['next'] = function():*{
+                    return forInstance[i++];
+                }
+            }
+        } else {
+            //no need to create a new instance:
+            ret = NULL_ITERABLE;
+        }
+        return ret;
+    }
+}
+/**
+ * @royalesuppressexport
+ */
+const NULL_ITERABLE:* = {
+    'hasNext':function():Boolean{
+        return false;
+    },
+    'next':function():*{ 
+        //this should never be called in compiler-generated code in any case
+        throw new TypeError('Cannot iterate over a null object reference');
+    }
+};
+
+
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as
index 441932b..52337ba 100644
--- a/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as
+++ b/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as
@@ -30,7 +30,7 @@ package flexUnitTests
         public function LanguageTester()
         {
             // see notes in CoreTester
-            var arr:Array = [LanguageTesterTestIs, LanguageTesterIntUint, 
LanguageTesterTestVector,LanguageTesterTestClass];
+    //        var arr:Array = [LanguageTesterTestIs, LanguageTesterIntUint, 
LanguageTesterTestVector,LanguageTesterTestClass];
         }
         
         public var languageTestIs:LanguageTesterTestIs;
@@ -40,5 +40,11 @@ package flexUnitTests
         public var languageTestVector:LanguageTesterTestVector;
         
         public var languageTestClass:LanguageTesterTestClass;
+        
+        public var languageTestForeach:LanguageTesterTestForEach;
+    
+        public var languageTestgetSet:LanguageTesterTestArraylikeGetSet
+    
+    
     }
 }
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestArraylikeGetSet.as
 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestArraylikeGetSet.as
new file mode 100644
index 0000000..8ff14fe
--- /dev/null
+++ 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestArraylikeGetSet.as
@@ -0,0 +1,227 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package flexUnitTests.language
+{
+    
+    
+    import org.apache.royale.test.asserts.*;
+    
+    import flexUnitTests.language.support.*;
+    import org.apache.royale.collections.ArrayList;
+    import org.apache.royale.collections.ArrayListView;
+    import org.apache.royale.collections.IArrayList;
+    import org.apache.royale.utils.BinaryData;
+    import testshim.RoyaleUnitTestRunner;
+    
+    /**
+     * @royalesuppresspublicvarwarning
+     */
+    public class LanguageTesterTestArraylikeGetSet
+    {
+    
+        public static var isJS:Boolean = COMPILE::JS;
+        
+        [BeforeClass]
+        public static function setUpBeforeClass():void
+        {
+
+        }
+        
+        [AfterClass]
+        public static function tearDownAfterClass():void
+        {
+        }
+        
+        [Before]
+        public function setUp():void
+        {
+            arrayList= new ArrayList(['dog', 'cat','mouse','gerbil']);
+        }
+        
+        [After]
+        public function tearDown():void
+        {
+        }
+        
+        
+        /*public function LanguageTesterTestArraylikeGetSet(){
+            
+        }*/
+    
+        public var arrayList:ArrayList;
+    
+     /*   [Test]
+        public function testImpl():void
+        {
+            var other:ArrayList = new ArrayList([1,2,3]);
+            var local:ArrayList = new ArrayList(['gerbil','something else']);
+            arrayList[0] = local[0];
+            assertEquals(arrayList.getItemAt(0),'gerbil', 'unexpected get/set 
result')
+            //RoyaleUnitTestRunner.consoleOut(arrayList.source.toString());
+            arrayList.setItemAt('manually assigned gerbil',0);
+            RoyaleUnitTestRunner.consoleOut(arrayList.source.toString());
+            if (arrayList[0] == 'manually assigned gerbil') {
+                arrayList[0] = local[1];
+            }
+            assertEquals(arrayList.getItemAt(0),'something else', 'unexpected 
get/set result');
+            var collect:Array = [];
+            for(var i:int =0; i<other[2];i++) { // 'getItemAt' used in here
+                collect.push(other[i]); //'getItemAt'
+            }
+            assertEquals(collect.toString(),'1,2,3', 'unexpected loop result');
+    
+            if (arrayList[0] == 'not the value') {
+                arrayList[0] = 'bad assignment';
+            } else {
+                arrayList[0] = 'correct assignment';
+            }
+            assertEquals(arrayList.getItemAt(0),'correct assignment', 
'unexpected assignment result in else block');
+            RoyaleUnitTestRunner.consoleOut(arrayList.source.toString());
+           
+            try{
+                arrayList[0] = "inside try";
+            } catch (e:Error)
+            {
+               //no error
+            } finally{
+                arrayList[1] = "inside finally";
+            }
+            assertEquals(arrayList.getItemAt(0),'inside try', 'unexpected 
try/catch/finally result');
+            assertEquals(arrayList.getItemAt(1),'inside finally', 'unexpected 
try/catch/finally result');
+            
+        }
+        
+        [Test]
+        public function testSubClass():void{
+            //test 'inheritance' via class (ArrayListView in this case)
+            arrayList= new ArrayList(['dog', 'cat','mouse','gerbil']);
+            var other:ArrayList = new ArrayList([1,2,3]);
+            var local:ArrayList = new ArrayList(['gerbil','something else']);
+    
+            var alv:ArrayListView = new ArrayListView(arrayList);
+            var alv1:ArrayListView = new ArrayListView(other);
+            var alv2:ArrayListView = new ArrayListView(local);
+            alv[0] = alv2[0];
+            assertEquals(alv.getItemAt(0),'gerbil', 'unexpected get/set 
result');
+            //RoyaleUnitTestRunner.consoleOut(arrayList.source.toString());
+            alv.setItemAt('manually assigned gerbil',0);
+            RoyaleUnitTestRunner.consoleOut(alv.source.toString());
+            if (alv[0] == 'manually assigned gerbil') {
+                alv[0] = alv2[1];
+            }
+            assertEquals(alv.getItemAt(0),'something else', 'unexpected 
get/set result');
+            var collect:Array = [];
+            for(var i:int =0; i<alv1[2];i++) { // 'getItemAt' used in here
+                collect.push(alv1[i]); //'getItemAt'
+            }
+            assertEquals(collect.toString(),'1,2,3', 'unexpected loop result');
+    
+            if (alv[0] == 'not the value') {
+                alv[0] = 'bad assignment';
+            } else {
+                alv[0] = 'correct assignment';
+            }
+            assertEquals(alv.getItemAt(0),'correct assignment', 'unexpected 
assignment result in else block');
+            RoyaleUnitTestRunner.consoleOut(alv.source.toString());
+    
+            try{
+                alv[0] = "inside try";
+            } catch (e:Error)
+            {
+                //no error
+            } finally{
+                alv[1] = "inside finally";
+            }
+            assertEquals(alv.getItemAt(0),'inside try', 'unexpected 
try/catch/finally result');
+            assertEquals(alv.getItemAt(1),'inside finally', 'unexpected 
try/catch/finally result');
+        }
+    */
+    
+        [Test]
+        public function testNested():void
+        {
+            arrayList= new ArrayList(['dog', 'cat','mouse','gerbil']);
+            
+            var f:Function = function something():String{
+                arrayList[1] = 'another dog';
+                return arrayList[1] as String;
+            };
+    
+            var f2:Function = function():String{
+                arrayList[1] = 'yet another dog';
+                return arrayList[1] as String;
+            };
+            
+            var check:String = f();
+            assertEquals(check,'another dog', 'unexpected get/set result');
+            
+            assertEquals(arrayList.getItemAt(1),'another dog', 'unexpected 
get/set result');
+    
+            check = f2();
+            assertEquals(check,'yet another dog', 'unexpected get/set result');
+    
+            assertEquals(arrayList.getItemAt(1),'yet another dog', 'unexpected 
get/set result');
+                  
+        }
+        
+        private function localReturn(val:ArrayList):String{
+            val[0] = 'get and set from localMethod';
+            return val[0] as String;
+        }
+    
+        [Test]
+        public function testLocalMethodReturn():void{
+            arrayList= new ArrayList(['dog', 'cat','mouse','gerbil']);
+        
+            var check:String = localReturn(arrayList);
+            assertEquals(check,'get and set from localMethod', 'unexpected 
get/set result');
+            assertEquals(arrayList.getItemAt(0),'get and set from 
localMethod', 'unexpected get/set result');
+        }
+        
+        
+        [Test]
+        public function testExternalFunc():void{
+            arrayList= new ArrayList(['dog', 'cat','mouse','gerbil']);
+            
+            var check:String = checkArrayLikeFunc(arrayList);
+            assertEquals(check,'get and set from checkArrayLikeFunc', 
'unexpected get/set result');
+            assertEquals(arrayList.getItemAt(0),'get and set from 
checkArrayLikeFunc', 'unexpected get/set result');
+        }
+        
+        
+        public function testBinaryData():void{
+            var bd:BinaryData = new BinaryData();
+            bd.length = 100;
+            var checkVal:uint = 0;
+            for (var i:uint=0;i<100;i++) {
+                checkVal += i;
+                bd[i] = i;
+            }
+            var summationCheck:uint=0;
+            for each(var byte:uint in bd) {
+                summationCheck += byte;
+            }
+            assertEquals(bd[99], 99, 'unexpected value at index');
+            assertEquals(summationCheck, checkVal, 'unexpected check on 
result')
+        }
+        
+        
+        
+    }
+}
diff --git 
a/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as
 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as
new file mode 100644
index 0000000..2a2c2e2
--- /dev/null
+++ 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as
@@ -0,0 +1,205 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package flexUnitTests.language
+{
+    
+    
+    import org.apache.royale.test.asserts.*;
+    
+    import flexUnitTests.language.support.*;
+    import org.apache.royale.collections.ArrayList;
+    import org.apache.royale.collections.IArrayList;
+    
+    import testshim.RoyaleUnitTestRunner;
+    
+    /**
+     * @royalesuppresspublicvarwarning
+     */
+    public class LanguageTesterTestForEach
+    {
+        /*import org.apache.royale.language.iterator.arrayLike;*/
+    
+        public static var isJS:Boolean = COMPILE::JS;
+        
+        [BeforeClass]
+        public static function setUpBeforeClass():void
+        {
+           
+        }
+        
+        [AfterClass]
+        public static function tearDownAfterClass():void
+        {
+        }
+        
+        [Before]
+        public function setUp():void
+        {
+            _myList = new ArrayList(['dog', 'cat','mouse','gerbil'])
+        }
+        
+        [After]
+        public function tearDown():void
+        {
+        }
+        private var _animal:String;
+        private var _char:String;
+        private var _myList:ArrayList 
+        
+      
+        [Test]
+        public function testNested1():void
+        {
+            var arrayList:ArrayList = new ArrayList(['dog', 
'cat','mouse','gerbil']);
+            
+            var foundItems:Array = [];
+            var charItems:Array = [];
+            for each(var animal:String in arrayList) {
+                foundItems.push(animal);
+                var deepList:ArrayList = new ArrayList(animal.split(''));
+                for each(var char:String in deepList) {
+                   // RoyaleUnitTestRunner.consoleOut(char);
+                    charItems.push(char);
+                }
+            }
+        //    RoyaleUnitTestRunner.consoleOut(value + '');
+            assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 
'unexpected for each result');
+            //check nested loop content
+            assertEquals(charItems.toString(), 
'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result');
+        }
+        
+
+    
+        [Test]
+        public function testNested1a():void
+        {
+            var array:Array=['dog', 'cat','mouse','gerbil'];
+        
+            var foundItems:Array = [];
+            var charItems:Array = [];
+            for each(_animal in array) {
+                foundItems.push(_animal);
+                var deepList:Array = _animal.split('');
+                for each(_char in deepList) {
+                    // RoyaleUnitTestRunner.consoleOut(char);
+                    charItems.push(_char);
+                }
+            }
+            //    RoyaleUnitTestRunner.consoleOut(value + '');
+            assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 
'unexpected for each result');
+            //check nested loop content
+            assertEquals(charItems.toString(), 
'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result');
+        }
+    
+        [Test]
+        public function testNested1b():void
+        {
+            //using a target referenced externally
+            var foundItems:Array = [];
+            var charItems:Array = [];
+            for each(_animal in _myList) {
+                foundItems.push(_animal);
+                var deepList:ArrayList = new ArrayList(_animal.split(''));
+                for each(_char in deepList) {
+                    // RoyaleUnitTestRunner.consoleOut(char);
+                    charItems.push(_char);
+                }
+            }
+            //    RoyaleUnitTestRunner.consoleOut(value + '');
+            assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 
'unexpected for each result');
+            //check nested loop content
+            assertEquals(charItems.toString(), 
'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result');
+        }
+        
+        
+        [Test]
+        public function testNested2():void
+        {
+            var arrayList:ArrayList = new ArrayList(['dog', 
'cat','mouse','gerbil']);
+        
+            var foundItems:Array = [];
+            var charItems:Array = [];
+            for each(_animal in arrayList) {
+                foundItems.push(_animal);
+                var deepList:ArrayList = new ArrayList(_animal.split(''));
+                for each(_char in deepList) {
+                    // RoyaleUnitTestRunner.consoleOut(char);
+                    charItems.push(_char);
+                }
+            }
+            //    RoyaleUnitTestRunner.consoleOut(value + '');
+            assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 
'unexpected for each result');
+            //check nested loop content
+            assertEquals(charItems.toString(), 
'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result');
+        }
+    
+    
+        [Test]
+        public function testNested3():void
+        {
+            var arrayList:IArrayList = new ArrayList(['dog', 
'cat','mouse','gerbil']);
+        
+            var foundItems:Array = [];
+            var charItems:Array = [];
+            for each(_animal in arrayList) {
+                foundItems.push(_animal);
+                var deepList:IArrayList = new ArrayList(_animal.split(''));
+                for each(_char in deepList) {
+                    // RoyaleUnitTestRunner.consoleOut(char);
+                    charItems.push(_char);
+                }
+            }
+            //    RoyaleUnitTestRunner.consoleOut(value + '');
+            assertEquals(foundItems.toString(), 'dog,cat,mouse,gerbil', 
'unexpected for each result');
+            //check nested loop content
+            assertEquals(charItems.toString(), 
'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result');
+        }
+        
+        
+       [Test]
+        public function testXML():void{
+            var xm:XML = <test><child><child/></child></test>;
+            RoyaleUnitTestRunner.consoleOut('xml' );
+            for each(var xml:XML in xm..child) {
+                RoyaleUnitTestRunner.consoleOut(xml.toXMLString() );
+            }
+            RoyaleUnitTestRunner.consoleOut('thing' );
+            for each(var thing:XML in xm) {
+                RoyaleUnitTestRunner.consoleOut(thing.toXMLString() );
+            }
+            assertTrue(true)
+        }
+    
+    
+        [Test]
+        public function tesTargetMutation():void{
+            var arrayList:ArrayList = new ArrayList(['dog', 
'cat','mouse','gerbil']);
+    
+            var foundItems:Array = [];
+            var charItems:Array = [];
+            for each(_animal in arrayList) {
+                foundItems.push(_animal);
+                if (arrayList.length) arrayList.removeAll();//should stop 
iterating after first item
+            }
+            assertEquals(foundItems.toString(), 'dog', 'unexpected for each 
result');
+        }
+        
+        
+    }
+}
diff --git a/frameworks/projects/Language/src/main/royale/LanguageClasses.as 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/support/checkArrayLikeFunc.as
similarity index 66%
copy from frameworks/projects/Language/src/main/royale/LanguageClasses.as
copy to 
manualtests/UnitTests/src/main/royale/flexUnitTests/language/support/checkArrayLikeFunc.as
index 2d4388e..11ae093 100644
--- a/frameworks/projects/Language/src/main/royale/LanguageClasses.as
+++ 
b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/support/checkArrayLikeFunc.as
@@ -16,26 +16,14 @@
 //  limitations under the License.
 //
 
////////////////////////////////////////////////////////////////////////////////
-package {
-
-/**
- *  @private
- *  This class is used to link additional classes into Language.swc
- *  beyond those that are found by dependency analysis starting
- *  from the classes specified in manifest.xml.
- */
-internal class LanguageClasses
+package flexUnitTests.language.support
 {
-       COMPILE::JS
-       {
-           import org.apache.royale.utils.Language; Language;
-               import QName; QName;
-               import Namespace; Namespace;
-
-       }
-       import org.apache.royale.language.string.match; match;
-       import org.apache.royale.language.string.search; search;
+    import org.apache.royale.collections.ArrayList;
+    
+    public function checkArrayLikeFunc(val:ArrayList):String
+    {
+        val[0] = 'get and set from checkArrayLikeFunc';
+        return val[0] as String;
+       // return val.getItemAt(0) as String;
+    }
 }
-
-}
-

Reply via email to