Skip to content

Commit fe817da

Browse files
committed
Make path to get project ID async
Avoids a call to `IProjectThreadingService.ExecuteSynchronously`, instead passing the task through to where it can be awaited, so the entire stack is async.
1 parent bdc2c93 commit fe817da

File tree

5 files changed

+17
-20
lines changed

5 files changed

+17
-20
lines changed

src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/Properties/ProjectFileOrAssemblyInfoPropertiesProvider.cs

+4-7
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,17 @@ public ProjectFileOrAssemblyInfoPropertiesProvider(
2727
VisualStudioWorkspace workspace,
2828
IProjectThreadingService threadingService)
2929
: base(delegatedProvider, instanceProvider, interceptingValueProviders, project,
30-
getActiveProjectId: () => GetProjectId(threadingService, workspaceWriter),
30+
getActiveProjectId: () => GetProjectIdAsync(workspaceWriter),
3131
workspace: workspace,
3232
threadingService: threadingService)
3333
{
3434
}
3535

36-
private static ProjectId GetProjectId(IProjectThreadingService threadingService, IWorkspaceWriter workspaceWriter)
36+
private static Task<ProjectId> GetProjectIdAsync(IWorkspaceWriter workspaceWriter)
3737
{
38-
return threadingService.ExecuteSynchronously(() =>
38+
return workspaceWriter.WriteAsync(workspace =>
3939
{
40-
return workspaceWriter.WriteAsync(workspace =>
41-
{
42-
return Task.FromResult(workspace.Context.Id);
43-
});
40+
return Task.FromResult(workspace.Context.Id);
4441
});
4542
}
4643
}

