Skip to content

Commit

Permalink
Eliminate contentChanged parameter (#74561)
Browse files Browse the repository at this point in the history
  • Loading branch information
tmat authored Jul 26, 2024
1 parent 880b946 commit 70998bc
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 42 deletions.
19 changes: 10 additions & 9 deletions src/Workspaces/Core/Portable/Workspace/Solution/ProjectState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -843,10 +843,10 @@ public ProjectState RemoveAllNormalDocuments()
analyzerConfigOptionsCache: new AnalyzerConfigOptionsCache(AnalyzerConfigDocumentStates, _analyzerConfigOptionsCache.FallbackOptions));
}

public ProjectState UpdateDocument(DocumentState newDocument, bool contentChanged)
=> UpdateDocuments([DocumentStates.GetRequiredState(newDocument.Id)], [newDocument], contentChanged);
public ProjectState UpdateDocument(DocumentState newDocument)
=> UpdateDocuments([DocumentStates.GetRequiredState(newDocument.Id)], [newDocument]);

public ProjectState UpdateDocuments(ImmutableArray<DocumentState> oldDocuments, ImmutableArray<DocumentState> newDocuments, bool contentChanged)
public ProjectState UpdateDocuments(ImmutableArray<DocumentState> oldDocuments, ImmutableArray<DocumentState> newDocuments)
{
Contract.ThrowIfTrue(oldDocuments.IsEmpty);
Contract.ThrowIfFalse(oldDocuments.Length == newDocuments.Length);
Expand All @@ -860,7 +860,6 @@ public ProjectState UpdateDocuments(ImmutableArray<DocumentState> oldDocuments,
AdditionalDocumentStates,
oldDocuments.CastArray<TextDocumentState>(),
newDocuments.CastArray<TextDocumentState>(),
contentChanged,
out var dependentDocumentVersion,
out var dependentSemanticVersion);

Expand All @@ -870,10 +869,10 @@ public ProjectState UpdateDocuments(ImmutableArray<DocumentState> oldDocuments,
latestDocumentTopLevelChangeVersion: dependentSemanticVersion);
}

public ProjectState UpdateAdditionalDocument(AdditionalDocumentState newDocument, bool contentChanged)
=> UpdateAdditionalDocuments([AdditionalDocumentStates.GetRequiredState(newDocument.Id)], [newDocument], contentChanged);
public ProjectState UpdateAdditionalDocument(AdditionalDocumentState newDocument)
=> UpdateAdditionalDocuments([AdditionalDocumentStates.GetRequiredState(newDocument.Id)], [newDocument]);

