Skip to content

Commit ef65cf8

Browse files
New slnx format uses forward slash
1 parent 579b74d commit ef65cf8

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

CodeConverter/Common/SolutionFileTextEditor.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,21 @@ public class SolutionFileTextEditor : ISolutionFileTextEditor
1515
var projectReferenceReplacements = new List<(string Find, string Replace, bool FirstOnly)>();
1616
foreach (var relativeProjPath in relativeProjPaths)
1717
{
18-
var escapedProjPath = Regex.Escape(relativeProjPath);
19-
var newProjPath = PathConverter.TogglePathExtension(relativeProjPath);
20-
projectReferenceReplacements.Add((escapedProjPath, newProjPath, false));
18+
// Add replacements for both backslash and forward-slash variants so .slnx files using either separator are handled
19+
var nativeVariant = relativeProjPath;
20+
var altVariant = relativeProjPath.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
21+
22+
// native (likely backslashes on Windows)
23+
var escapedNative = Regex.Escape(nativeVariant);
24+
var newNative = PathConverter.TogglePathExtension(nativeVariant);
25+
projectReferenceReplacements.Add((escapedNative, newNative, false));
26+
27+
// alternate (forward slashes)
28+
if (altVariant != nativeVariant) {
29+
var escapedAlt = Regex.Escape(altVariant);
30+
var newAlt = PathConverter.TogglePathExtension(altVariant);
31+
projectReferenceReplacements.Add((escapedAlt, newAlt, false));
32+
}
2133
}
2234

2335
return projectReferenceReplacements;

Tests/LanguageAgnostic/SolutionFileTextEditorTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,31 @@ public void ConvertSolutionFile_WhenInSolutionBaseDirThenUpdated()
5858
Assert.Equal(expectedSlnFile, Utils.HomogenizeEol(convertedSlnFile));
5959
}
6060

61+
[Fact]
62+
public void ConvertSlnxSolutionFile_ProjectElementsWithForwardSlashesAreUpdated()
63+
{
64+
//Arrange
65+
var slnxContents = "<Solution>\r\n <Project Path=\"ConsoleApp1/ConsoleApp1.vbproj\" />\r\n</Solution>";
66+
var slnxSln = CreateTestSolution(@"C:\MySolution\MySolution.slnx");
67+
var projectId = ProjectId.CreateNewId();
68+
var projInfo = ProjectInfo.Create(projectId, VersionStamp.Create(), "ConsoleApp1", "ConsoleApp1",
69+
LanguageNames.VisualBasic, @"C:\MySolution\ConsoleApp1\ConsoleApp1.vbproj");
70+
slnxSln = slnxSln.AddProject(projInfo);
71+
var testProject = slnxSln.GetProject(projectId);
72+
73+
_fsMock.Setup(mock => mock.File.ReadAllText(It.IsAny<string>())).Returns("");
74+
75+
var slnConverter = SolutionConverter.CreateFor<VBToCSConversion>(new List<Project> { testProject },
76+
fileSystem: _fsMock.Object, solutionContents: slnxContents);
77+
78+
//Act
79+
var convertedSlnFile = slnConverter.ConvertSolutionFile().ConvertedCode;
80+
81+
//Assert
82+
var expectedSlnFile = "<Solution>\r\n <Project Path=\"ConsoleApp1/ConsoleApp1.csproj\" />\r\n</Solution>";
83+
Assert.Equal(expectedSlnFile, Utils.HomogenizeEol(convertedSlnFile));
84+
}
85+
6186
[Fact]
6287
public void ConvertSolutionFile_WhenInProjectFolderThenUpdated()
6388
{

0 commit comments

Comments
 (0)