Skip to content

Commit 6cdf3ae

Browse files
Improve performance of VB->CS single file conversion - fixes #469
Avoid converting My namespace which is thrown away anyway
1 parent 3e22ad6 commit 6cdf3ae

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ All notable changes to the code converter will be documented in this file.
33
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
44

55
## [Unreleased]
6-
* Optimize away some redundant casts and conversions with strings/chars - [#388](https://github.com/icsharpcode/CodeConverter/issues/388)
76

87
### Vsix
98

109

1110
### VB -> C#
12-
11+
* Optimize away some redundant casts and conversions with strings/chars - [#388](https://github.com/icsharpcode/CodeConverter/issues/388)
12+
* Improve performance of single file conversion
1313

1414
### C# -> VB
1515

CodeConverter/CSharp/VBToCSConversion.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ public async Task<IProjectContentsConverter> CreateProjectContentsConverterAsync
3434
{
3535
_progress = progress;
3636
_cancellationToken = cancellationToken;
37-
_vbToCsProjectContentsConverter = new VBToCSProjectContentsConverter(ConversionOptions, progress, cancellationToken);
37+
bool useProjectLevelWinformsAdjustments = project.AssemblyName != FabricatedAssemblyName;
38+
_vbToCsProjectContentsConverter = new VBToCSProjectContentsConverter(ConversionOptions, useProjectLevelWinformsAdjustments, progress, cancellationToken);
3839
await _vbToCsProjectContentsConverter.InitializeSourceAsync(project);
3940
return _vbToCsProjectContentsConverter;
4041
}

CodeConverter/CSharp/VBToCSProjectContentsConverter.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace ICSharpCode.CodeConverter.CSharp
2121
internal class VBToCSProjectContentsConverter : IProjectContentsConverter
2222
{
2323
private readonly ConversionOptions _conversionOptions;
24+
private readonly bool _useProjectLevelWinformsAdjustments;
2425
private CSharpCompilation _csharpViewOfVbSymbols;
2526
private Dictionary<string, string> _designerToResxRelativePath;
2627
private Project _convertedCsProject;
@@ -29,9 +30,10 @@ internal class VBToCSProjectContentsConverter : IProjectContentsConverter
2930
private readonly IProgress<ConversionProgress> _progress;
3031
private readonly CancellationToken _cancellationToken;
3132

32-
public VBToCSProjectContentsConverter(ConversionOptions conversionOptions, IProgress<ConversionProgress> progress, CancellationToken cancellationToken)
33+
public VBToCSProjectContentsConverter(ConversionOptions conversionOptions, bool useProjectLevelWinformsAdjustments, IProgress<ConversionProgress> progress, CancellationToken cancellationToken)
3334
{
3435
_conversionOptions = conversionOptions;
36+
this._useProjectLevelWinformsAdjustments = useProjectLevelWinformsAdjustments;
3537
_progress = progress;
3638
_cancellationToken = cancellationToken;
3739
}
@@ -44,10 +46,16 @@ public async Task InitializeSourceAsync(Project project)
4446
var cSharpCompilationOptions = CSharpCompiler.CreateCompilationOptions();
4547
_convertedCsProject = project.ToProjectFromAnyOptions(cSharpCompilationOptions, CSharpCompiler.ParseOptions);
4648
_csharpReferenceProject = project.CreateReferenceOnlyProjectFromAnyOptions(cSharpCompilationOptions, CSharpCompiler.ParseOptions);
47-
_csharpViewOfVbSymbols = (CSharpCompilation) await _csharpReferenceProject.GetCompilationAsync(_cancellationToken);
49+
_csharpViewOfVbSymbols = (CSharpCompilation)await _csharpReferenceProject.GetCompilationAsync(_cancellationToken);
4850
_designerToResxRelativePath = project.ReadVbEmbeddedResources().ToDictionary(r => r.LastGenOutput, r => r.RelativePath);
49-
SourceProject = await project.WithAdditionalDocs(_designerToResxRelativePath.Values)
50-
.WithRenamedMergedMyNamespaceAsync(_cancellationToken);
51+
SourceProject = await WithProjectLevelWinformsAdjustmentsAsync(project);
52+
}
53+
54+
private async Task<Project> WithProjectLevelWinformsAdjustmentsAsync(Project project)
55+
{
56+
if (!_useProjectLevelWinformsAdjustments) return project;
57+
return await project.WithAdditionalDocs(_designerToResxRelativePath.Values)
58+
.WithRenamedMergedMyNamespaceAsync(_cancellationToken);
5159
}
5260

5361
public string LanguageVersion { get { return LangVersion.Latest.ToDisplayString(); } }
@@ -63,7 +71,8 @@ public async Task<SyntaxNode> SingleFirstPassAsync(Document document)
6371
{
6472
var projDirPath = SourceProject.GetDirectoryPath();
6573
var (project, docIds) = _convertedCsProject.WithDocuments(firstPassResults.Select(r => r.WithTargetPath(GetTargetPath(projDirPath, r))).ToArray());
66-
return (await project.RenameMergedNamespacesAsync(_cancellationToken), docIds);
74+
if (_useProjectLevelWinformsAdjustments) project = await project.RenameMergedNamespacesAsync(_cancellationToken);
75+
return (project, docIds);
6776
}
6877

6978
private string GetTargetPath(string projDirPath, WipFileConversion<SyntaxNode> r)

0 commit comments

Comments
 (0)