diff --git a/src/Workspaces/Core/Portable/Utilities/BKTree.Edge.cs b/src/Workspaces/Core/Portable/Utilities/BKTree.Edge.cs index 2aa54da3247f38515ca3d27ab9c35bf1cbac7784..53107cc8cf7da403966f8258b080381e768a8685 100644 --- a/src/Workspaces/Core/Portable/Utilities/BKTree.Edge.cs +++ b/src/Workspaces/Core/Portable/Utilities/BKTree.Edge.cs @@ -21,6 +21,17 @@ public Edge(int editDistance, int childNodeIndex) EditDistance = editDistance; ChildNodeIndex = childNodeIndex; } + + internal void WriteTo(ObjectWriter writer) + { + writer.WriteInt32(EditDistance); + writer.WriteInt32(ChildNodeIndex); + } + + internal static Edge ReadFrom(ObjectReader reader) + { + return new Edge(reader.ReadInt32(), reader.ReadInt32()); + } } } } \ No newline at end of file diff --git a/src/Workspaces/Core/Portable/Utilities/BKTree.Node.cs b/src/Workspaces/Core/Portable/Utilities/BKTree.Node.cs index e84e0e7d32ba072a0d55c83062a211ed756d33ff..c5447a097cdf67889110c861278a85e168c9bb1e 100644 --- a/src/Workspaces/Core/Portable/Utilities/BKTree.Node.cs +++ b/src/Workspaces/Core/Portable/Utilities/BKTree.Node.cs @@ -27,6 +27,18 @@ public Node(char[] lowerCaseCharacters, int edgeCount, int firstEdgeIndex) EdgeCount = edgeCount; FirstEdgeIndex = firstEdgeIndex; } + + internal void WriteTo(ObjectWriter writer) + { + writer.WriteValue(LowerCaseCharacters); + writer.WriteInt32(EdgeCount); + writer.WriteInt32(FirstEdgeIndex); + } + + internal static Node ReadFrom(ObjectReader reader) + { + return new Node((char[])reader.ReadValue(), reader.ReadInt32(), reader.ReadInt32()); + } } } } diff --git a/src/Workspaces/Core/Portable/Utilities/BKTree.Serialization.cs b/src/Workspaces/Core/Portable/Utilities/BKTree.Serialization.cs new file mode 100644 index 0000000000000000000000000000000000000000..c45f3f74c610b2239c653bdaa48ba6867038bc56 --- /dev/null +++ b/src/Workspaces/Core/Portable/Utilities/BKTree.Serialization.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Roslyn.Utilities +{ + internal partial class BKTree + { + internal void WriteTo(ObjectWriter writer) + { + writer.WriteInt32(this._nodes.Length); + foreach (var node in _nodes) + { + node.WriteTo(writer); + } + + writer.WriteInt32(this._edges.Length); + foreach (var edge in _edges) + { + edge.WriteTo(writer); + } + } + + internal static BKTree ReadFrom(ObjectReader reader) + { + var nodes = new Node[reader.ReadInt32()]; + for (var i = 0; i < nodes.Length; i++) + { + nodes[i] = Node.ReadFrom(reader); + } + + var edges = new Edge[reader.ReadInt32()]; + for (var i = 0; i < edges.Length; i++) + { + edges[i] = Edge.ReadFrom(reader); + } + + return new BKTree(nodes, edges); + } + } +} diff --git a/src/Workspaces/Core/Portable/Utilities/BKTree.cs b/src/Workspaces/Core/Portable/Utilities/BKTree.cs index 84a717ef7cab34bff52bb0e6a6faf72b53a13f1f..e36fe14510e1a2b9779cd68671959becb831194a 100644 --- a/src/Workspaces/Core/Portable/Utilities/BKTree.cs +++ b/src/Workspaces/Core/Portable/Utilities/BKTree.cs @@ -12,6 +12,10 @@ namespace Roslyn.Utilities { internal partial class BKTree { + public static readonly BKTree Empty = new BKTree( + SpecializedCollections.EmptyArray(), + SpecializedCollections.EmptyArray()); + // We have two completely flat arrays of structs (except for the char[] values the nodes // point to). These arrays fully represent the BK tree. The structure is as follows: // diff --git a/src/Workspaces/Core/Portable/Workspaces.csproj b/src/Workspaces/Core/Portable/Workspaces.csproj index 64b2410070099db54b0183f025ae8cff75b8df57..9a349f16c20a113628a1e0df1d1f2c43c41b0068 100644 --- a/src/Workspaces/Core/Portable/Workspaces.csproj +++ b/src/Workspaces/Core/Portable/Workspaces.csproj @@ -418,6 +418,7 @@ +