Generate CodeSnippetTypeMember with correct separators. Fixes #8927
authorMarek Safar <marek.safar@gmail.com>
Sat, 15 Dec 2012 11:38:43 +0000 (12:38 +0100)
committerMarek Safar <marek.safar@gmail.com>
Sat, 15 Dec 2012 11:46:59 +0000 (12:46 +0100)
mcs/class/System/System.CodeDom.Compiler/CodeGenerator.cs
mcs/class/System/Test/System.CodeDom.Compiler/CodeGeneratorGenerateFromCompileUnitTest.cs

index 2a562095ab55d74d7e3e0885d8c7647237a0a585..71711490b32852d00efbf6bb43d77a108991f5d6 100644 (file)
@@ -915,6 +915,8 @@ namespace System.CodeDom.Compiler {
                                                GenerateLinePragmaEnd (prevMember.LinePragma);
                                        if (prevMember.EndDirectives.Count > 0)
                                                GenerateDirectives (prevMember.EndDirectives);
+                                       if (!Options.VerbatimOrder && prevMember is CodeSnippetTypeMember && !(member is CodeSnippetTypeMember))
+                                               output.WriteLine ();
                                }
 
                                if (options.BlankLinesBetweenMembers)
@@ -948,6 +950,8 @@ namespace System.CodeDom.Compiler {
                                        GenerateLinePragmaEnd (currentMember.LinePragma);
                                if (currentMember.EndDirectives.Count > 0)
                                        GenerateDirectives (currentMember.EndDirectives);
+                               if (!Options.VerbatimOrder && currentMember is CodeSnippetTypeMember)
+                                       output.WriteLine ();
                        }
 
                        this.currentType = type;
@@ -1042,7 +1046,7 @@ namespace System.CodeDom.Compiler {
 
                // The position in the array determines the order in which those
                // kind of CodeTypeMembers are generated. Less is more ;-)
-               static Type [] memberTypes = {  typeof (CodeMemberField),
+               static readonly Type [] memberTypes = { typeof (CodeMemberField),
                                                typeof (CodeSnippetTypeMember),
                                                typeof (CodeTypeConstructor),
                                                typeof (CodeConstructor),
@@ -1293,7 +1297,14 @@ namespace System.CodeDom.Compiler {
        
                        public void Visit (CodeSnippetTypeMember o)
                        {
+                               var indent = g.Indent;
+                               g.Indent = 0;
                                g.GenerateSnippetMember (o);
+
+                               if (g.Options.VerbatimOrder)
+                                       g.Output.WriteLine ();
+
+                               g.Indent = indent;
                        }
        
                        public void Visit (CodeTypeConstructor o)
index 041e1ab93b39c1a172b0aecf47577287cfbf5340..b88e1c17cdf8b655345db36699241c8304786ec4 100644 (file)
@@ -29,6 +29,7 @@
 using System;
 using System.CodeDom;
 using System.CodeDom.Compiler;
+using Microsoft.CSharp;
 using System.IO;
 
 using NUnit.Framework;
@@ -54,6 +55,64 @@ namespace MonoTests.System.CodeDom.Compiler
                        Assert.Greater (attributePosition, importPosition, "Actual order: " + result);
                }
 
+               [Test]
+               public void CodeSnippetBlankLines ()
+               {
+                       var opt = new CodeGeneratorOptions () {
+                               BlankLinesBetweenMembers = false,
+                               VerbatimOrder = false
+                       };
+
+                       var ccu = new CodeCompileUnit ();
+                       var ns = new CodeNamespace ("Foo");
+                       ccu.Namespaces.Add (ns);
+                       var t = new CodeTypeDeclaration ("Bar");
+                       ns.Types.Add (t);
+
+                       t.Members.Add (new CodeSnippetTypeMember ("#line hidden"));
+                       t.Members.Add (new CodeSnippetTypeMember ("#line hidden2"));
+       
+                       t.Members.Add (new CodeMemberMethod () { Name = "Foo" });
+
+                       using (var sw = new StringWriter ()) {
+                               new CSharpCodeProvider ().GenerateCodeFromCompileUnit (ccu, sw, opt);
+                               var str = sw.ToString ();
+
+                               Assert.IsFalse (str.Contains ("hidden2private"), "#0");
+                               Assert.IsTrue (str.Contains( "#line hidden#line hidden2"), "#1");
+                       }
+               }
+
+               [Test]
+               public void CodeSnippetBlankLinesVerbatimOrder ()
+               {
+                       var opt = new CodeGeneratorOptions () {
+                               BlankLinesBetweenMembers = false,
+                               VerbatimOrder = true
+                       };
+
+                       var ccu = new CodeCompileUnit ();
+                       var ns = new CodeNamespace ("Foo");
+                       ccu.Namespaces.Add (ns);
+                       var t = new CodeTypeDeclaration ("Bar");
+                       ns.Types.Add (t);
+
+                       t.Members.Add (new CodeSnippetTypeMember ("#line hidden"));
+                       t.Members.Add (new CodeSnippetTypeMember ("#line hidden2"));
+       
+                       t.Members.Add (new CodeMemberMethod () { Name = "Foo" });
+
+                       using (var sw = new StringWriter ()) {
+                               new CSharpCodeProvider ().GenerateCodeFromCompileUnit (ccu, sw, opt);
+                               var str = sw.ToString ();
+
+                               Assert.IsFalse (str.Contains ("hidden2private"), "#0");
+                               Assert.IsFalse (str.Contains( "#line hidden#line hidden2"), "#1");
+                               Assert.IsTrue (str.Contains( "#line hidden" + Environment.NewLine), "#2");
+                               Assert.IsTrue (str.Contains( "#line hidden2" + Environment.NewLine), "#3");
+                       }
+               }
+
                private const string ATTRIBUTE = "ATTRIBUTE";
                private const string IMPORT = "IMPORT";