Skip to content

Commit 976fe55

Browse files
Ensure built before conversion
Relates to #592
1 parent e6dcd32 commit 976fe55

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

Vsix/CodeConversion.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public CodeConversion(IAsyncServiceProvider serviceProvider,
5353
public async Task ConvertProjectsAsync<TLanguageConversion>(IReadOnlyCollection<Project> selectedProjects, CancellationToken cancellationToken) where TLanguageConversion : ILanguageConversion, new()
5454
{
5555
try {
56+
await EnsureBuiltAsync();
5657
await _joinableTaskFactory.RunAsync(async () => {
5758
var convertedFiles = ConvertProjectUnhandled<TLanguageConversion>(selectedProjects, cancellationToken);
5859
await WriteConvertedFilesAndShowSummaryAsync(convertedFiles);
@@ -67,6 +68,7 @@ await _joinableTaskFactory.RunAsync(async () => {
6768
public async Task ConvertDocumentAsync<TLanguageConversion>(string documentFilePath, Span selected, CancellationToken cancellationToken) where TLanguageConversion : ILanguageConversion, new()
6869
{
6970
try {
71+
await EnsureBuiltAsync();
7072
var conversionResult = await _joinableTaskFactory.RunAsync(async () => {
7173
var result = await ConvertDocumentUnhandledAsync<TLanguageConversion>(documentFilePath, selected, cancellationToken);
7274
await WriteConvertedFilesAndShowSummaryAsync(new[] { result }.ToAsyncEnumerable());
@@ -85,6 +87,15 @@ await _joinableTaskFactory.RunAsync(async () => {
8587
}
8688
}
8789

90+
/// <remarks>
91+
/// https://github.com/icsharpcode/CodeConverter/issues/592
92+
/// https://github.com/dotnet/roslyn/issues/6615
93+
/// </remarks>
94+
private async Task EnsureBuiltAsync()
95+
{
96+
await VisualStudioInteraction.EnsureBuiltAsync(m => _outputWindow.WriteToOutputWindowAsync(m));
97+
}
98+
8899
private static async Task SetClipboardTextOnUiThreadAsync(string conversionResultConvertedCode)
89100
{
90101
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

Vsix/VisualStudioInteraction.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,18 @@ public static async Task<bool> ShowMessageBoxAsync(IAsyncServiceProvider service
135135
return userAnswer == MessageBoxResult.OK;
136136
}
137137

138+
public static async Task EnsureBuiltAsync(Func<string, Task> writeMessageAsync)
139+
{
140+
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(CancelAllToken);
141+
var build = Dte.Solution.SolutionBuild;
142+
if (build.BuildState == vsBuildState.vsBuildStateInProgress) {
143+
throw new InvalidOperationException("Build in progress, please wait for it to complete before conversion.");
144+
}
145+
await writeMessageAsync("Building solution prior to conversion for maximum accuracy...");
146+
build.Build(true);
147+
await TaskScheduler.Default;
148+
}
149+
138150
public static async Task WriteStatusBarTextAsync(IAsyncServiceProvider serviceProvider, string text)
139151
{
140152
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(CancelAllToken);

0 commit comments

Comments
 (0)