Skip to content

Commit b44627f

Browse files
Convert to async
1 parent 196538d commit b44627f

8 files changed

Lines changed: 39 additions & 24 deletions

CodeConverter/CSharp/VBToCSConversion.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,16 +164,16 @@ private VisualBasicCompiler CreateCompiler()
164164
return new VisualBasicCompiler(ConversionOptions.RootNamespaceOverride);
165165
}
166166

167-
public Document CreateProjectDocumentFromTree(SyntaxTree tree, IEnumerable<MetadataReference> references)
167+
public async Task<Document> CreateProjectDocumentFromTreeAsync(SyntaxTree tree, IEnumerable<MetadataReference> references)
168168
{
169-
var project = CreateEmptyVbProject(references);
169+
var project = await CreateEmptyVbProjectAsync(references);
170170
return project.AddDocumentFromTree(tree);
171171
}
172172

173-
private Project CreateEmptyVbProject(IEnumerable<MetadataReference> references)
173+
private async Task<Project> CreateEmptyVbProjectAsync(IEnumerable<MetadataReference> references)
174174
{
175-
return VisualBasicCompiler.CreateCompilationOptions(ConversionOptions.RootNamespaceOverride)
176-
.CreateProject(references, VisualBasicParseOptions.Default, ISymbolExtensions.ForcePartialTypesAssemblyName);
175+
return await VisualBasicCompiler.CreateCompilationOptions(ConversionOptions.RootNamespaceOverride)
176+
.CreateProjectAsync(references, VisualBasicParseOptions.Default, ISymbolExtensions.ForcePartialTypesAssemblyName);
177177
}
178178
}
179179
}

CodeConverter/ILanguageConversion.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ SyntaxNode GetSurroundedNode(IEnumerable<SyntaxNode> descendantNodes,
2727
Task<IProjectContentsConverter> CreateProjectContentsConverter(Project project, IProgress<ConversionProgress> progress, CancellationToken cancellationToken);
2828
string PostTransformProjectFile(string xml);
2929

30-
Document CreateProjectDocumentFromTree(SyntaxTree tree, IEnumerable<MetadataReference> references);
30+
Task<Document> CreateProjectDocumentFromTreeAsync(SyntaxTree tree, IEnumerable<MetadataReference> references);
3131
}
3232
}

CodeConverter/Shared/CompilationOptionsExtensions.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Generic;
22
using System.IO;
3+
using System.Threading.Tasks;
34
using ICSharpCode.CodeConverter.CSharp;
45
using Microsoft.CodeAnalysis;
56
using Microsoft.CodeAnalysis.Host.Mef;
@@ -13,13 +14,13 @@ public static Document AddDocumentFromTree(this Project project, SyntaxTree tree
1314
return project.AddDocument("CodeToConvert", tree.GetRoot(), filePath: Path.Combine(Directory.GetCurrentDirectory(), "TempCodeToConvert.txt"));
1415
}
1516