src/Microsoft.VisualStudio.ProjectSystem.Managed/ProjectSystem/Properties/AssemblyAttributeProperties/AbstractProjectFileOrAssemblyInfoPropertiesProvider.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Microsoft.VisualStudio.ProjectSystem.Properties;
1010
internal abstract class AbstractProjectFileOrAssemblyInfoPropertiesProvider : InterceptedPropertiesProviderBase
1111
{
1212
private readonly UnconfiguredProject _project;
13-
private readonly Func<ProjectId> _getActiveProjectId;
13+
private readonly Func<Task<ProjectId>> _getActiveProjectId;
1414
private readonly Workspace _workspace;
1515
private readonly IProjectThreadingService _threadingService;
1616

@@ -19,7 +19,7 @@ protected AbstractProjectFileOrAssemblyInfoPropertiesProvider(
1919
IProjectInstancePropertiesProvider instanceProvider,
2020
IEnumerable<Lazy<IInterceptingPropertyValueProvider, IInterceptingPropertyValueProviderMetadata2>> interceptingValueProviders,
2121
UnconfiguredProject project,
22-
Func<ProjectId> getActiveProjectId,
22+
Func<Task<ProjectId>> getActiveProjectId,
2323
Workspace workspace,
2424
IProjectThreadingService threadingService)
2525
: base(delegatedProvider, instanceProvider, project, interceptingValueProviders)

src/Microsoft.VisualStudio.ProjectSystem.Managed/ProjectSystem/Properties/AssemblyAttributeProperties/AssemblyInfoProperties.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ internal class AssemblyInfoProperties : DelegatedProjectPropertiesBase
2727

2828
public AssemblyInfoProperties(
2929
IProjectProperties delegatedProjectProperties,
30-
Func<ProjectId> getActiveProjectId,
30+
Func<Task<ProjectId>> getActiveProjectId,
3131
Workspace workspace,
3232
IProjectThreadingService threadingService)
3333
: base(delegatedProjectProperties)
@@ -36,7 +36,7 @@ public AssemblyInfoProperties(
3636
}
3737

3838
private static ImmutableDictionary<string, SourceAssemblyAttributePropertyValueProvider> CreateAttributeValueProviderMap(
39-
Func<ProjectId> getActiveProjectId,
39+
Func<Task<ProjectId>> getActiveProjectId,
4040
Workspace workspace,
4141
IProjectThreadingService threadingService)
4242
{

src/Microsoft.VisualStudio.ProjectSystem.Managed/ProjectSystem/Properties/AssemblyAttributeProperties/SourceAssemblyAttributePropertyValueProvider.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ namespace Microsoft.VisualStudio.ProjectSystem.Properties;
1111
internal class SourceAssemblyAttributePropertyValueProvider
1212
{
1313
private readonly string _assemblyAttributeFullName;
14-
private readonly Func<ProjectId> _getActiveProjectId;
14+
private readonly Func<Task<ProjectId>> _getActiveProjectId;
1515
private readonly Workspace _workspace;
1616
private readonly IProjectThreadingService _threadingService;
1717

1818
public SourceAssemblyAttributePropertyValueProvider(
1919
string assemblyAttributeFullName,
20-
Func<ProjectId> getActiveProjectId,
20+
Func<Task<ProjectId>> getActiveProjectId,
2121
Workspace workspace,
2222
IProjectThreadingService threadingService)
2323
{
@@ -27,9 +27,9 @@ public SourceAssemblyAttributePropertyValueProvider(
2727
_threadingService = threadingService;
2828
}
2929

30-
private Project? GetActiveProject()
30+
private async Task<Project?> GetActiveProjectAsync()
3131
{
32-
ProjectId activeProjectId = _getActiveProjectId();
32+
ProjectId activeProjectId = await _getActiveProjectId();
3333

3434
return _workspace.CurrentSolution.Projects.SingleOrDefault((p, id) => p.Id == id, activeProjectId);
3535
}
@@ -39,7 +39,7 @@ public SourceAssemblyAttributePropertyValueProvider(
3939
/// </summary>
4040
public async Task<string?> GetPropertyValueAsync()
4141
{
42-
Project? project = GetActiveProject();
42+
Project? project = await GetActiveProjectAsync();
4343
if (project is null)
4444
{
4545
return null;
@@ -56,7 +56,7 @@ public SourceAssemblyAttributePropertyValueProvider(
5656
/// <param name="value"></param>
5757
public async Task SetPropertyValueAsync(string value)
5858
{
59-
Project? project = GetActiveProject();
59+
Project? project = await GetActiveProjectAsync();
6060
if (project is null)
6161
{
6262
return;

tests/Microsoft.VisualStudio.ProjectSystem.Managed.UnitTests/ProjectSystem/Properties/AssemblyInfoPropertiesProviderTests.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public TestProjectFileOrAssemblyInfoPropertiesProvider(
1515
IProjectThreadingService? threadingService = null,
1616
IProjectProperties? defaultProperties = null,
1717
IProjectInstancePropertiesProvider? instanceProvider = null,
18-
Func<ProjectId>? getActiveProjectId = null)
18+
Func<Task<ProjectId>>? getActiveProjectId = null)
1919
: this(workspace ?? WorkspaceFactory.Create(""),
2020
project: project ?? UnconfiguredProjectFactory.Create(),
2121
interceptingProvider: interceptingProvider,
@@ -33,7 +33,7 @@ public TestProjectFileOrAssemblyInfoPropertiesProvider(
3333
IProjectThreadingService? threadingService = null,
3434
IProjectProperties? defaultProperties = null,
3535
IProjectInstancePropertiesProvider? instanceProvider = null,
36-
Func<ProjectId>? getActiveProjectId = null)
36+
Func<Task<ProjectId>>? getActiveProjectId = null)
3737
: base(delegatedProvider: IProjectPropertiesProviderFactory.Create(defaultProperties ?? IProjectPropertiesFactory.MockWithProperty("").Object),
3838
instanceProvider: instanceProvider ?? IProjectInstancePropertiesProviderFactory.Create(),
3939
interceptingValueProviders: interceptingProvider is null
@@ -42,7 +42,7 @@ public TestProjectFileOrAssemblyInfoPropertiesProvider(
4242
IInterceptingPropertyValueProviderMetadataFactory.Create("TestPropertyName")) }
4343
: new[] { interceptingProvider },
4444
project: project,
45-
getActiveProjectId: getActiveProjectId ?? (() => workspace.CurrentSolution.ProjectIds.SingleOrDefault()),
45+
getActiveProjectId: getActiveProjectId ?? (() => Task.FromResult(workspace.CurrentSolution.ProjectIds.SingleOrDefault())),
4646
workspace: workspace,
4747
threadingService: threadingService ?? IProjectThreadingServiceFactory.Create())
4848
{

0 commit comments

Comments
 (0)