提交 217161d5 编写于 作者: O Omar Tawfik 提交者: GitHub

Merge pull request #14872 from OmarTawfik/fix-13681-vbc-output-extension

Handle different extensions specified as output name to vbc
**This document lists known breaking changes in Roslyn (VS2015+) from the native VB compiler (VS2013 and previous).**
*Breaks are formatted with a monotonically increasing numbered list to allow them to referenced via shorthand (i.e., "known break #1").
Each entry should include a short description of the break, followed by either a link to the issue describing the full details of the break or the full details of the break inline.*
1. When specifying the output extension as one of the known output types (example /out:foo.dll), but specifying a different target type
(example /t:exe) the compiler will now keep the specified extension and won't add the target extension (example foo.dll.exe). See
[#13681](https://github.com/dotnet/roslyn/issues/13681) for examples and details.
......@@ -2216,10 +2216,12 @@ lVbRuntimePlus:
outputFileName = outputFileName & ".netmodule"
End If
Else
Dim defaultExtension As String = kind.GetDefaultExtension()
If Not String.Equals(ext, defaultExtension, StringComparison.OrdinalIgnoreCase) Then
If Not ext.Equals(".exe", StringComparison.OrdinalIgnoreCase) And
Not ext.Equals(".dll", StringComparison.OrdinalIgnoreCase) And
Not ext.Equals(".netmodule", StringComparison.OrdinalIgnoreCase) And
Not ext.Equals(".winmdobj", StringComparison.OrdinalIgnoreCase) Then
simpleName = outputFileName
outputFileName = outputFileName & defaultExtension
outputFileName = outputFileName & kind.GetDefaultExtension()
End If
If simpleName Is Nothing Then
......
......@@ -7944,6 +7944,53 @@ End Class
Next
End Sub
<WorkItem(13681, "https://github.com/dotnet/roslyn/issues/13681")>
<Theory()>
<InlineData("/t:exe", "/out:foo.dll", "foo.dll", "foo.dll.exe")> 'Output with known but different extension
<InlineData("/t:exe", "/out:foo.dLL", "foo.dLL", "foo.dLL.exe")> 'Output with known but different extension (different casing)
<InlineData("/t:library", "/out:foo.exe", "foo.exe", "foo.exe.dll")> 'Output with known but different extension
<InlineData("/t:library", "/out:foo.eXe", "foo.eXe", "foo.eXe.dll")> 'Output with known but different extension (different casing)
<InlineData("/t:module", "/out:foo.dll", "foo.dll", "foo.dll.netmodule")> 'Output with known but different extension
<InlineData("/t:winmdobj", "/out:foo.netmodule", "foo.netmodule", "foo.netmodule.winmdobj")> 'Output with known but different extension
<InlineData("/t:exe", "/out:foo.netmodule", "foo.netmodule", "foo.netmodule.exe")> 'Output with known but different extension
<InlineData("/t:library", "/out:foo.txt", "foo.txt.dll", "foo.dll")> 'Output with unknown extension (.txt)
<InlineData("/t:exe", "/out:foo.md", "foo.md.exe", "foo.exe")> 'Output with unknown extension (.md)
<InlineData("/t:exe", "/out:foo", "foo.exe", "foo")> 'Output without extension
<InlineData("/t:library", "/out:foo", "foo.dll", "foo")> 'Output without extension
<InlineData("/t:module", "/out:foo", "foo.netmodule", "foo")> 'Output without extension
<InlineData("/t:winmdobj", "/out:foo", "foo.winmdobj", "foo")> 'Output without extension
<InlineData("/t:exe", "/out:foo.exe", "foo.exe", "foo.exe.exe")> 'Output with correct extension (.exe)
<InlineData("/t:library", "/out:foo.dll", "foo.dll", "foo.dll.dll")> 'Output with correct extension (.dll)
<InlineData("/t:module", "/out:foo.netmodule", "foo.netmodule", "foo.netmodule.netmodule")> 'Output with correct extension (.netmodule)
<InlineData("/t:module", "/out:foo.NetModule", "foo.NetModule", "foo.NetModule.netmodule")> 'Output with correct extension (.netmodule) (different casing)
<InlineData("/t:winmdobj", "/out:foo.winmdobj", "foo.winmdobj", "foo.winmdobj.winmdobj")> 'Output with correct extension (.winmdobj)
Public Sub OutputingFilesWithDifferentExtensions(targetArg As String, outArg As String, expectedFile As String, unexpectedFile As String)
Dim source =
<compilation>
<file name="a.vb">
<![CDATA[
Module Program
Sub Main(args As String())
End Sub
End Module
]]>
</file>
</compilation>
Dim fileName = "a.vb"
Dim dir = Temp.CreateDirectory()
Dim sourceFile = dir.CreateFile(fileName)
sourceFile.WriteAllText(source.Value)
Dim output As New StringWriter()
Assert.Equal(0, New MockVisualBasicCompiler(Nothing, dir.Path, {fileName, targetArg, outArg}).Run(output, Nothing))
Assert.True(File.Exists(Path.Combine(dir.Path, expectedFile)), "Expected to find: " & expectedFile)
Assert.False(File.Exists(Path.Combine(dir.Path, unexpectedFile)), "Didn't expect to find: " & unexpectedFile)
CleanupAllGeneratedFiles(sourceFile.Path)
End Sub
End Class
<DiagnosticAnalyzer(LanguageNames.VisualBasic)>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册