Merge branch 'develop' into dual
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index 2c2050a..897408f 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -548,7 +548,7 @@
     	else if (!isDoc)
     	{
         	if (getModel().inStaticInitializer)
-        		if (!staticUsedNames.contains(name))
+        		if (!staticUsedNames.contains(name) && !NativeUtils.isJSNative(name))
         			staticUsedNames.add(name);
     		
     		if (!usedNames.contains(name))
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
index 73d3b80..0f1d0cd 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
@@ -23,6 +23,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 
 import org.apache.flex.compiler.asdoc.flexjs.ASDocComment;
@@ -149,7 +150,30 @@
         write(ASEmitterTokens.SINGLE_QUOTE);
         write(ASEmitterTokens.PAREN_CLOSE);
         writeNewline(ASEmitterTokens.SEMICOLON);
+        
+        HashMap<String, String> internalClasses = getEmitter().getModel().getInternalClasses();
+        if (internalClasses.size() > 0)
+        {
+        	ArrayList<String> classesInOrder = new ArrayList<String>();
+        	for (String internalClass : internalClasses.keySet())
+        	{
+        		classesInOrder.add(internalClass);
+        	}
+        	Collections.sort(classesInOrder);
+        	for (String internalClass : classesInOrder)
+        	{
+        	       /* goog.provide('x');\n\n */
+                write(JSGoogEmitterTokens.GOOG_PROVIDE);
+                write(ASEmitterTokens.PAREN_OPEN);
+                write(ASEmitterTokens.SINGLE_QUOTE);
+                write(((JSFlexJSEmitter)getEmitter()).formatQualifiedName(internalClass, true));
+                write(ASEmitterTokens.SINGLE_QUOTE);
+                write(ASEmitterTokens.PAREN_CLOSE);
+                writeNewline(ASEmitterTokens.SEMICOLON);
+        	}
+        }
         writeNewline();
+
     }
 
     public void emitContents(IPackageDefinition definition)
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java
index 7f995d9..b26b632 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java
@@ -379,6 +379,8 @@
 		{
 	        for (String dep : gd.fileInfo.impls)
 	        {
+	        	if (gd.fileInfo.provides != null &&
+	        			gd.fileInfo.provides.contains(dep)) continue;
 	            addDeps(dep);
 	        }
 		}
@@ -388,6 +390,8 @@
 	        for (String dep : gd.fileInfo.deps)
 	        {
 	        	gd.deps.add(dep);
+	        	if (gd.fileInfo.provides != null &&
+	        			gd.fileInfo.provides.contains(dep)) continue;
 	            addDeps(dep);
 	        }
 		}
@@ -590,8 +594,16 @@
 					        	c = line.indexOf("goog.provide");
 					        	if (c > -1)
 					        	{
-					        		if (fi.googProvideLine == -i)
+					        		if (fi.googProvideLine == -1)
 					        			fi.googProvideLine = i;
+					        		if (numProvides > 0)
+					        		{
+					        			if (fi.provides == null)
+					        				fi.provides = new ArrayList<String>();
+					        			c2 = line.indexOf(")", c);
+					        			String provide = line.substring(c + 14, c2 - 1);
+					        			fi.provides.add(provide);
+					        		}
 					        		numProvides++;
 					        	}
 					        	else
@@ -922,6 +934,7 @@
 		public ArrayList<String> impls;
 		public ArrayList<String> deps;
 		public ArrayList<String> staticDeps;
+		public ArrayList<String> provides;
 		public int constructorLine;
 		public int depsLine;
 		public int suppressLine;
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/utils/NativeUtils.java b/compiler-jx/src/main/java/org/apache/flex/compiler/utils/NativeUtils.java
index 4969a3d..6a493b2 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/utils/NativeUtils.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/utils/NativeUtils.java
@@ -91,6 +91,7 @@
         NaN("NaN"),
         Event("Event"),
         Array("Array"),
+        RegExp("RegExp"),
         Float32Array("Float32Array"),
         Float64Array("Float64Array"),
         Int8Array("Int8Array"),
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
index 9e94828..f9afc81 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
@@ -434,6 +434,7 @@
         		  " */\n" +
         		  "\n" +
         		  "goog.provide('foo.bar.baz.A');\n" +
+        		  "goog.provide('foo.bar.baz.A.InternalClass');\n" +
         		  "\n" +
         		  "\n" +
         		  "\n" +
@@ -538,6 +539,7 @@
 				" */\n" +
 				"\n" +
 				"goog.provide('foo.bar.baz.A');\n" +
+				"goog.provide('foo.bar.baz.A.internalFunction');\n" +
 				"\n" +
 				"\n" +
 				"\n" +