public ProjectState UpdateAdditionalDocuments(ImmutableArray<AdditionalDocumentState> oldDocuments, ImmutableArray<AdditionalDocumentState> newDocuments, bool contentChanged)
public ProjectState UpdateAdditionalDocuments(ImmutableArray<AdditionalDocumentState> oldDocuments, ImmutableArray<AdditionalDocumentState> newDocuments)
{
Contract.ThrowIfTrue(oldDocuments.IsEmpty);
Contract.ThrowIfFalse(oldDocuments.Length == newDocuments.Length);
Expand All @@ -886,7 +885,6 @@ public ProjectState UpdateAdditionalDocuments(ImmutableArray<AdditionalDocumentS
newDocumentStates,
oldDocuments.CastArray<TextDocumentState>(),
newDocuments.CastArray<TextDocumentState>(),
contentChanged,
out var dependentDocumentVersion,
out var dependentSemanticVersion);

Expand Down Expand Up @@ -923,13 +921,16 @@ private void GetLatestDependentVersions(
TextDocumentStates<AdditionalDocumentState> newAdditionalDocumentStates,
ImmutableArray<TextDocumentState> oldDocuments,
ImmutableArray<TextDocumentState> newDocuments,
bool contentChanged,
out AsyncLazy<VersionStamp> dependentDocumentVersion,
out AsyncLazy<VersionStamp> dependentSemanticVersion)
{
var recalculateDocumentVersion = false;
var recalculateSemanticVersion = false;

var contentChanged = !oldDocuments.SequenceEqual(
newDocuments,
static (oldDocument, newDocument) => oldDocument.TextAndVersionSource == newDocument.TextAndVersionSource);

if (contentChanged)
{
foreach (var oldDocument in oldDocuments)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -701,8 +701,7 @@ internal SolutionCompilationState WithDocumentTexts(ImmutableArray<(DocumentId d
texts,
arg: mode,
updateDocument: static (oldDocumentState, text, mode) =>
SourceTextIsUnchanged(oldDocumentState, text) ? oldDocumentState : oldDocumentState.UpdateText(text, mode),
contentChanged: true);
SourceTextIsUnchanged(oldDocumentState, text) ? oldDocumentState : oldDocumentState.UpdateText(text, mode));

private static bool SourceTextIsUnchanged(DocumentState oldDocument, SourceText text)
=> oldDocument.TryGetText(out var oldText) && text == oldText;
Expand All @@ -711,15 +710,10 @@ private static bool SourceTextIsUnchanged(DocumentState oldDocument, SourceText
/// Applies an update operation <paramref name="updateDocument"/> to specified <paramref name="documentsToUpdate"/>.
/// Documents may be in different projects.
/// </summary>
/// <param name="contentChanged">
/// True if <paramref name="updateDocument"/> changes the content of the document
/// (i.e. document text, not just document attributes).
/// </param>
private SolutionCompilationState UpdateDocumentsInMultipleProjects<TDocumentState, TDocumentData, TArg>(
ImmutableArray<(DocumentId documentId, TDocumentData documentData)> documentsToUpdate,
TArg arg,
Func<TDocumentState, TDocumentData, TArg, TDocumentState> updateDocument,
bool contentChanged)
Func<TDocumentState, TDocumentData, TArg, TDocumentState> updateDocument)
where TDocumentState : TextDocumentState
{
return WithDocumentStatesOfMultipleProjects(
Expand All @@ -745,7 +739,7 @@ private SolutionCompilationState UpdateDocumentsInMultipleProjects<TDocumentStat

return (projectId, newDocumentStates.ToImmutableAndClear());
}),
(oldProjectState, newDocumentStates) => GetUpdateDocumentsTranslationAction(oldProjectState, newDocumentStates, contentChanged));
GetUpdateDocumentsTranslationAction);
}

