diff --git a/CodeConverter/CSharp/VBToCSConversion.cs b/CodeConverter/CSharp/VBToCSConversion.cs index d6b6bce1d..9452e8243 100644 --- a/CodeConverter/CSharp/VBToCSConversion.cs +++ b/CodeConverter/CSharp/VBToCSConversion.cs @@ -202,7 +202,7 @@ public List FindSingleImportantChild(SyntaxNode annotatedNode) public async Task SingleSecondPassAsync(Document doc) { - var simplifiedDocument = await doc.SimplifyStatementsAsync(UnresolvedNamespaceDiagnosticId, _cancellationToken); + var simplifiedDocument = await _vbToCsProjectContentsConverter.OptionalOperations.SimplifyStatementsAsync(doc, UnresolvedNamespaceDiagnosticId); // Can't add a reference to Microsoft.VisualBasic if there's no project file, so hint to install the package if (_vbToCsProjectContentsConverter.SourceProject.AssemblyName == FabricatedAssemblyName) { diff --git a/CodeConverter/Common/OptionalOperations.cs b/CodeConverter/Common/OptionalOperations.cs index b1365d089..99a805825 100644 --- a/CodeConverter/Common/OptionalOperations.cs +++ b/CodeConverter/Common/OptionalOperations.cs @@ -48,4 +48,19 @@ public SyntaxNode Format(SyntaxNode node, Document document) return node.NormalizeWhitespace(); } } + + public async Task SimplifyStatementsAsync(Document doc, string unresolvedNamespaceDiagnosticId) where T : SyntaxNode + { + using var cts = CancellationTokenSource.CreateLinkedTokenSource(_wholeTaskCancellationToken); + var token = cts.Token; + cts.CancelAfter(_abandonTasksIfNoActivityFor); + try { + // This sometimes gets stuck in an infinite loop within the CodeAnalysis library - https://github.com/icsharpcode/CodeConverter/issues/877#issuecomment-1221519204 + return await doc.SimplifyStatementsAsync(unresolvedNamespaceDiagnosticId, token); + } catch (OperationCanceledException) { + _progress.Report(new ConversionProgress($"Timeout expired - abandoning simplification for {doc.FilePath}. If within Visual Studio you can adjust the timeout in Tools -> Options -> Code Converter.", 1)); + return doc; + } + + } } \ No newline at end of file diff --git a/CodeConverter/VB/CSToVBConversion.cs b/CodeConverter/VB/CSToVBConversion.cs index af0d33da9..3cf34a3de 100644 --- a/CodeConverter/VB/CSToVBConversion.cs +++ b/CodeConverter/VB/CSToVBConversion.cs @@ -1,5 +1,6 @@ using System.Globalization; using System.Text; +using ICSharpCode.CodeConverter.CSharp; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.VisualBasic.Syntax; @@ -28,7 +29,7 @@ public async Task CreateProjectContentsConverterAsync } public async Task SingleSecondPassAsync(Document doc) { - return await doc.SimplifyStatementsAsync(UnresolvedNamespaceDiagnosticId, _cancellationToken); + return await _csToVbProjectContentsConverter.OptionalOperations.SimplifyStatementsAsync(doc, UnresolvedNamespaceDiagnosticId); } public SyntaxNode GetSurroundedNode(IEnumerable descendantNodes,