@@ -606,6 +608,7 @@
 				" */\n" +
 				"\n" +
 				"goog.provide('foo.bar.baz.A');\n" +
+				"goog.provide('foo.bar.baz.A.internalVar');\n" +
 				"\n" +
 				"\n" +
 				"\n" +
@@ -686,6 +689,7 @@
         		  " */\n" +
         		  "\n" +
         		  "goog.provide('foo.bar.baz.A');\n" +
+        		  "goog.provide('foo.bar.baz.A.InternalClass');\n" +
         		  "\n" +
         		  "\n" +
         		  "\n" +
@@ -838,6 +842,7 @@
         		  " */\n" +
         		  "\n" +
         		  "goog.provide('foo.bar.baz.A');\n" +
+        		  "goog.provide('foo.bar.baz.A.InternalClass');\n" +
         		  "\n" +
         		  "\n" +
         		  "\n" +
@@ -995,6 +1000,8 @@
         		  " */\n" +
         		  "\n" +
         		  "goog.provide('foo.bar.baz.A');\n" +
+        		  "goog.provide('foo.bar.baz.A.ITestInterface');\n" +
+        		  "goog.provide('foo.bar.baz.A.InternalClass');\n" +
         		  "\n" +
         		  "\n" +
         		  "\n" +
@@ -1153,6 +1160,7 @@
 				" */\n" +
 				"\n" +
 				"goog.provide('foo.bar.A');\n" +
+				"goog.provide('foo.bar.A.Internal');\n" +
 				"\n" +
 				"\n" +
 				"\n" +
diff --git a/compiler-jx/src/test/resources/flexjs/projects/internal/MainClass_result.js b/compiler-jx/src/test/resources/flexjs/projects/internal/MainClass_result.js
index a96b203..c1f9dd7 100644
--- a/compiler-jx/src/test/resources/flexjs/projects/internal/MainClass_result.js
+++ b/compiler-jx/src/test/resources/flexjs/projects/internal/MainClass_result.js
@@ -20,6 +20,7 @@
  */
 
 goog.provide('MainClass');
+goog.provide('MainClass.InternalClass');
 
 goog.require('OtherClass');
 
diff --git a/compiler/src/main/java/org/apache/flex/compiler/internal/semantics/MethodBodySemanticChecker.java b/compiler/src/main/java/org/apache/flex/compiler/internal/semantics/MethodBodySemanticChecker.java
index 3904823..a20d4de 100644
--- a/compiler/src/main/java/org/apache/flex/compiler/internal/semantics/MethodBodySemanticChecker.java
+++ b/compiler/src/main/java/org/apache/flex/compiler/internal/semantics/MethodBodySemanticChecker.java
@@ -828,11 +828,12 @@
         {
             if ( utils.isInaccessible(iNode, method_binding) )
             {
-                addProblem(new InaccessibleMethodReferenceProblem( 
-                    roundUpUsualSuspects(method_binding, iNode), 
-                    method_binding.getName().getBaseName(),
-                    utils.getTypeOfStem(iNode)
-                ));
+            	if (!method_binding.getName().getBaseName().equals("toString"))
+	                addProblem(new InaccessibleMethodReferenceProblem( 
+	                    roundUpUsualSuspects(method_binding, iNode), 
+	                    method_binding.getName().getBaseName(),
+	                    utils.getTypeOfStem(iNode)
+	                ));
             }
             else if ( SemanticUtils.hasExplicitStem(iNode) && utils.hasUnderlyingType(iNode) )
             {
diff --git a/compiler/src/main/java/org/apache/flex/compiler/internal/tree/as/ExpressionNodeBase.java b/compiler/src/main/java/org/apache/flex/compiler/internal/tree/as/ExpressionNodeBase.java
index 6c514b7..b54c1f0 100644
--- a/compiler/src/main/java/org/apache/flex/compiler/internal/tree/as/ExpressionNodeBase.java
+++ b/compiler/src/main/java/org/apache/flex/compiler/internal/tree/as/ExpressionNodeBase.java
@@ -21,6 +21,7 @@
 
 import org.apache.flex.abc.semantics.Name;
 import org.apache.flex.compiler.common.DependencyType;
+import org.apache.flex.compiler.constants.IASLanguageConstants;
 import org.apache.flex.compiler.definitions.IDefinition;
 import org.apache.flex.compiler.definitions.ITypeDefinition;
 import org.apache.flex.compiler.definitions.references.INamespaceReference;
@@ -149,6 +150,11 @@
         if (type != null)
             isDynamic = type.isDynamic();
 
+        if (!isDynamic)
+        {
+        	String qName = type.getQualifiedName();
+        	isDynamic = qName.equals(IASLanguageConstants.XML) || qName.equals(IASLanguageConstants.XMLList);
+        }
         return isDynamic;
     }