Skip to content

Commit abf1298

Browse files
committed
Use strongly-typed error reporter
Historically, the `IWorkspace` type was in the host-agnostic layer, meaning that the error-reporing type was specific to the host. Since the introduction of C# DevKit, `IWorkspace` moved into the VS layer, and we no longer need this property to be of type `object`. Instead, it can be typed as `IVsLanguageServiceBuildErrorReporter2`, which simplifies consuming code.
1 parent b92f25a commit abf1298

File tree

6 files changed

+40
-39
lines changed

6 files changed

+40
-39
lines changed

src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/Build/LanguageServiceErrorListProvider.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,18 @@ private async Task<AddMessageResult> AddMessageCoreAsync(TargetGeneratedError er
7474
{
7575
handled = await _workspaceWriter.WriteAsync(workspace =>
7676
{
77-
var errorReporter = (IVsLanguageServiceBuildErrorReporter2)workspace.HostSpecificErrorReporter;
78-
7977
try
8078
{
81-
errorReporter.ReportError2(details.Message,
82-
details.Code,
83-
details.Priority,
84-
details.LineNumberForErrorList,
85-
details.ColumnNumberForErrorList,
86-
details.EndLineNumberForErrorList,
87-
details.EndColumnNumberForErrorList,
88-
details.GetFileFullPath(_project.FullPath));
79+
workspace.ErrorReporter.ReportError2(
80+
details.Message,
81+
details.Code,
82+
details.Priority,
83+
details.LineNumberForErrorList,
84+
details.ColumnNumberForErrorList,
85+
details.EndLineNumberForErrorList,
86+
details.EndColumnNumberForErrorList,
87+
details.GetFileFullPath(_project.FullPath));
88+
8989
return TaskResult.True;
9090
}
9191
catch (NotImplementedException)
@@ -111,7 +111,7 @@ public async Task ClearAllAsync()
111111
{
112112
await _workspaceWriter.WriteAsync(workspace =>
113113
{
114-
((IVsLanguageServiceBuildErrorReporter2)workspace.HostSpecificErrorReporter).ClearErrors();
114+
workspace.ErrorReporter.ClearErrors();
115115

116116
return Task.CompletedTask;
117117
});

src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/LanguageServices/IWorkspace.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE.md file in the project root for more information.
22

33
using Microsoft.VisualStudio.LanguageServices.ProjectSystem;
4+
using Microsoft.VisualStudio.Shell.Interop;
45

56
namespace Microsoft.VisualStudio.ProjectSystem.LanguageServices
67
{
@@ -20,11 +21,8 @@ internal interface IWorkspace
2021
IWorkspaceProjectContext Context { get; }
2122

2223
/// <summary>
23-
/// Gets an object that represents a host-specific error reporter.
24+
/// Gets the language service build error reporter object.
2425
/// </summary>
25-
/// <remarks>
26-
/// Within a Visual Studio host, this is typically an object implementing IVsLanguageServiceBuildErrorReporter2.
27-
/// </remarks>
28-
object HostSpecificErrorReporter { get; }
26+
IVsLanguageServiceBuildErrorReporter2 ErrorReporter { get; }
2927
}
3028
}

src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/LanguageServices/Workspace.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.VisualStudio.ProjectSystem.OperationProgress;
77
using Microsoft.VisualStudio.ProjectSystem.Properties;
88
using Microsoft.VisualStudio.ProjectSystem.Utilities;
9+
using Microsoft.VisualStudio.Shell.Interop;
910
using Microsoft.VisualStudio.Threading;
1011

1112
namespace Microsoft.VisualStudio.ProjectSystem.LanguageServices;
@@ -84,7 +85,7 @@ internal enum WorkspaceState
8485

8586
public string ContextId => _contextId ?? throw new InvalidOperationException("Workspace has not been initialized.");
8687

87-
public object HostSpecificErrorReporter => Context;
88+
public IVsLanguageServiceBuildErrorReporter2 ErrorReporter => (IVsLanguageServiceBuildErrorReporter2)Context;
8889

8990
#endregion
9091

tests/Microsoft.VisualStudio.ProjectSystem.Managed.VS.UnitTests/Mocks/IWorkspaceMockFactory.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE.md file in the project root for more information.
22

33
using Microsoft.VisualStudio.LanguageServices.ProjectSystem;
4+
using Microsoft.VisualStudio.Shell.Interop;
45

56
namespace Microsoft.VisualStudio.ProjectSystem.LanguageServices
67
{
@@ -29,11 +30,11 @@ public static IWorkspace ImplementContext(IWorkspaceProjectContext context, stri
2930
return mock.Object;
3031
}
3132

32-
public static IWorkspace ImplementHostSpecificErrorReporter(Func<object> action)
33+
public static IWorkspace ImplementErrorReporter(Func<IVsLanguageServiceBuildErrorReporter2> action)
3334
{
3435
var mock = new Mock<IWorkspace>();
3536

36-
mock.SetupGet(c => c.HostSpecificErrorReporter)
37+
mock.SetupGet(c => c.ErrorReporter)
3738
.Returns(action);
3839

3940
return mock.Object;

tests/Microsoft.VisualStudio.ProjectSystem.Managed.VS.UnitTests/Mocks/IWorkspaceWriterFactory.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE.md file in the project root for more information.
22

3+
using Microsoft.VisualStudio.Shell.Interop;
34
using Microsoft.VisualStudio.Threading;
45

56
namespace Microsoft.VisualStudio.ProjectSystem.LanguageServices
@@ -18,9 +19,9 @@ public static IWorkspaceWriter ImplementContextId(string contextId)
1819
return new WorkspaceWriter(workspace);
1920
}
2021

21-
public static IWorkspaceWriter ImplementHostSpecificErrorReporter(Func<object> func)
22+
public static IWorkspaceWriter ImplementErrorReporter(Func<IVsLanguageServiceBuildErrorReporter2> func)
2223
{
23-
var workspace = IWorkspaceMockFactory.ImplementHostSpecificErrorReporter(func);
24+
var workspace = IWorkspaceMockFactory.ImplementErrorReporter(func);
2425

2526
return new WorkspaceWriter(workspace);
2627
}

tests/Microsoft.VisualStudio.ProjectSystem.Managed.VS.UnitTests/ProjectSystem/VS/Build/LanguageServiceErrorListProviderTests.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public void ResumeRefresh_DoesNotThrow()
2323
}
2424

2525
[Fact]
26-
public void ClearAllAsync_WhenNoHostSpecificErrorReporter_ReturnsCompletedTask()
26+
public void ClearAllAsync_WhenNoErrorReporter_ReturnsCompletedTask()
2727
{
2828
var provider = CreateInstance();
2929

@@ -33,7 +33,7 @@ public void ClearAllAsync_WhenNoHostSpecificErrorReporter_ReturnsCompletedTask()
3333
}
3434

3535
[Fact]
36-
public void ClearMessageFromTargetAsync_WhenNoHostSpecificErrorReporter_ReturnsCompletedTask()
36+
public void ClearMessageFromTargetAsync_WhenNoErrorReporter_ReturnsCompletedTask()
3737
{
3838
var provider = CreateInstance();
3939

@@ -43,11 +43,11 @@ public void ClearMessageFromTargetAsync_WhenNoHostSpecificErrorReporter_ReturnsC
4343
}
4444

4545
[Fact]
46-
public async Task ClearAllAsync_WhenHostSpecificErrorReporter_CallsClearErrors()
46+
public async Task ClearAllAsync_WhenErrorReporter_CallsClearErrors()
4747
{
4848
int callCount = 0;
4949
var reporter = IVsLanguageServiceBuildErrorReporter2Factory.ImplementClearErrors(() => { callCount++; return 0; });
50-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
50+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
5151
var task = CreateDefaultTask();
5252
var provider = CreateInstance(host);
5353

@@ -70,7 +70,7 @@ await Assert.ThrowsAsync<ArgumentNullException>("error", () =>
7070
}
7171

7272
[Fact]
73-
public async Task AddMessageAsync_WhenNoHostSpecificErrorReporter_ReturnsNotHandled()
73+
public async Task AddMessageAsync_WhenNoErrorReporter_ReturnsNotHandled()
7474
{
7575
var provider = CreateInstance();
7676

@@ -106,14 +106,14 @@ public async Task AddMessageAsync_ArgsWithNoCodeAsTask_ReturnsNotHandled()
106106
}
107107

108108
[Fact]
109-
public async Task AddMessageAsync_WhenHostSpecificErrorReporterThrowsNotImplemented_ReturnsNotHandled()
109+
public async Task AddMessageAsync_WhenErrorReporterThrowsNotImplemented_ReturnsNotHandled()
110110
{
111111
var reporter = IVsLanguageServiceBuildErrorReporter2Factory.ImplementReportError((string bstrErrorMessage, string bstrErrorId, VSTASKPRIORITY nPriority, int iLine, int iColumn, int iEndLine, int iEndColumn, string bstrFileName) =>
112112
{
113113
throw new NotImplementedException();
114114
});
115115

116-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
116+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
117117
var provider = CreateInstance(host);
118118
var task = CreateDefaultTask();
119119

@@ -123,14 +123,14 @@ public async Task AddMessageAsync_WhenHostSpecificErrorReporterThrowsNotImplemen
123123
}
124124

125125
[Fact]
126-
public async Task AddMessageAsync_WhenHostSpecificErrorReporterThrows_Throws()
126+
public async Task AddMessageAsync_WhenErrorReporterThrows_Throws()
127127
{
128128
var reporter = IVsLanguageServiceBuildErrorReporter2Factory.ImplementReportError((string bstrErrorMessage, string bstrErrorId, VSTASKPRIORITY nPriority, int iLine, int iColumn, int iEndLine, int iEndColumn, string bstrFileName) =>
129129
{
130130
throw new Exception();
131131
});
132132

133-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
133+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
134134
var provider = CreateInstance(host);
135135
var task = CreateDefaultTask();
136136

@@ -144,7 +144,7 @@ await Assert.ThrowsAsync<Exception>(() =>
144144
public async Task AddMessageAsync_ReturnsHandledAndStopProcessing()
145145
{
146146
var reporter = IVsLanguageServiceBuildErrorReporter2Factory.ImplementReportError((string bstrErrorMessage, string bstrErrorId, VSTASKPRIORITY nPriority, int iLine, int iColumn, int iEndLine, int iEndColumn, string bstrFileName) => { });
147-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
147+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
148148
var provider = CreateInstance(host);
149149
var task = CreateDefaultTask();
150150

@@ -161,7 +161,7 @@ public async Task AddMessageAsync_WarningTaskAsTask_PassesTP_NORMALAsPriority()
161161
{
162162
result = nPriority;
163163
});
164-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
164+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
165165
var provider = CreateInstance(host);
166166

167167
await provider.AddMessageAsync(new TargetGeneratedError("Test", new BuildWarningEventArgs(null, "Code", "File", 1, 1, 1, 1, "Message", "HelpKeyword", "Sender")));
@@ -177,7 +177,7 @@ public async Task AddMessageAsync_ErrorTaskAsTask_PassesTP_HIGHAsPriority()
177177
{
178178
result = nPriority;
179179
});
180-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
180+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
181181
var provider = CreateInstance(host);
182182

183183
await provider.AddMessageAsync(new TargetGeneratedError("Test", new BuildErrorEventArgs(null, "Code", "File", 1, 1, 1, 1, "Message", "HelpKeyword", "Sender")));
@@ -193,7 +193,7 @@ public async Task AddMessageAsync_CriticalBuildMessageTaskAsTask_PassesTP_LOWAsP
193193
{
194194
result = nPriority;
195195
});
196-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
196+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
197197
var provider = CreateInstance(host);
198198

199199
await provider.AddMessageAsync(new TargetGeneratedError("Test", new CriticalBuildMessageEventArgs(null, "Code", "File", 1, 1, 1, 1, "Message", "HelpKeyword", "Sender")));
@@ -220,7 +220,7 @@ public async Task AddMessageAsync_BuildErrorAsTask_CallsReportErrorSettingErrorM
220220
errorIdResult = bstrErrorId;
221221
});
222222

223-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
223+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
224224

225225
var provider = CreateInstance(host);
226226
await provider.AddMessageAsync(new TargetGeneratedError("Test", new BuildErrorEventArgs(null, code, "File", 0, 0, 0, 0, errorMessage, "HelpKeyword", "Sender")));
@@ -250,7 +250,7 @@ public async Task AddMessageAsync_BuildErrorAsTask_CallsReportErrorSettingLineAn
250250
columnResult = iColumn;
251251
});
252252

253-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
253+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
254254

255255
var provider = CreateInstance(host);
256256
await provider.AddMessageAsync(new TargetGeneratedError("Test", new BuildErrorEventArgs(null, "Code", "File", lineNumber, columnNumber, 0, 0, "ErrorMessage", "HelpKeyword", "Sender")));
@@ -281,7 +281,7 @@ public async Task AddMessageAsync_BuildErrorAsTask_CallsReportErrorSettingEndLin
281281
endColumnResult = iEndColumn;
282282
});
283283

284-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
284+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
285285

286286
var provider = CreateInstance(host);
287287
await provider.AddMessageAsync(new TargetGeneratedError("Test", new BuildErrorEventArgs(null, "Code", "File", lineNumber, columnNumber, endLineNumber, endColumnNumber, "ErrorMessage", "HelpKeyword", "Sender")));
@@ -314,7 +314,7 @@ public async Task AddMessageAsync_BuildErrorAsTask_CallsReportErrorSettingFileNa
314314
fileNameResult = bstrFileName;
315315
});
316316

317-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
317+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
318318

319319
var provider = CreateInstance(host);
320320

@@ -331,7 +331,7 @@ public async Task AddMessageAsync_BuildErrorAsTask_CallsReportErrorSettingFileNa
331331
public async Task AddMessageAsync_WithLspPullDiagnosticsEnabled_ReturnsNotHandled()
332332
{
333333
var reporter = IVsLanguageServiceBuildErrorReporter2Factory.ImplementReportError((string bstrErrorMessage, string bstrErrorId, VSTASKPRIORITY nPriority, int iLine, int iColumn, int iEndLine, int iEndColumn, string bstrFileName) => { });
334-
var host = IWorkspaceWriterFactory.ImplementHostSpecificErrorReporter(() => reporter);
334+
var host = IWorkspaceWriterFactory.ImplementErrorReporter(() => reporter);
335335
var provider = CreateInstance(host, lspPullDiagnosticsFeatureFlag: true);
336336
var task = CreateDefaultTask();
337337

0 commit comments

Comments
 (0)