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

Rationalize how ProjectSnapshotManager is updated #10101

Merged
merged 27 commits into from
Mar 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
606c24a
Add IProjectSnapshotManager.Update(...) and UpdateAsync(...) methods
DustinCampbell Mar 14, 2024
0d9dc9c
Remove unused ProjectSnapshotManagerBase mock
DustinCampbell Mar 14, 2024
24ef65d
Move ProjectSnapshotManagerBase.GetOpenDocuments() to IProjectSnapsho…
DustinCampbell Mar 14, 2024
ef27c28
RazorProjectInfoPublisher: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
f8a3451
Remove unneeded [Shared] attribute
DustinCampbell Mar 14, 2024
6658456
GeneratedDocumentPublisher: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
987ae03
OpenDocumentGenerator: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
0a371d5
MonitorProjectConfigurationFilePathEndpoint: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
39bef6e
RazorProjectService: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
705c0b1
SnapshotResolver: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
09d8595
Remove ProjectSnapshotManagerBase from LSP services
DustinCampbell Mar 14, 2024
3d737bd
EditorManagerListener: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
b078e98
Add TestProjectSnapshotManager Update(...) and UpdateAsync(...) methods
DustinCampbell Mar 14, 2024
92e49de
Add TestAccessor for EditorDocumentManagerListener
DustinCampbell Mar 14, 2024
a5c92ff
FallbackProjectManager: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
d00078f
ProjectSnapshotSynchronizationService: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
eb0bfbe
VisualStudioSolutionCloseChangeTrigger: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
580166c
ProjectWorkspaceStateGenerator: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
5a988b5
Remove a couple of unnecessary dispatcher uses
DustinCampbell Mar 14, 2024
36d5e3c
Add non-mutating methods to ProjectSnapshotManager.Updater
DustinCampbell Mar 14, 2024
35616cc
WindowsRazorProjectHostBase: Use IProjectSnapshotManager
DustinCampbell Mar 14, 2024
521b11f
Remove ProjectSnapshotManagerBase
DustinCampbell Mar 14, 2024
f70963e
Clean up ProjectSnapshotManager a bit
DustinCampbell Mar 14, 2024
3fd5977
Use PooledArrayBuilder in ProjectSnapshotManager
DustinCampbell Mar 14, 2024
be97476
Use record deconstruction in ProjectSnapshotManager
DustinCampbell Mar 14, 2024
583b8dc
Prefer static lambdas when updating project snapshot manager
DustinCampbell Mar 15, 2024
fb8eb56
Merge branch 'main' into project-manager-updates
DustinCampbell Mar 15, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,14 @@ internal async Task<IDocumentSnapshot> GetDocumentSnapshotAsync(string projectFi

var projectManager = CreateProjectSnapshotManager();

await Dispatcher.RunAsync(
() =>
await projectManager.UpdateAsync(
updater =>
{
projectManager.ProjectAdded(hostProject);
updater.ProjectAdded(hostProject);
var tagHelpers = CommonResources.LegacyTagHelpers;
var projectWorkspaceState = ProjectWorkspaceState.Create(tagHelpers, CodeAnalysis.CSharp.LanguageVersion.CSharp11);
projectManager.ProjectWorkspaceStateChanged(hostProject.Key, projectWorkspaceState);
projectManager.DocumentAdded(hostProject.Key, hostDocument, textLoader);
updater.ProjectWorkspaceStateChanged(hostProject.Key, projectWorkspaceState);
updater.DocumentAdded(hostProject.Key, hostDocument, textLoader);
},
CancellationToken.None);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ public async Task SetupAsync()
{
ProjectManager = CreateProjectSnapshotManager();

await Dispatcher.RunAsync(
() => ProjectManager.ProjectAdded(HostProject),
await ProjectManager.UpdateAsync(
updater => updater.ProjectAdded(HostProject),
CancellationToken.None);

ProjectManager.Changed += SnapshotManager_Changed;
Expand All @@ -40,12 +40,12 @@ public void Cleanup()
[Benchmark(Description = "Generates the code for 100 files", OperationsPerInvoke = 100)]
public async Task BackgroundCodeGeneration_Generate100FilesAsync()
{
await Dispatcher.RunAsync(
() =>
await ProjectManager.UpdateAsync(
updater =>
{
for (var i = 0; i < Documents.Length; i++)
{
ProjectManager.DocumentAdded(HostProject.Key, Documents[i], TextLoaders[i % 4]);
updater.DocumentAdded(HostProject.Key, Documents[i], TextLoaders[i % 4]);
}
},
CancellationToken.None);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ public void Setup()
[Benchmark(Description = "Initializes a project and 100 files", OperationsPerInvoke = 100)]
public async Task ProjectLoad_AddProjectAnd100Files()
{
await Dispatcher.RunAsync(
() =>
await ProjectManager.UpdateAsync(
updater =>
{
ProjectManager.ProjectAdded(HostProject);
updater.ProjectAdded(HostProject);

for (var i = 0; i < Documents.Length; i++)
{
ProjectManager.DocumentAdded(HostProject.Key, Documents[i], TextLoaders[i % 4]);
updater.DocumentAdded(HostProject.Key, Documents[i], TextLoaders[i % 4]);
}
},
CancellationToken.None);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,9 @@ public void Setup()
[Benchmark(Description = "Does thread contention add/remove of documents", OperationsPerInvoke = 100)]
public async Task ProjectMutation_Mutates100kFilesAsync()
{
await Dispatcher.RunAsync(() =>
{
ProjectManager.ProjectAdded(HostProject);
}, CancellationToken.None);
await ProjectManager.UpdateAsync(
updater => updater.ProjectAdded(HostProject),
CancellationToken.None);

var cancellationSource = new CancellationTokenSource();
var done = false;
Expand All @@ -45,9 +44,9 @@ await Dispatcher.RunAsync(() =>
for (var i = 0; i < Documents.Length; i++)
{
var document = Documents[i];
await Dispatcher.RunAsync(() => ProjectManager.DocumentAdded(HostProject.Key, document, TextLoaders[i % 4]), CancellationToken.None).ConfigureAwait(false);
await ProjectManager.UpdateAsync(updater => updater.DocumentAdded(HostProject.Key, document, TextLoaders[i % 4]), CancellationToken.None).ConfigureAwait(false);
Thread.Sleep(0);
await Dispatcher.RunAsync(() => ProjectManager.DocumentRemoved(HostProject.Key, document), CancellationToken.None).ConfigureAwait(false);
await ProjectManager.UpdateAsync(updater => updater.DocumentRemoved(HostProject.Key, document), CancellationToken.None).ConfigureAwait(false);
Thread.Sleep(0);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,8 +242,7 @@ public static void AddDocumentManagementServices(this IServiceCollection service

// Add project snapshot manager
services.AddSingleton<IProjectEngineFactoryProvider, LspProjectEngineFactoryProvider>();
services.AddSingleton<ProjectSnapshotManagerBase, ProjectSnapshotManager>();
services.AddSingleton<IProjectSnapshotManager>(services => services.GetRequiredService<ProjectSnapshotManagerBase>());
services.AddSingleton<IProjectSnapshotManager, ProjectSnapshotManager>();
DustinCampbell marked this conversation as resolved.
Show resolved Hide resolved
}

public static void AddHandlerWithCapabilities<T>(this IServiceCollection services)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,19 @@ internal sealed class GeneratedDocumentPublisher : IGeneratedDocumentPublisher,
{
private readonly Dictionary<DocumentKey, PublishData> _publishedCSharpData;
private readonly Dictionary<string, PublishData> _publishedHtmlData;
private readonly ProjectSnapshotManagerBase _projectManager;
private readonly IProjectSnapshotManager _projectManager;
private readonly ProjectSnapshotManagerDispatcher _dispatcher;
private readonly IClientConnection _clientConnection;
private readonly LanguageServerFeatureOptions _options;
private readonly ILogger _logger;

public GeneratedDocumentPublisher(
ProjectSnapshotManagerBase projectManager,
IProjectSnapshotManager projectManager,
ProjectSnapshotManagerDispatcher dispatcher,
IClientConnection clientConnection,
LanguageServerFeatureOptions options,
IRazorLoggerFactory loggerFactory)
{

_projectManager = projectManager;
_dispatcher = dispatcher;
_clientConnection = clientConnection;
Expand Down Expand Up @@ -183,8 +182,6 @@ private void ProjectManager_Changed(object? sender, ProjectChangeEventArgs args)

_dispatcher.AssertRunningOnDispatcher();

Assumes.NotNull(_projectManager);

switch (args.Kind)
{
case ProjectChangeKind.DocumentChanged:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ internal class OpenDocumentGenerator : IRazorStartupService, IDisposable
// a document for each keystroke.
private static readonly TimeSpan s_batchingTimeSpan = TimeSpan.FromMilliseconds(10);

private readonly ProjectSnapshotManagerBase _projectManager;
private readonly IProjectSnapshotManager _projectManager;
private readonly ProjectSnapshotManagerDispatcher _dispatcher;
private readonly LanguageServerFeatureOptions _options;
private readonly IReadOnlyList<DocumentProcessedListener> _listeners;
private readonly BatchingWorkQueue _workQueue;

public OpenDocumentGenerator(
IEnumerable<DocumentProcessedListener> listeners,
ProjectSnapshotManagerBase projectManager,
IProjectSnapshotManager projectManager,
ProjectSnapshotManagerDispatcher dispatcher,
LanguageServerFeatureOptions options,
IErrorReporter errorReporter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.ProjectSystem;
[RazorLanguageServerEndpoint(LanguageServerConstants.RazorMonitorProjectConfigurationFilePathEndpoint)]
internal class MonitorProjectConfigurationFilePathEndpoint : IRazorNotificationHandler<MonitorProjectConfigurationFilePathParams>, IDisposable
{
private readonly ProjectSnapshotManagerBase _projectManager;
private readonly IProjectSnapshotManager _projectManager;
private readonly ProjectSnapshotManagerDispatcher _dispatcher;
private readonly WorkspaceDirectoryPathResolver _workspaceDirectoryPathResolver;
private readonly IEnumerable<IProjectConfigurationFileChangeListener> _listeners;
Expand All @@ -34,7 +34,7 @@ internal class MonitorProjectConfigurationFilePathEndpoint : IRazorNotificationH
public bool MutatesSolutionState => false;

public MonitorProjectConfigurationFilePathEndpoint(
ProjectSnapshotManagerBase projectManager,
IProjectSnapshotManager projectManager,
ProjectSnapshotManagerDispatcher dispatcher,
WorkspaceDirectoryPathResolver workspaceDirectoryPathResolver,
IEnumerable<IProjectConfigurationFileChangeListener> listeners,
Expand Down Expand Up @@ -163,7 +163,7 @@ public async Task HandleNotificationAsync(MonitorProjectConfigurationFilePathPar
}
}

private async Task RemoveMonitorAsync(string projectKeyId, bool removeProject, CancellationToken cancellationToken)
private Task RemoveMonitorAsync(string projectKeyId, bool removeProject, CancellationToken cancellationToken)
{
// Should no longer monitor configuration output paths for the project
if (_outputPathMonitors.TryRemove(projectKeyId, out var removedEntry))
Expand All @@ -178,11 +178,16 @@ private async Task RemoveMonitorAsync(string projectKeyId, bool removeProject, C

if (removeProject)
{
await _dispatcher.RunAsync(() =>
{
_projectManager.ProjectRemoved(ProjectKey.FromString(projectKeyId));
}, cancellationToken).ConfigureAwait(false);
return _projectManager.UpdateAsync(
(updater, projectKey) =>
{
updater.ProjectRemoved(projectKey);
},
state: ProjectKey.FromString(projectKeyId),
cancellationToken);
}

return Task.CompletedTask;
}

public void Dispose()
Expand Down
Loading