/// <summary>
Expand Down Expand Up @@ -787,28 +781,28 @@ private SolutionCompilationState WithDocumentStatesOfMultipleProjects<TDocumentS
/// Updates the <paramref name="oldProjectState"/> to a new state with <paramref name="newDocumentStates"/> and returns a <see cref="TranslationAction"/> that
/// reflects these changes in the project compilation.
/// </summary>
private static TranslationAction GetUpdateDocumentsTranslationAction<TDocumentState>(ProjectState oldProjectState, ImmutableArray<TDocumentState> newDocumentStates, bool contentChanged)
private static TranslationAction GetUpdateDocumentsTranslationAction<TDocumentState>(ProjectState oldProjectState, ImmutableArray<TDocumentState> newDocumentStates)
where TDocumentState : TextDocumentState
{
return newDocumentStates switch
{
ImmutableArray<DocumentState> ordinaryNewDocumentStates => GetUpdateOrdinaryDocumentsTranslationAction(oldProjectState, ordinaryNewDocumentStates, contentChanged),
ImmutableArray<AdditionalDocumentState> additionalNewDocumentStates => GetUpdateAdditionalDocumentsTranslationAction(oldProjectState, additionalNewDocumentStates, contentChanged),
ImmutableArray<DocumentState> ordinaryNewDocumentStates => GetUpdateOrdinaryDocumentsTranslationAction(oldProjectState, ordinaryNewDocumentStates),
ImmutableArray<AdditionalDocumentState> additionalNewDocumentStates => GetUpdateAdditionalDocumentsTranslationAction(oldProjectState, additionalNewDocumentStates),
ImmutableArray<AnalyzerConfigDocumentState> analyzerConfigNewDocumentStates => GetUpdateAnalyzerConfigDocumentsTranslationAction(oldProjectState, analyzerConfigNewDocumentStates),
_ => throw ExceptionUtilities.UnexpectedValue(typeof(TDocumentState))
};

TranslationAction GetUpdateOrdinaryDocumentsTranslationAction(ProjectState oldProjectState, ImmutableArray<DocumentState> newDocumentStates, bool contentChanged)
TranslationAction GetUpdateOrdinaryDocumentsTranslationAction(ProjectState oldProjectState, ImmutableArray<DocumentState> newDocumentStates)
{
var oldDocumentStates = newDocumentStates.SelectAsArray(static (s, oldProjectState) => oldProjectState.DocumentStates.GetRequiredState(s.Id), oldProjectState);
var newProjectState = oldProjectState.UpdateDocuments(oldDocumentStates, newDocumentStates, contentChanged);
var newProjectState = oldProjectState.UpdateDocuments(oldDocumentStates, newDocumentStates);
return new TranslationAction.TouchDocumentsAction(oldProjectState, newProjectState, oldDocumentStates, newDocumentStates);
}

TranslationAction GetUpdateAdditionalDocumentsTranslationAction(ProjectState oldProjectState, ImmutableArray<AdditionalDocumentState> newDocumentStates, bool contentChanged)
TranslationAction GetUpdateAdditionalDocumentsTranslationAction(ProjectState oldProjectState, ImmutableArray<AdditionalDocumentState> newDocumentStates)
{
var oldDocumentStates = newDocumentStates.SelectAsArray(static (s, oldProjectState) => oldProjectState.AdditionalDocumentStates.GetRequiredState(s.Id), oldProjectState);
var newProjectState = oldProjectState.UpdateAdditionalDocuments(oldDocumentStates, newDocumentStates, contentChanged);
var newProjectState = oldProjectState.UpdateAdditionalDocuments(oldDocumentStates, newDocumentStates);
return new TranslationAction.TouchAdditionalDocumentsAction(oldProjectState, newProjectState, oldDocumentStates, newDocumentStates);
}

Expand Down Expand Up @@ -879,8 +873,7 @@ public SolutionCompilationState WithDocumentSyntaxRoots(ImmutableArray<(Document
static (oldDocumentState, root, mode) =>
oldDocumentState.TryGetSyntaxTree(out var oldTree) && oldTree.TryGetRoot(out var oldRoot) && oldRoot == root
? oldDocumentState
: oldDocumentState.UpdateTree(root, mode),
contentChanged: true);
: oldDocumentState.UpdateTree(root, mode));
}

public SolutionCompilationState WithDocumentContentsFrom(
Expand All @@ -892,8 +885,7 @@ public SolutionCompilationState WithDocumentContentsFrom(
static (oldDocumentState, documentState, forceEvenIfTreesWouldDiffer) =>
oldDocumentState.TextAndVersionSource == documentState.TextAndVersionSource && oldDocumentState.TreeSource == documentState.TreeSource
? oldDocumentState
: oldDocumentState.UpdateTextAndTreeContents(documentState.TextAndVersionSource, documentState.TreeSource, forceEvenIfTreesWouldDiffer),
contentChanged: true);
: oldDocumentState.UpdateTextAndTreeContents(documentState.TextAndVersionSource, documentState.TreeSource, forceEvenIfTreesWouldDiffer));
}

/// <inheritdoc cref="SolutionState.WithDocumentSourceCodeKind"/>
Expand Down
26 changes: 13 additions & 13 deletions src/Workspaces/Core/Portable/Workspace/Solution/SolutionState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -960,7 +960,7 @@ public StateChange WithDocumentAttributes<TArg>(
return new(this, oldProject, oldProject);
}

return UpdateDocumentState(newDocument, contentChanged: false);
return UpdateDocumentState(newDocument);
}

/// <summary>
Expand All @@ -976,7 +976,7 @@ public StateChange WithDocumentText(DocumentId documentId, SourceText text, Pres
return new(this, oldProject, oldProject);
}

return UpdateDocumentState(oldDocument.UpdateText(text, mode), contentChanged: true);
return UpdateDocumentState(oldDocument.UpdateText(text, mode));
}

public StateChange WithDocumentState(DocumentState newDocument)
Expand All @@ -988,7 +988,7 @@ public StateChange WithDocumentState(DocumentState newDocument)
return new(this, oldProject, oldProject);
}

return UpdateDocumentState(newDocument, contentChanged: true);
return UpdateDocumentState(newDocument);
}

