/// <summary> /// Convert this AddReferenceDatabase from the mutable (buildable) form into the immutable (queryable) /// form. This must be done after all PackageDatabases are added and before any queriesa are run. /// When deserialized, ARDB is always loaded in queryable form. /// </summary> public void ConvertToImmutable() { this.StringStore.ConvertToImmutable(); if (this.DeclaredMembers.RequiresRemap()) { this.DeclaredMembers.UpdateIdentifiers(this.StringStore); this.DeclaredMembers.Sort((left, right) => { if (DeclaredMembers.GetParent(left) == 0 && DeclaredMembers.GetParent(right) == 0) { // Keep Packages sorted by insertion order (popularity) return(left.CompareTo(right)); } else { // Sort namespaces and types by name [same sort as StringStore] return(DeclaredMembers.GetNameIdentifier(left).CompareTo(DeclaredMembers.GetNameIdentifier(right))); } }); } this.Index.ConvertToImmutable(this.StringStore); }
public void WriteBinary(BinaryWriter w) { // Don't write database if empty (BinarySerializable will detect and delete file) if (IsEmpty) { return; } // Ensure the database has been converted to queryable/writable form ConvertToImmutable(); w.Write(BinaryFileFormatVersion); // Write strings StringStore.WriteBinary(w); // Write symbol tree DeclaredMembers.WriteBinary(w); // Write details w.Write(DeclaredMemberDetails); // Write symbol locations w.Write(DeclaredMemberLocations); // Write file tree FileTree.WriteBinary(w); // Write search index Index.WriteBinary(w); // Write identity details (last; likely to change) // PackageIdentity must be last so DownloadCount can be seeked to Identity.WriteBinary(w); }
public void ReadBinary(BinaryReader r) { int formatVersion = r.ReadInt32(); if (formatVersion != BinaryFileFormatVersion) { throw new IOException(String.Format(Resources.DatabaseFormatVersionWrong, BinaryFileFormatVersion, formatVersion)); } StringStore.ReadBinary(r); DeclaredMembers.ReadBinary(r); DeclaredMemberDetails = r.ReadList <SymbolDetails>(); DeclaredMemberLocations = r.ReadList <SymbolLocation>(); FileTree.ReadBinary(r); Index.ReadBinary(r); // PackageIdentity must be last so DownloadCount can be seeked to Identity.ReadBinary(r); }
public void ConvertToImmutable() { // Convert strings (and get remap array) this.StringStore.ConvertToImmutable(); // Remap strings in DefinedSymbolTree if (DeclaredMembers.RequiresRemap()) { DeclaredMembers.UpdateIdentifiers(StringStore); // Remap strings in DefinedSymbolDetails for (int i = 0; i < DeclaredMemberDetails.Count; ++i) { SymbolDetails details = DeclaredMemberDetails[i]; details.UpdateIdentifiers(StringStore); DeclaredMemberDetails[i] = details; } // Sort the DefinedSymbolTree by name and then parameters [same order as StringStore] DeclaredMembers.Sort((left, right) => { int nameCompare = DeclaredMembers.GetNameIdentifier(left).CompareTo(DeclaredMembers.GetNameIdentifier(right)); if (nameCompare != 0) { return(nameCompare); } return(DeclaredMemberDetails[left].ParametersIdentifier.CompareTo(DeclaredMemberDetails[right].ParametersIdentifier)); }); } // Remap strings in FileTree if (FileTree.RequiresRemap()) { FileTree.UpdateIdentifiers(StringStore); } // Convert MemberIndex Index.ConvertToImmutable(StringStore); }