Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Eliminate contentChanged parameter #74561

Merged
merged 1 commit into from
Jul 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading