Hey Greg,
Starting with the commit, there are times when compilation gets stuck in an
infinite loop. It should be possible to reproduce using the following code:
for each(var key:Object in Fake.hello)
{
}
"Fake" is a class that does not exist. It should result in an error, but the
compiler seems to get stuck trying to resolve it over and over again.
- Josh
On 2019/10/02 08:39:35, [email protected] wrote:
> 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;
> + }
> }
> -
> -}
> -
>
>