diff --git a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo.cs b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo.cs index e35d3329e8244ab5f09d963216f05e5ed807f369..24ca8762d24cba07e75749bcd584701737ae5627 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo.cs @@ -16,9 +16,9 @@ namespace Microsoft.CodeAnalysis.FindSymbols { - internal partial class SymbolTreeInfo + internal partial class SymbolTreeInfo : IChecksummedObject { - public readonly Checksum Checksum; + public Checksum Checksum { get; } /// /// To prevent lots of allocations, we concatenate all the names in all our diff --git a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs index 3fa988e32885ddd87c07bd26d47705a4ec4c106a..9981c79f3940cff6e9b4b30e8f0e79281ef5362f 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs @@ -158,11 +158,9 @@ private static Metadata GetMetadataNoThrow(PortableExecutableReference reference var result = TryLoadOrCreateAsync( solution, checksum, - filePath, loadOnly, createAsync: () => CreateMetadataSymbolTreeInfoAsync(solution, checksum, reference, cancellationToken), - keySuffix: "_Metadata", - getPersistedChecksum: info => info.Checksum, + keySuffix: "_Metadata_" + filePath, readObject: reader => ReadSymbolTreeInfo(reader, (names, nodes) => GetSpellCheckerTask(solution, checksum, filePath, names, nodes)), cancellationToken: cancellationToken); Contract.ThrowIfFalse(result != null || loadOnly == true, "Result can only be null if 'loadOnly: true' was passed."); diff --git a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Serialization.cs b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Serialization.cs index cb1a23976f48c6a05335ebf2836284998a9c6649..f9787e62a75b1655861c5782088487a48b5de4f7 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Serialization.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Serialization.cs @@ -32,11 +32,9 @@ internal partial class SymbolTreeInfo : IObjectWritable var result = TryLoadOrCreateAsync( solution, checksum, - filePath, loadOnly: false, createAsync: createAsync, - keySuffix: "_SpellChecker", - getPersistedChecksum: s => s.Checksum, + keySuffix: "_SpellChecker_" + filePath, readObject: SpellChecker.ReadFrom, cancellationToken: CancellationToken.None); Contract.ThrowIfNull(result, "Result should never be null as we passed 'loadOnly: false'."); @@ -50,13 +48,11 @@ internal partial class SymbolTreeInfo : IObjectWritable private static async Task TryLoadOrCreateAsync( Solution solution, Checksum checksum, - string filePath, bool loadOnly, Func> createAsync, string keySuffix, - Func getPersistedChecksum, Func readObject, - CancellationToken cancellationToken) where T : class, IObjectWritable + CancellationToken cancellationToken) where T : class, IObjectWritable, IChecksummedObject { if (checksum == null) { @@ -70,7 +66,7 @@ internal partial class SymbolTreeInfo : IObjectWritable using (var storage = persistentStorageService.GetStorage(solution, checkBranchId: false)) { // Get the unique key to identify our data. - var key = PrefixMetadataSymbolTreeInfo + keySuffix + "_" + filePath; + var key = PrefixMetadataSymbolTreeInfo + keySuffix; using (var stream = await storage.ReadStreamAsync(key, cancellationToken).ConfigureAwait(false)) using (var reader = ObjectReader.TryGetReader(stream)) { @@ -80,7 +76,7 @@ internal partial class SymbolTreeInfo : IObjectWritable // If we're able to, and the version of the persisted data matches // our version, then we can reuse this instance. result = readObject(reader); - if (result != null && checksum == getPersistedChecksum(result)) + if (result != null && checksum == result.Checksum) { return result; } diff --git a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Source.cs b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Source.cs index d8ca927426eac12435c8ff49426d3a45b884da97..05fd264c3a56c93c26e1032cd25230e9b7fe5e63 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Source.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Source.cs @@ -32,11 +32,9 @@ private static void FreeSymbolMap(MultiDictionary symbolMap) var result = TryLoadOrCreateAsync( project.Solution, checksum, - project.FilePath, loadOnly: false, createAsync: () => CreateSourceSymbolTreeInfoAsync(project, checksum, cancellationToken), - keySuffix: "_Source", - getPersistedChecksum: info => info.Checksum, + keySuffix: "_Source_" + project.FilePath, readObject: reader => ReadSymbolTreeInfo(reader, (names, nodes) => GetSpellCheckerTask(project.Solution, checksum, project.FilePath, names, nodes)), cancellationToken: cancellationToken); Contract.ThrowIfNull(result, "Result should never be null as we passed 'loadOnly: false'."); diff --git a/src/Workspaces/Core/Portable/Utilities/SpellChecker.cs b/src/Workspaces/Core/Portable/Utilities/SpellChecker.cs index 31035b894eba20b88cee39ff551a2691e787ef18..a00ccf77c00a4ab2ab06f633264620a77606b2e6 100644 --- a/src/Workspaces/Core/Portable/Utilities/SpellChecker.cs +++ b/src/Workspaces/Core/Portable/Utilities/SpellChecker.cs @@ -10,7 +10,7 @@ namespace Roslyn.Utilities { - internal class SpellChecker : IObjectWritable + internal class SpellChecker : IObjectWritable, IChecksummedObject { private const string SerializationFormat = "3";