/// <summary>
Expand All @@ -1004,7 +1004,7 @@ public StateChange WithAdditionalDocumentText(DocumentId documentId, SourceText
return new(this, oldProject, oldProject);
}

return UpdateAdditionalDocumentState(oldDocument.UpdateText(text, mode), contentChanged: true);
return UpdateAdditionalDocumentState(oldDocument.UpdateText(text, mode));
}

/// <summary>
Expand Down Expand Up @@ -1036,7 +1036,7 @@ public StateChange WithDocumentText(DocumentId documentId, TextAndVersion textAn
return new(this, oldProject, oldProject);
}

return UpdateDocumentState(oldDocument.UpdateText(textAndVersion, mode), contentChanged: true);
return UpdateDocumentState(oldDocument.UpdateText(textAndVersion, mode));
}

/// <summary>
Expand All @@ -1052,7 +1052,7 @@ public StateChange WithAdditionalDocumentText(DocumentId documentId, TextAndVers
return new(this, oldProject, oldProject);
}

return UpdateAdditionalDocumentState(oldDocument.UpdateText(textAndVersion, mode), contentChanged: true);
return UpdateAdditionalDocumentState(oldDocument.UpdateText(textAndVersion, mode));
}

/// <summary>
Expand Down Expand Up @@ -1084,7 +1084,7 @@ public StateChange WithDocumentSourceCodeKind(DocumentId documentId, SourceCodeK
return new(this, oldProject, oldProject);
}

return UpdateDocumentState(oldDocument.UpdateSourceCodeKind(sourceCodeKind), contentChanged: true);
return UpdateDocumentState(oldDocument.UpdateSourceCodeKind(sourceCodeKind));
}

public StateChange UpdateDocumentTextLoader(DocumentId documentId, TextLoader loader, PreservationMode mode)
Expand All @@ -1093,7 +1093,7 @@ public StateChange UpdateDocumentTextLoader(DocumentId documentId, TextLoader lo

// Assumes that content has changed. User could have closed a doc without saving and we are loading text
// from closed file with old content.
return UpdateDocumentState(oldDocument.UpdateText(loader, mode), contentChanged: true);
return UpdateDocumentState(oldDocument.UpdateText(loader, mode));
}

/// <summary>
Expand All @@ -1106,7 +1106,7 @@ public StateChange UpdateAdditionalDocumentTextLoader(DocumentId documentId, Tex

// Assumes that content has changed. User could have closed a doc without saving and we are loading text
// from closed file with old content.
return UpdateAdditionalDocumentState(oldDocument.UpdateText(loader, mode), contentChanged: true);
return UpdateAdditionalDocumentState(oldDocument.UpdateText(loader, mode));
}

/// <summary>
Expand All @@ -1122,10 +1122,10 @@ public StateChange UpdateAnalyzerConfigDocumentTextLoader(DocumentId documentId,
return UpdateAnalyzerConfigDocumentState(oldDocument.UpdateText(loader, mode));
}

private StateChange UpdateDocumentState(DocumentState newDocument, bool contentChanged)
private StateChange UpdateDocumentState(DocumentState newDocument)
{
var oldProject = GetProjectState(newDocument.Id.ProjectId)!;
var newProject = oldProject.UpdateDocument(newDocument, contentChanged);
var newProject = oldProject.UpdateDocument(newDocument);

// This method shouldn't have been called if the document has not changed.
Debug.Assert(oldProject != newProject);
Expand All @@ -1135,10 +1135,10 @@ private StateChange UpdateDocumentState(DocumentState newDocument, bool contentC
newProject);
}

private StateChange UpdateAdditionalDocumentState(AdditionalDocumentState newDocument, bool contentChanged)
private StateChange UpdateAdditionalDocumentState(AdditionalDocumentState newDocument)
{
var oldProject = GetRequiredProjectState(newDocument.Id.ProjectId);
var newProject = oldProject.UpdateAdditionalDocument(newDocument, contentChanged);
var newProject = oldProject.UpdateAdditionalDocument(newDocument);

// This method shouldn't have been called if the document has not changed.
Debug.Assert(oldProject != newProject);
Expand Down

0 comments on commit 70998bc

Please sign in to comment.