16-
public static Project CreateProject(this CompilationOptions options, IEnumerable<MetadataReference> references, ParseOptions parseOptions, string singleDocumentAssemblyName = "ProjectToBeConverted")
17+
public static async Task<Project> CreateProjectAsync(this CompilationOptions options, IEnumerable<MetadataReference> references, ParseOptions parseOptions, string singleDocumentAssemblyName = "ProjectToBeConverted")
1718
{
1819
ProjectId projectId = ProjectId.CreateNewId();
1920

2021
string projFileExtension = parseOptions.Language == LanguageNames.CSharp ? ".csproj" : ".vbproj";
2122
var projectFilePath = Path.Combine(Directory.GetCurrentDirectory() + singleDocumentAssemblyName + projFileExtension);
22-
var solution = ThreadSafeWorkspaceHelper.EmptyAdhocSolution.AddProject(projectId, singleDocumentAssemblyName,
23+
var solution = (await ThreadSafeWorkspaceHelper.EmptyAdhocSolution.GetValueAsync()).AddProject(projectId, singleDocumentAssemblyName,
2324
singleDocumentAssemblyName, options.Language)
2425
.WithProjectFilePath(projectId, projectFilePath);
2526

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System;
2+
using Microsoft.VisualStudio.Threading;
3+
4+
namespace ICSharpCode.CodeConverter.Shared
5+
{
6+
/// <summary>
7+
/// If you have a JoinableTaskFactory, set it here to help avoid deadlocks
8+
/// </summary>
9+
internal static class JoinableTaskFactorySingleton
10+
{
11+
public static JoinableTaskFactory Instance { get; private set; }
12+
13+
internal static void EnsureInitialized()
14+
{
15+
Instance = new JoinableTaskFactory(new JoinableTaskContext());
16+
}
17+
}
18+
}

CodeConverter/Shared/ProjectConversion.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Microsoft.CodeAnalysis;
1313
using Microsoft.CodeAnalysis.Formatting;
1414
using Microsoft.CodeAnalysis.Text;
15+
using Microsoft.VisualStudio.Threading;
1516

1617
namespace ICSharpCode.CodeConverter.Shared
1718
{
@@ -46,7 +47,7 @@ private ProjectConversion(IProjectContentsConverter projectContentsConverter, IE
4647
var languageConversion = new TLanguageConversion { ConversionOptions = conversionOptions };
4748
var syntaxTree = languageConversion.MakeFullCompilationUnit(text, out var textSpan);
4849
if (textSpan.HasValue) conversionOptions.SelectedTextSpan = textSpan.Value;
49-
var document = languageConversion.CreateProjectDocumentFromTree(syntaxTree, conversionOptions.References);
50+
var document = await languageConversion.CreateProjectDocumentFromTreeAsync(syntaxTree, conversionOptions.References);
5051
return await ConvertSingle<TLanguageConversion>(document, conversionOptions, progress, cancellationToken);
5152
}
5253

@@ -343,6 +344,7 @@ private string PathRelativeToSolutionDir(string path)
343344

344345
private static async Task<IDisposable> RoslynEntryPoint(IProgress<ConversionProgress> progress)
345346
{
347+
JoinableTaskFactorySingleton.EnsureInitialized();
346348
await new SynchronizationContextRemover();
347349
return RoslynCrashPreventer.Create(LogError);
348350

CodeConverter/Shared/ThreadSafeWorkspaceHelper.cs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ public static class ThreadSafeWorkspaceHelper
2020
/// <summary>
2121
/// Empty solution in an adhoc workspace
2222
/// </summary>
23-
public static Solution EmptyAdhocSolution => _emptyAdhocSolution.GetAwaiter().GetResult();
23+
public static AsyncLazy<Solution> EmptyAdhocSolution { get; } = new AsyncLazy<Solution>(async () => {
24+
var hostServices = await CreateHostServicesAsync(MefHostServices.DefaultAssemblies);
25+
return new AdhocWorkspace(hostServices).CurrentSolution;
26+
}, JoinableTaskFactorySingleton.Instance);
2427

2528
/// <summary>
2629
/// Use this in all workspace creation
@@ -41,15 +44,5 @@ private static async Task<IExportProviderFactory> CreateExportProviderFactoryAsy
4144
var runtimeComposition = RuntimeComposition.CreateRuntimeComposition(configuration);
4245
return runtimeComposition.CreateExportProviderFactory();
4346
}
44-
45-
/// <summary>
46-
/// Empty solution in an adhoc workspace
47-
/// </summary>
48-
private static Task<Solution> _emptyAdhocSolution =
49-
Task.Run(async () => {
50-
var hostServices = await CreateHostServicesAsync(MefHostServices.DefaultAssemblies);
51-
return new AdhocWorkspace(hostServices).CurrentSolution;
52-
});
53-
5447
}
5548
}

CodeConverter/VB/CSToVBConversion.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,10 @@ public SyntaxTree CreateTree(string text)
152152
return new CSharpCompiler().CreateTree(text);
153153
}
154154

155-
public Document CreateProjectDocumentFromTree(SyntaxTree tree, IEnumerable<MetadataReference> references)
155+
public async Task<Document> CreateProjectDocumentFromTreeAsync(SyntaxTree tree, IEnumerable<MetadataReference> references)
156156
{
157-
return CSharpCompiler.CreateCompilationOptions().CreateProject(references, CSharpParseOptions.Default).AddDocumentFromTree(tree);
157+
return (await CSharpCompiler.CreateCompilationOptions().CreateProjectAsync(references, CSharpParseOptions.Default))
158+
.AddDocumentFromTree(tree);
158159
}
159160
}
160161
}

Tests/TestRunners/ConverterTestBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,9 @@ async Task<IProjectContentsConverter> ILanguageConversion.CreateProjectContentsC
183183
return await baseConversion.CreateProjectContentsConverter(project, progress, cancellationToken);
184184
}
185185

186-
Document ILanguageConversion.CreateProjectDocumentFromTree(SyntaxTree tree, IEnumerable<MetadataReference> references)
186+
async Task<Document> ILanguageConversion.CreateProjectDocumentFromTreeAsync(SyntaxTree tree, IEnumerable<MetadataReference> references)
187187
{
188-
return baseConversion.CreateProjectDocumentFromTree(tree, references);
188+
return await baseConversion.CreateProjectDocumentFromTreeAsync(tree, references);
189189
}
190190

191191
SyntaxTree ILanguageConversion.CreateTree(string text) {

0 commit comments

Comments
 (0)