Skip to content

Commit 2c9ea37

Browse files
Set file path for text only conversion - fixes #589
1 parent e7b490e commit 2c9ea37

5 files changed

Lines changed: 15 additions & 6 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
66

77

88
### Vsix
9-
9+
* Fix file extension and location of single converted file [#589](https://github.com/icsharpcode/CodeConverter/issues/589)
1010

1111
### VB -> C#
1212

CodeConverter/Shared/CompilationOptionsExtensions.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ internal static class CompilationOptionsExtensions
1111
{
1212
public static Document AddDocumentFromTree(this Project project, SyntaxTree tree)
1313
{
14-
return project.AddDocument("CodeToConvert", tree.GetRoot(), filePath: Path.Combine(Path.GetTempPath(), "TempCodeToConvert.txt"));
14+
return project.AddDocument("CodeToConvert", tree.GetRoot(), filePath: string.IsNullOrEmpty(tree.FilePath) ? TempFilePath(tree.Options.Language) : tree.FilePath);
15+
}
16+
17+
private static string TempFilePath(string optionsLanguage)
18+
{
19+
return Path.Combine(Path.GetTempPath(), "TempCodeToConvert." + optionsLanguage == LanguageNames.CSharp ? "cs" : "vb");
1520
}
1621

1722
public static async Task<Project> CreateProjectAsync(this CompilationOptions options, IEnumerable<MetadataReference> references, ParseOptions parseOptions, string singleDocumentAssemblyName = "ProjectToBeConverted")

CodeConverter/Shared/ProjectConversion.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ private ProjectConversion(IProjectContentsConverter projectContentsConverter, IE
4646

4747
var languageConversion = new TLanguageConversion { ConversionOptions = conversionOptions };
4848
var syntaxTree = languageConversion.MakeFullCompilationUnit(text, out var textSpan);
49+
if (conversionOptions.SourceFilePath != null) syntaxTree = syntaxTree.WithFilePath(conversionOptions.SourceFilePath);
4950
if (textSpan.HasValue) conversionOptions.SelectedTextSpan = textSpan.Value;
5051
var document = await languageConversion.CreateProjectDocumentFromTreeAsync(syntaxTree, conversionOptions.References);
5152
return await ConvertSingleAsync<TLanguageConversion>(document, conversionOptions, progress, cancellationToken);

CodeConverter/Shared/TextConversionOptions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ public class TextConversionOptions : SingleConversionOptions
77
{
88
private readonly ConversionOptions _conversionOptions;
99

10-
public TextConversionOptions(IReadOnlyCollection<PortableExecutableReference> references)
10+
public TextConversionOptions(IReadOnlyCollection<PortableExecutableReference> references, string sourceFilePath = null)
1111
{
1212
References = references;
13+
SourceFilePath = sourceFilePath;
1314
_conversionOptions = new ConversionOptions();
1415
}
1516

1617
public IReadOnlyCollection<PortableExecutableReference> References { get; }
18+
public string SourceFilePath { get; }
1719
}
1820
}

Vsix/CodeConversion.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,14 +219,15 @@ private async Task<string> GetConversionSummaryAsync(IReadOnlyCollection<string>
219219
var documentId = _visualStudioWorkspace.CurrentSolution.GetDocumentIdsWithFilePath(documentPath).SingleOrDefault();
220220
if (documentId == null) {
221221
//If document doesn't belong to any project
222-
return await ConvertTextOnlyAsync<TLanguageConversion>(documentPath, selected, cancellationToken);
222+
await _outputWindow.WriteToOutputWindowAsync("File is not part of a compiling project, using best effort text conversion (less accurate).");
223+
return await ConvertFileTextAsync<TLanguageConversion>(documentPath, selected, cancellationToken);
223224
}
224225
var document = _visualStudioWorkspace.CurrentSolution.GetDocument(documentId);
225226
var selectedTextSpan = new TextSpan(selected.Start, selected.Length);
226227
return await ProjectConversion.ConvertSingleAsync<TLanguageConversion>(document, new SingleConversionOptions {SelectedTextSpan = selectedTextSpan}, CreateOutputWindowProgress(), cancellationToken);
227228
}
228229

229-
private async Task<ConversionResult> ConvertTextOnlyAsync<TLanguageConversion>(string documentPath, Span selected, CancellationToken cancellationToken)
230+
private async Task<ConversionResult> ConvertFileTextAsync<TLanguageConversion>(string documentPath, Span selected, CancellationToken cancellationToken)
230231
where TLanguageConversion : ILanguageConversion, new()
231232
{
232233
var documentText = File.ReadAllText(documentPath);
@@ -235,7 +236,7 @@ private async Task<ConversionResult> ConvertTextOnlyAsync<TLanguageConversion>(s
235236
documentText = documentText.Substring(selected.Start, selected.Length);
236237
}
237238

238-
var convertTextOnly = await ProjectConversion.ConvertTextAsync<TLanguageConversion>(documentText, new TextConversionOptions(DefaultReferences.NetStandard2), CreateOutputWindowProgress(), cancellationToken);
239+
var convertTextOnly = await ProjectConversion.ConvertTextAsync<TLanguageConversion>(documentText, new TextConversionOptions(DefaultReferences.NetStandard2, documentPath), CreateOutputWindowProgress(), cancellationToken);
239240
convertTextOnly.SourcePathOrNull = documentPath;
240241
return convertTextOnly;
241242
}

0 commit comments

Comments
 (0)