Merge pull request #2572 from akoeplinger/fix-monodoc-language
[mono.git] / mcs / class / System / Microsoft.CSharp / CSharpCodeGenerator.cs
index e5d9e5e7e669b6fa293eed9d2037467b419084eb..ecc7b1a4645f400223e493bd48916a0e9819c5a9 100644 (file)
@@ -172,7 +172,28 @@ namespace Mono.CSharp
                {
                        GenerateCompileUnitStart (compileUnit);
 
-                       GenerateGlobalNamespace (compileUnit);
+                       List<CodeNamespaceImport> imports = null;
+                       foreach (CodeNamespace codeNamespace in compileUnit.Namespaces) {
+                               if (!string.IsNullOrEmpty (codeNamespace.Name))
+                                       continue;
+
+                               if (codeNamespace.Imports.Count == 0)
+                                       continue;
+
+                               if (imports == null)
+                                       imports = new List<CodeNamespaceImport> ();
+
+                               foreach (CodeNamespaceImport i in codeNamespace.Imports)
+                                       imports.Add (i);
+                       }
+
+                       if (imports != null) {
+                               imports.Sort ((a, b) => a.Namespace.CompareTo (b.Namespace));
+                               foreach (var import in imports)
+                                       GenerateNamespaceImport (import);
+
+                               Output.WriteLine ();
+                       }
 
                        if (compileUnit.AssemblyCustomAttributes.Count > 0) {
                                OutputAttributes (compileUnit.AssemblyCustomAttributes, 
@@ -180,26 +201,24 @@ namespace Mono.CSharp
                                Output.WriteLine ("");
                        }
 
-                       GenerateLocalNamespaces (compileUnit);
-
-                       GenerateCompileUnitEnd (compileUnit);
-               }
+                       CodeNamespaceImportCollection global_imports = null;
+                       foreach (CodeNamespace codeNamespace in compileUnit.Namespaces) {
+                               if (string.IsNullOrEmpty (codeNamespace.Name)) {
+                                       global_imports = codeNamespace.Imports;
+                                       codeNamespace.Imports.Clear ();
+                               }
 
-               private void GenerateGlobalNamespace (CodeCompileUnit compileUnit) {
-                       CodeNamespace globalNamespace = null;
+                               GenerateNamespace (codeNamespace);
 
-                       foreach (CodeNamespace codeNamespace in compileUnit.Namespaces)
-                               if (string.IsNullOrEmpty (codeNamespace.Name)) 
-                                       globalNamespace = codeNamespace;
-  
-                       if (globalNamespace != null)
-                               GenerateNamespace (globalNamespace);
-               }
+                               if (global_imports != null) {
+                                       codeNamespace.Imports.Clear ();
+                                       foreach (CodeNamespaceImport ns in global_imports)
+                                       codeNamespace.Imports.Add (ns);
+                                       global_imports = null;
+                               }
+                       }
 
-               private void GenerateLocalNamespaces (CodeCompileUnit compileUnit) {
-                       foreach (CodeNamespace codeNamespace in compileUnit.Namespaces)
-                               if (!string.IsNullOrEmpty (codeNamespace.Name))
-                                       GenerateNamespace (codeNamespace);
+                       GenerateCompileUnitEnd (compileUnit);
                }
 
                protected override void GenerateDefaultValueExpression (CodeDefaultValueExpression e)
@@ -1597,9 +1616,13 @@ namespace Mono.CSharp
 
                static void FillKeywordTable ()
                {
-                       keywordsTable = new Hashtable ();
-                       foreach (string keyword in keywords) {
-                               keywordsTable.Add (keyword, keyword);
+                       lock (keywords) {
+                               if (keywordsTable == null) {
+                                       keywordsTable = new Hashtable ();
+                                       foreach (string keyword in keywords) {
+                                               keywordsTable.Add (keyword, keyword);
+                                       }
+                               }
                        }
                }