* System.CodeDom.Compiler/CodeGenerator.cs: Clear out the current member
authorJonathan Pryor <jpryor@novell.com>
Tue, 13 Apr 2010 18:48:04 +0000 (18:48 -0000)
committerJonathan Pryor <jpryor@novell.com>
Tue, 13 Apr 2010 18:48:04 +0000 (18:48 -0000)
  when beginning Type generation.  This prevents "invalid"
  `#endregion`s; if the CodeGenerator instance is reused for multiple
  types, the last member of the first type has an EndDirective, then
  the EndDirectvies will be generated before any members of the 2nd
  type.  Don't do that.
* Test/System.CodeDom.Compiler/CodeGeneratorTest.cs: Add some testing
  for CodeRegionDirectives.

svn path=/trunk/mcs/; revision=155321

mcs/class/System/System.CodeDom.Compiler/ChangeLog
mcs/class/System/System.CodeDom.Compiler/CodeGenerator.cs
mcs/class/System/Test/System.CodeDom.Compiler/ChangeLog
mcs/class/System/Test/System.CodeDom.Compiler/CodeGeneratorTest.cs

index 8c4f0e9a08ed435de7502fc8f4c7de2373324e7d..add3550eda216214b5056138759faed01b7d685a 100644 (file)
@@ -1,3 +1,11 @@
+2010-04-13  Jonathan Pryor  <jpryor@novell.com>
+
+       * CodeGenerator.cs: Clear out the current member when beginning Type
+         generation.  This prevents "invalid" `#endregion`s; if the
+         CodeGenerator instance is reused for multiple types, the last member
+         of the first type has an EndDirective, then the EndDirectvies will
+         be generated before any members of the 2nd type.  Don't do that.
+
 2010-04-07  Jb Evain  <jbevain@novell.com>
 
        * Executor.cs: make class static.
index ba1842250ef8ea47d3d1633a17806ad75ce61fab..f2103ff1f070e4866ef406069a8d2cac92d2b932 100644 (file)
@@ -896,6 +896,7 @@ namespace System.CodeDom.Compiler {
                private void GenerateType (CodeTypeDeclaration type)
                {
                        this.currentType = type;
+                       this.currentMember = null;
 
 #if NET_2_0
                        if (type.StartDirectives.Count > 0)
index c90e43c226cd62cfc0ef772dc53d864a86e5db3b..46e6ca01c6ef56ae05525ab478fb96e46bac90a7 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-13  Jonathan Pryor  <jpryor@novell.com>
+
+       * CodeGeneratorTest.cs: Add some testing for CodeRegionDirectives.
+
 2008-05-09  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * CodeGeneratorFromTypeTestBase.cs: Added tests for
index 88f18da3b3d1b22de1ba47747f7fc3f0da4a9da9..2e4d104b2395b8dcb8ee8b4d6aa45c24febd6a3b 100644 (file)
@@ -91,6 +91,57 @@ namespace CodeGeneratorTest
                                CodeGenerator.IsValidLanguageIndependentIdentifier("a spacein2ndplace"), "#G8");
                }
 
+               [Test]
+               public void CurrentMemberShouldBeClearedBetweenTypes ()
+               {
+                       ICodeGenerator codeGenerator = new MockCodeGenerator ();
+                       var o = new StringWriter () {
+                               NewLine = "\n",
+                       };
+
+                       var t = new CodeTypeDeclaration() {
+                               Name = "Foo",
+                               Members = {
+                                       new CodeMemberField() {
+                                               Name = "f",
+                                       },
+                                       new CodeMemberMethod() {
+                                               Name = "M",
+                                               StartDirectives = {
+                                                       new CodeRegionDirective(CodeRegionMode.Start, "foo..."),
+                                               },
+                                               EndDirectives = {
+                                                       new CodeRegionDirective(CodeRegionMode.End, null),
+                                               },
+                                       }
+                               }
+                       };
+
+                       var opts = new CodeGeneratorOptions () {
+                               IndentString = "\t",
+                       };
+
+                       codeGenerator.GenerateCodeFromType (t, o, opts);
+                       t.Name = "Bar";
+                       codeGenerator.GenerateCodeFromType (t, o, opts);
+
+                       var expected = 
+                               "(type Foo\n" + 
+                               "\t\n" +
+                               "\t(field f (TypeRef System.Void))\n" +
+                               "\t\n" +
+                               "\t(region foo...\n" +
+                               "\t\t(method M)))\n" +
+                               "(type Bar\n" + 
+                               "\t\n" +
+                               "\t(field f (TypeRef System.Void))\n" +
+                               "\t\n" +
+                               "\t(region foo...\n" +
+                               "\t\t(method M)))\n";
+
+                       Assert.AreEqual (expected, o.ToString ());
+               }
+
                private CodeTypeDeclaration GetClassType ()
                {
                        return new CodeTypeDeclaration ();
@@ -132,6 +183,9 @@ namespace CodeGeneratorTest
 
                protected override void OutputType (CodeTypeReference typeRef)
                {
+                       Output.Write ("(TypeRef ");
+                       Output.Write (typeRef.BaseType);
+                       Output.Write (")");
                }
 
                protected override void GenerateArrayCreateExpression (CodeArrayCreateExpression e)
@@ -272,6 +326,12 @@ namespace CodeGeneratorTest
 
                protected override void GenerateField (CodeMemberField e)
                {
+                       Output.WriteLine ();
+                       Output.Write ("(field ");
+                       Output.Write (e.Name);
+                       Output.Write (" ");
+                       OutputType (e.Type);
+                       Output.Write (")");
                }
 
                protected override void GenerateSnippetMember (CodeSnippetTypeMember e)
@@ -284,6 +344,10 @@ namespace CodeGeneratorTest
 
                protected override void GenerateMethod (CodeMemberMethod e, CodeTypeDeclaration c)
                {
+                       Output.WriteLine ();
+                       Output.Write ("(method ");
+                       Output.Write (e.Name);
+                       Output.Write (")");
                }
 
                protected override void GenerateProperty (CodeMemberProperty e, CodeTypeDeclaration c)
@@ -300,10 +364,15 @@ namespace CodeGeneratorTest
 
                protected override void GenerateTypeStart (CodeTypeDeclaration e)
                {
+                       Output.Write ("(type ");
+                       Output.Write (e.Name);
+                       ++Indent;
                }
 
                protected override void GenerateTypeEnd (CodeTypeDeclaration e)
                {
+                       Output.WriteLine (")");
+                       --Indent;
                }
 
                protected override void GenerateNamespaceStart (CodeNamespace e)
@@ -356,6 +425,27 @@ namespace CodeGeneratorTest
                        return value;
                }
 
+#if NET_2_0
+               protected override void GenerateDirectives (CodeDirectiveCollection directives)
+               {
+                       foreach (CodeDirective d in directives) {
+                               var r = d as CodeRegionDirective;
+                               if (r != null) {
+                                       if (r.RegionMode == CodeRegionMode.Start) {
+                                               Output.WriteLine ();
+                                               Output.Write ("(region ");
+                                               Output.Write (r.RegionText);
+                                               ++Indent;
+                                       }
+                                       else if (r.RegionMode == CodeRegionMode.End) {
+                                               Output.Write (")");
+                                               --Indent;
+                                       }
+                               }
+                       }
+               }
+#endif
+
                #endregion Override implementation of CodeGenerator
        }
 }