提交 0305475c 编写于 作者: J Jason Malinowski

Hold DocumentIds in ProjectState in ImmutableLists

We previously were using ImmutableArrays, so if you had a large number
of documents (say thousands) we'd be creating huge numbers of huge
arrays over and over again. For this pattern, ImmutableList is more
appropriate.
上级 63b321a7
...@@ -22,8 +22,8 @@ internal partial class ProjectState ...@@ -22,8 +22,8 @@ internal partial class ProjectState
private readonly SolutionServices _solutionServices; private readonly SolutionServices _solutionServices;
private readonly ImmutableDictionary<DocumentId, DocumentState> _documentStates; private readonly ImmutableDictionary<DocumentId, DocumentState> _documentStates;
private readonly ImmutableDictionary<DocumentId, TextDocumentState> _additionalDocumentStates; private readonly ImmutableDictionary<DocumentId, TextDocumentState> _additionalDocumentStates;
private readonly IReadOnlyList<DocumentId> _documentIds; private readonly ImmutableList<DocumentId> _documentIds;
private readonly IReadOnlyList<DocumentId> _additionalDocumentIds; private readonly ImmutableList<DocumentId> _additionalDocumentIds;
private readonly AsyncLazy<VersionStamp> _lazyLatestDocumentVersion; private readonly AsyncLazy<VersionStamp> _lazyLatestDocumentVersion;
private readonly AsyncLazy<VersionStamp> _lazyLatestDocumentTopLevelChangeVersion; private readonly AsyncLazy<VersionStamp> _lazyLatestDocumentTopLevelChangeVersion;
...@@ -37,8 +37,8 @@ internal partial class ProjectState ...@@ -37,8 +37,8 @@ internal partial class ProjectState
ProjectInfo projectInfo, ProjectInfo projectInfo,
HostLanguageServices languageServices, HostLanguageServices languageServices,
SolutionServices solutionServices, SolutionServices solutionServices,
IEnumerable<DocumentId> documentIds, ImmutableList<DocumentId> documentIds,
IEnumerable<DocumentId> additionalDocumentIds, ImmutableList<DocumentId> additionalDocumentIds,
ImmutableDictionary<DocumentId, DocumentState> documentStates, ImmutableDictionary<DocumentId, DocumentState> documentStates,
ImmutableDictionary<DocumentId, TextDocumentState> additionalDocumentStates, ImmutableDictionary<DocumentId, TextDocumentState> additionalDocumentStates,
AsyncLazy<VersionStamp> lazyLatestDocumentVersion, AsyncLazy<VersionStamp> lazyLatestDocumentVersion,
...@@ -46,8 +46,8 @@ internal partial class ProjectState ...@@ -46,8 +46,8 @@ internal partial class ProjectState
{ {
_solutionServices = solutionServices; _solutionServices = solutionServices;
_languageServices = languageServices; _languageServices = languageServices;
_documentIds = documentIds.ToImmutableReadOnlyListOrEmpty(); _documentIds = documentIds;
_additionalDocumentIds = additionalDocumentIds.ToImmutableReadOnlyListOrEmpty(); _additionalDocumentIds = additionalDocumentIds;
_documentStates = documentStates; _documentStates = documentStates;
_additionalDocumentStates = additionalDocumentStates; _additionalDocumentStates = additionalDocumentStates;
_lazyLatestDocumentVersion = lazyLatestDocumentVersion; _lazyLatestDocumentVersion = lazyLatestDocumentVersion;
...@@ -72,8 +72,8 @@ public ProjectState(ProjectInfo projectInfo, HostLanguageServices languageServic ...@@ -72,8 +72,8 @@ public ProjectState(ProjectInfo projectInfo, HostLanguageServices languageServic
var projectInfoFixed = FixProjectInfo(projectInfo); var projectInfoFixed = FixProjectInfo(projectInfo);
_documentIds = projectInfoFixed.Documents.Select(d => d.Id).ToImmutableArray(); _documentIds = projectInfoFixed.Documents.Select(d => d.Id).ToImmutableList();
_additionalDocumentIds = projectInfoFixed.AdditionalDocuments.Select(d => d.Id).ToImmutableArray(); _additionalDocumentIds = projectInfoFixed.AdditionalDocuments.Select(d => d.Id).ToImmutableList();
var parseOptions = projectInfoFixed.ParseOptions; var parseOptions = projectInfoFixed.ParseOptions;
var docStates = ImmutableDictionary.CreateRange<DocumentId, DocumentState>( var docStates = ImmutableDictionary.CreateRange<DocumentId, DocumentState>(
...@@ -341,8 +341,8 @@ public TextDocumentState GetAdditionalDocumentState(DocumentId documentId) ...@@ -341,8 +341,8 @@ public TextDocumentState GetAdditionalDocumentState(DocumentId documentId)
private ProjectState With( private ProjectState With(
ProjectInfo projectInfo = null, ProjectInfo projectInfo = null,
ImmutableArray<DocumentId> documentIds = default, ImmutableList<DocumentId> documentIds = default,
ImmutableArray<DocumentId> additionalDocumentIds = default, ImmutableList<DocumentId> additionalDocumentIds = default,
ImmutableDictionary<DocumentId, DocumentState> documentStates = null, ImmutableDictionary<DocumentId, DocumentState> documentStates = null,
ImmutableDictionary<DocumentId, TextDocumentState> additionalDocumentStates = null, ImmutableDictionary<DocumentId, TextDocumentState> additionalDocumentStates = null,
AsyncLazy<VersionStamp> latestDocumentVersion = null, AsyncLazy<VersionStamp> latestDocumentVersion = null,
...@@ -352,8 +352,8 @@ public TextDocumentState GetAdditionalDocumentState(DocumentId documentId) ...@@ -352,8 +352,8 @@ public TextDocumentState GetAdditionalDocumentState(DocumentId documentId)
projectInfo ?? _projectInfo, projectInfo ?? _projectInfo,
_languageServices, _languageServices,
_solutionServices, _solutionServices,
documentIds.IsDefault ? _documentIds : documentIds, documentIds ?? _documentIds,
additionalDocumentIds.IsDefault ? _additionalDocumentIds : additionalDocumentIds, additionalDocumentIds ?? _additionalDocumentIds,
documentStates ?? _documentStates, documentStates ?? _documentStates,
additionalDocumentStates ?? _additionalDocumentStates, additionalDocumentStates ?? _additionalDocumentStates,
latestDocumentVersion ?? _lazyLatestDocumentVersion, latestDocumentVersion ?? _lazyLatestDocumentVersion,
...@@ -558,7 +558,7 @@ public ProjectState AddDocument(DocumentState document) ...@@ -558,7 +558,7 @@ public ProjectState AddDocument(DocumentState document)
return this.With( return this.With(
projectInfo: this.ProjectInfo.WithVersion(this.Version.GetNewerVersion()), projectInfo: this.ProjectInfo.WithVersion(this.Version.GetNewerVersion()),
documentIds: this.DocumentIds.ToImmutableArray().Add(document.Id), documentIds: _documentIds.Add(document.Id),
documentStates: this.DocumentStates.Add(document.Id, document)); documentStates: this.DocumentStates.Add(document.Id, document));
} }
...@@ -568,7 +568,7 @@ public ProjectState AddAdditionalDocument(TextDocumentState document) ...@@ -568,7 +568,7 @@ public ProjectState AddAdditionalDocument(TextDocumentState document)
return this.With( return this.With(
projectInfo: this.ProjectInfo.WithVersion(this.Version.GetNewerVersion()), projectInfo: this.ProjectInfo.WithVersion(this.Version.GetNewerVersion()),
additionalDocumentIds: this.AdditionalDocumentIds.ToImmutableArray().Add(document.Id), additionalDocumentIds: _additionalDocumentIds.Add(document.Id),
additionalDocumentStates: this.AdditionalDocumentStates.Add(document.Id, document)); additionalDocumentStates: this.AdditionalDocumentStates.Add(document.Id, document));
} }
...@@ -578,7 +578,7 @@ public ProjectState RemoveDocument(DocumentId documentId) ...@@ -578,7 +578,7 @@ public ProjectState RemoveDocument(DocumentId documentId)
return this.With( return this.With(
projectInfo: this.ProjectInfo.WithVersion(this.Version.GetNewerVersion()), projectInfo: this.ProjectInfo.WithVersion(this.Version.GetNewerVersion()),
documentIds: this.DocumentIds.ToImmutableArray().Remove(documentId), documentIds: _documentIds.Remove(documentId),
documentStates: this.DocumentStates.Remove(documentId)); documentStates: this.DocumentStates.Remove(documentId));
} }
...@@ -588,7 +588,7 @@ public ProjectState RemoveAdditionalDocument(DocumentId documentId) ...@@ -588,7 +588,7 @@ public ProjectState RemoveAdditionalDocument(DocumentId documentId)
return this.With( return this.With(
projectInfo: this.ProjectInfo.WithVersion(this.Version.GetNewerVersion()), projectInfo: this.ProjectInfo.WithVersion(this.Version.GetNewerVersion()),
additionalDocumentIds: this.AdditionalDocumentIds.ToImmutableArray().Remove(documentId), additionalDocumentIds: _additionalDocumentIds.Remove(documentId),
additionalDocumentStates: this.AdditionalDocumentStates.Remove(documentId)); additionalDocumentStates: this.AdditionalDocumentStates.Remove(documentId));
} }
...@@ -596,7 +596,7 @@ public ProjectState RemoveAllDocuments() ...@@ -596,7 +596,7 @@ public ProjectState RemoveAllDocuments()
{ {
return this.With( return this.With(
projectInfo: this.ProjectInfo.WithVersion(this.Version.GetNewerVersion()).WithDocuments(SpecializedCollections.EmptyEnumerable<DocumentInfo>()), projectInfo: this.ProjectInfo.WithVersion(this.Version.GetNewerVersion()).WithDocuments(SpecializedCollections.EmptyEnumerable<DocumentInfo>()),
documentIds: ImmutableArray.Create<DocumentId>(), documentIds: ImmutableList<DocumentId>.Empty,
documentStates: ImmutableDictionary<DocumentId, DocumentState>.Empty); documentStates: ImmutableDictionary<DocumentId, DocumentState>.Empty);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册