Skip to content

Commit 1d4decc

Browse files
Propagate progress and errors better
1 parent bf00990 commit 1d4decc

2 files changed

Lines changed: 27 additions & 16 deletions

File tree

ICSharpCode.CodeConverter/Shared/ProjectConversion.cs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ private ProjectConversion(IProjectContentsConverter projectContentsConverter, IE
3636
_returnSelectedNode = returnSelectedNode;
3737
}
3838

39-
public static async Task<ConversionResult> ConvertText<TLanguageConversion>(string text, TextConversionOptions conversionOptions) where TLanguageConversion : ILanguageConversion, new()
39+
public static async Task<ConversionResult> ConvertText<TLanguageConversion>(string text, TextConversionOptions conversionOptions, IProgress<ConversionProgress> progress = null) where TLanguageConversion : ILanguageConversion, new()
4040
{
4141
await new SynchronizationContextRemover();
4242

@@ -45,11 +45,11 @@ private ProjectConversion(IProjectContentsConverter projectContentsConverter, IE
4545
if (textSpan.HasValue) conversionOptions.SelectedTextSpan = textSpan.Value;
4646
using (var workspace = new AdhocWorkspace()) {
4747
var document = languageConversion.CreateProjectDocumentFromTree(workspace, syntaxTree, conversionOptions.References);
48-
return await ConvertSingle<TLanguageConversion>(document, conversionOptions);
48+
return await ConvertSingle<TLanguageConversion>(document, conversionOptions, progress);
4949
}
5050
}
5151

52-
public static async Task<ConversionResult> ConvertSingle<TLanguageConversion>(Document document, SingleConversionOptions conversionOptions) where TLanguageConversion : ILanguageConversion, new()
52+
public static async Task<ConversionResult> ConvertSingle<TLanguageConversion>(Document document, SingleConversionOptions conversionOptions, IProgress<ConversionProgress> progress = null) where TLanguageConversion : ILanguageConversion, new()
5353
{
5454
await new SynchronizationContextRemover();
5555

@@ -65,7 +65,7 @@ private ProjectConversion(IProjectContentsConverter projectContentsConverter, IE
6565
document = projectContentsConverter.Project.GetDocument(document.Id);
6666

6767
var conversion = new ProjectConversion(projectContentsConverter, new[] { document }, languageConversion, returnSelectedNode);
68-
var conversionResults = (await ConvertProjectContents(conversion, new Progress<ConversionProgress>())).ToList();
68+
var conversionResults = (await ConvertProjectContents(conversion, progress ?? new Progress<ConversionProgress>())).ToList();
6969
var codeResult = conversionResults.SingleOrDefault(x => !string.IsNullOrWhiteSpace(x.ConvertedCode))
7070
?? conversionResults.First();
7171
codeResult.Exceptions = conversionResults.SelectMany(x => x.Exceptions).ToArray();
@@ -207,7 +207,7 @@ private static Action<Exception> ExchangeFatalErrorHandler(Action<Exception> err
207207
if (firstPassResult.document != null) {
208208
progress.Report(firstPassResult.Path);
209209
var (convertedNode, errors) = await SingleSecondPassHandled(firstPassResult.document);
210-
return (firstPassResult.Path, convertedNode, firstPassResult.Errors.Concat(errors).ToArray());
210+
return (firstPassResult.Path, convertedNode, firstPassResult.Errors.Concat(errors).Union(GetErrorsFromAnnotations(convertedNode)).ToArray());
211211
}
212212

213213
return (firstPassResult.Path, null, firstPassResult.Errors);
@@ -236,7 +236,8 @@ private static Action<Exception> ExchangeFatalErrorHandler(Action<Exception> err
236236
errors = new[] {e.ToString()};
237237
}
238238

239-
return (selectedNode ?? await convertedDocument.GetSyntaxRootAsync(), errors);
239+
var convertedNode = selectedNode ?? await convertedDocument.GetSyntaxRootAsync();
240+
return (convertedNode, errors);
240241
}
241242

242243
private async Task<string> GetProjectWarnings(Project source, (string Path, SyntaxNode Node, string[] Errors)[] converted)
@@ -254,17 +255,22 @@ private async Task<string> GetProjectWarnings(Project source, (string Path, Synt
254255
progress.Report(treeFilePath);
255256
try {
256257
var convertedNode = await _projectContentsConverter.SingleFirstPass(document);
257-
var errorAnnotations = convertedNode.GetAnnotations(AnnotationConstants.ConversionErrorAnnotationKind).ToList();
258-
string[] errors = errorAnnotations.Select(a => a.Data).ToArray();
258+
string[] errors = GetErrorsFromAnnotations(convertedNode);
259259

260260
return (treeFilePath, convertedNode, errors);
261-
}
262-
catch (Exception e)
261+
} catch (Exception e)
263262
{
264263
return (treeFilePath, null, new[]{e.ToString()});
265264
}
266265
}
267266

267+
private static string[] GetErrorsFromAnnotations(SyntaxNode convertedNode)
268+
{
269+
var errorAnnotations = convertedNode.GetAnnotations(AnnotationConstants.ConversionErrorAnnotationKind).ToList();
270+
string[] errors = errorAnnotations.Select(a => a.Data).ToArray();
271+
return errors;
272+
}
273+
268274
private static async Task<Document> WithAnnotatedSelection(Document document, TextSpan selected)
269275
{
270276
var root = await document.GetSyntaxRootAsync();

Vsix/CodeConversion.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,10 @@ private async Task<string> GetConversionSummaryAsync(IReadOnlyCollection<string>
230230
}
231231
var document = _visualStudioWorkspace.CurrentSolution.GetDocument(documentId);
232232
var selectedTextSpan = new TextSpan(selected.Start, selected.Length);
233-
return await ProjectConversion.ConvertSingle<TLanguageConversion>(document, new SingleConversionOptions {SelectedTextSpan = selectedTextSpan});
233+
return await ProjectConversion.ConvertSingle<TLanguageConversion>(document, new SingleConversionOptions {SelectedTextSpan = selectedTextSpan}, CreateOutputWindowProgress());
234234
}
235235

236-
private static async Task<ConversionResult> ConvertTextOnlyAsync<TLanguageConversion>(string documentPath, Span selected)
236+
private async Task<ConversionResult> ConvertTextOnlyAsync<TLanguageConversion>(string documentPath, Span selected)
237237
where TLanguageConversion : ILanguageConversion, new()
238238
{
239239
var documentText = File.ReadAllText(documentPath);
@@ -242,7 +242,7 @@ private static async Task<ConversionResult> ConvertTextOnlyAsync<TLanguageConver
242242
documentText = documentText.Substring(selected.Start, selected.Length);
243243
}
244244

245-
var convertTextOnly = await ProjectConversion.ConvertText<TLanguageConversion>(documentText, new TextConversionOptions(DefaultReferences.NetStandard2));
245+
var convertTextOnly = await ProjectConversion.ConvertText<TLanguageConversion>(documentText, new TextConversionOptions(DefaultReferences.NetStandard2), CreateOutputWindowProgress());
246246
convertTextOnly.SourcePathOrNull = documentPath;
247247
return convertTextOnly;
248248
}
@@ -263,13 +263,18 @@ private async Task<IEnumerable<ConversionResult>> ConvertProjectUnhandledAsync<T
263263
#pragma warning restore VSTHRD010 // Invoke single-threaded types on Main thread
264264
await TaskScheduler.Default;
265265

266-
var solutionConverter = SolutionConverter.CreateFor<TLanguageConversion>(projects, progress: new Progress<ConversionProgress>(s => {
267-
_outputWindow.WriteToOutputWindowAsync(FormatForOutputWindow(s)).ForgetNoThrow();
268-
}));
266+
var solutionConverter = SolutionConverter.CreateFor<TLanguageConversion>(projects, progress: CreateOutputWindowProgress());
269267

270268
return await solutionConverter.Convert();
271269
}
272270

271+
private Progress<ConversionProgress> CreateOutputWindowProgress()
272+
{
273+
return new Progress<ConversionProgress>(s => {
274+
_outputWindow.WriteToOutputWindowAsync(FormatForOutputWindow(s)).ForgetNoThrow();
275+
});
276+
}
277+
273278
private static string FormatForOutputWindow(ConversionProgress s)
274279
{
275280
string preMessage = Environment.NewLine;

0 commit comments

Comments
 (0)