diff --git a/src/Compilers/CSharp/Portable/Syntax/InternalSyntax/SyntaxList.WithManyChildren.cs b/src/Compilers/CSharp/Portable/Syntax/InternalSyntax/SyntaxList.WithManyChildren.cs index 6fc4d8d7f845e825301433302e4b5f7859e2b282..0107bc425142d4dfab62f79eac22e0562cfa224e 100644 --- a/src/Compilers/CSharp/Portable/Syntax/InternalSyntax/SyntaxList.WithManyChildren.cs +++ b/src/Compilers/CSharp/Portable/Syntax/InternalSyntax/SyntaxList.WithManyChildren.cs @@ -39,14 +39,29 @@ private void InitializeChildren() internal WithManyChildrenBase(ObjectReader reader) : base(reader) { - this.children = ArrayElement.MakeElementArray((CSharpSyntaxNode[])reader.ReadValue()); + var length = reader.ReadInt32(); + + this.children = new ArrayElement[length]; + for (var i = 0; i < length; i++) + { + this.children[i].Value = (CSharpSyntaxNode)reader.ReadValue(); + } + this.InitializeChildren(); } internal override void WriteTo(ObjectWriter writer) { base.WriteTo(writer); - writer.WriteValue(ArrayElement.MakeArray(this.children)); + + // PERF: Write the array out manually.Profiling shows that this is cheaper than converting to + // an array in order to use writer.WriteValue. + writer.WriteInt32(this.children.Length); + + for (var i = 0; i < this.children.Length; i++) + { + writer.WriteValue(this.children[i].Value); + } } protected override int GetSlotCount() diff --git a/src/Compilers/VisualBasic/Portable/Syntax/InternalSyntax/SyntaxList.vb b/src/Compilers/VisualBasic/Portable/Syntax/InternalSyntax/SyntaxList.vb index 211c673c22a7491713d02dd7c0ee8f46565416b4..ee9204d4522cee50f367019e7dbb2d2f53329763 100644 --- a/src/Compilers/VisualBasic/Portable/Syntax/InternalSyntax/SyntaxList.vb +++ b/src/Compilers/VisualBasic/Portable/Syntax/InternalSyntax/SyntaxList.vb @@ -331,13 +331,27 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax Protected Sub New(reader As ObjectReader) MyBase.New(reader) - Me._children = ArrayElement(Of VisualBasicSyntaxNode).MakeElementArray(DirectCast(reader.ReadValue(), VisualBasicSyntaxNode())) + + Dim length = reader.ReadInt32() + + Me._children = New ArrayElement(Of VisualBasicSyntaxNode)(length - 1) {} + For i = 0 To length - 1 + Me._children(i).Value = DirectCast(reader.ReadValue(), VisualBasicSyntaxNode) + Next + InitChildren() End Sub Friend Overrides Sub WriteTo(writer As ObjectWriter) MyBase.WriteTo(writer) - writer.WriteValue(ArrayElement(Of VisualBasicSyntaxNode).MakeArray(Me._children)) + + ' PERF Write the array out manually.Profiling shows that this Is cheaper than converting to + ' an array in order to use writer.WriteValue. + writer.WriteInt32(Me._children.Length) + + For i = 0 To Me._children.Length - 1 + writer.WriteValue(Me._children(i).Value) + Next End Sub Friend Overrides Sub CopyTo(nodes As ArrayElement(Of VisualBasicSyntaxNode)(), offset As Integer) diff --git a/src/Workspaces/CoreTest/SolutionTests/SolutionTests.cs b/src/Workspaces/CoreTest/SolutionTests/SolutionTests.cs index 03665e23cc238773a68af6be094ce5fb2e424392..7b9732656c30dda38b5b78c25bf02a7a3184a3c2 100644 --- a/src/Workspaces/CoreTest/SolutionTests/SolutionTests.cs +++ b/src/Workspaces/CoreTest/SolutionTests/SolutionTests.cs @@ -998,7 +998,14 @@ public void TestRecoverableSyntaxTreeCSharp() var pid = ProjectId.CreateNewId(); var did = DocumentId.CreateNewId(pid); - var text = "public class C {}"; + var text = @"public class C { + public void Method1() {} + public void Method2() {} + public void Method3() {} + public void Method4() {} + public void Method5() {} + public void Method6() {} +}"; var sol = CreateNotKeptAliveSolution() .AddProject(pid, "foo", "foo.dll", LanguageNames.CSharp) @@ -1014,7 +1021,20 @@ public void TestRecoverableSyntaxTreeVisualBasic() var pid = ProjectId.CreateNewId(); var did = DocumentId.CreateNewId(pid); - var text = @"Public Class C\r\nEnd Class"; + var text = @"Public Class C + Sub Method1() + End Sub + Sub Method2() + End Sub + Sub Method3() + End Sub + Sub Method4() + End Sub + Sub Method5() + End Sub + Sub Method6() + End Sub +End Class"; var sol = CreateNotKeptAliveSolution() .AddProject(pid, "foo", "foo.dll", LanguageNames.VisualBasic)