提交 bca5a252 编写于 作者: J Jonathon Marolf

Responding to PR Feedback

Responding to peer review feedback. Updated to never consider user
defined narrowing conversions unnecessary.
上级 fcd4ea01
......@@ -50,7 +50,6 @@ public partial class TestWorkspaceFactory
private const string AnalyzerDisplayAttributeName = "Name";
private const string AnalyzerFullPathAttributeName = "FullPath";
private const string AliasAttributeName = "Alias";
private const string DiagnosticOptionElementName = "DiagnosticOption";
/// <summary>
/// Creates a single buffer in a workspace.
......
......@@ -398,7 +398,6 @@ private static CompilationOptions CreateCompilationOptions(TestWorkspace workspa
var rootNamespace = new VisualBasicCompilationOptions(OutputKind.ConsoleApplication).RootNamespace;
var globalImports = new List<GlobalImport>();
var reportDiagnostic = ReportDiagnostic.Default;
var specificDiagnostics = ImmutableDictionary.Create<string, ReportDiagnostic>();
if (compilationOptionsElement != null)
{
......@@ -430,10 +429,6 @@ private static CompilationOptions CreateCompilationOptions(TestWorkspace workspa
: new VisualBasicCompilationOptions(OutputKind.WindowsRuntimeMetadata).WithGlobalImports(globalImports)
.WithRootNamespace(rootNamespace);
}
specificDiagnostics = compilationOptionsElement.Elements(DiagnosticOptionElementName)
.Select(x => KeyValuePair.Create(x.Value, (ReportDiagnostic)Enum.Parse(typeof(ReportDiagnostic), x.Attribute(ReportDiagnosticAttributeName).Value)))
.ToImmutableDictionary();
}
else
{
......@@ -451,8 +446,7 @@ private static CompilationOptions CreateCompilationOptions(TestWorkspace workspa
.WithSourceReferenceResolver(SourceFileResolver.Default)
.WithXmlReferenceResolver(XmlFileResolver.Default)
.WithMetadataReferenceResolver(new AssemblyReferenceResolver(MetadataFileReferenceResolver.Default, MetadataFileReferenceProvider.Default))
.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default)
.WithSpecificDiagnosticOptions(specificDiagnostics);
.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default);
if (language == LanguageNames.VisualBasic)
{
......
......@@ -75,18 +75,6 @@ private static XElement CreateCompilationOptionsElement(CompilationOptions optio
element.SetAttributeValue(RootNamespaceAttributeName, vbOptions.RootNamespace);
}
if (vbOptions.SpecificDiagnosticOptions?.Any() == true)
{
element.Add(
vbOptions.SpecificDiagnosticOptions.AsEnumerable().Select(
i =>
{
var x = new XElement(DiagnosticOptionElementName, i.Key);
x.SetAttributeValue(ReportDiagnosticAttributeName, System.Enum.GetName(typeof(ReportDiagnostic), i.Value));
return x;
}));
}
return element;
}
......
......@@ -32,15 +32,11 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics
Return input.Replace("\n", vbCrLf)
End Function
Protected Overloads Sub Test(initialMarkup As XElement, expected As XElement, Optional index As Integer = 0, Optional compareTokens As Boolean = True, Optional compilationOptions As VisualBasicCompilationOptions = Nothing)
Protected Overloads Sub Test(initialMarkup As XElement, expected As XElement, Optional index As Integer = 0, Optional compareTokens As Boolean = True)
Dim initialMarkupStr = initialMarkup.ConvertTestSourceTag()
Dim expectedStr = expected.ConvertTestSourceTag()
If compilationOptions Is Nothing Then
compilationOptions = CType(_compilationOptions, VisualBasicCompilationOptions)
End If
MyBase.Test(initialMarkupStr, expectedStr, parseOptions:=Nothing, compilationOptions:=compilationOptions, index:=index, compareTokens:=compareTokens)
MyBase.Test(initialMarkupStr, expectedStr, parseOptions:=Nothing, compilationOptions:=_compilationOptions, index:=index, compareTokens:=compareTokens)
End Sub
Protected Overloads Sub TestMissingWithWorkspaceXml(initialMarkup As XElement)
......
......@@ -2697,7 +2697,7 @@ End Class
<WorkItem(3163, "https://github.com/dotnet/roslyn/issues/3163")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnnecessaryCast)>
Public Sub DoNotRemoveCastInNarrowingConverionWihtOptionStrictOn()
Public Sub DoNotRemoveCastInUserDefinedNarrowingConverionStrictOn()
Dim markup =
<File>
Option Strict On
......@@ -2736,7 +2736,7 @@ End Structure
<WorkItem(3163, "https://github.com/dotnet/roslyn/issues/3163")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnnecessaryCast)>
Public Sub DoNotRemoveCastInNarrowingConverionWihtOptionStrictOffBC42016AsWarning()
Public Sub DoNotRemoveCastInUserDefinedNarrowingConverionStrictOff()
Dim markup =
<File>
Option Strict Off
......@@ -2772,79 +2772,5 @@ End Structure
</File>
TestMissing(markup)
End Sub
<WorkItem(3163, "https://github.com/dotnet/roslyn/issues/3163")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnnecessaryCast)>
Public Sub RemoveCastInNarrowingConverionWihtOptionStrictOffBC42016Suppressed()
Dim markup =
<File>
Option Strict Off
Module Module1
Sub Main()
Dim red = ColorF.FromArgb(255, 255, 0, 0)
Dim c As Color = [|CType(red, Color)|]
End Sub
End Module
Public Structure ColorF
Public A, R, G, B As Single
Public Shared Function FromArgb(a As Double, r As Double, g As Double, b As Double) As ColorF
Return New ColorF With {.A = CSng(a), .R = CSng(r), .G = CSng(g), .B = CSng(b)}
End Function
Public Shared Widening Operator CType(x As Color) As ColorF
Return ColorF.FromArgb(x.A / 255, x.R / 255, x.G / 255, x.B / 255)
End Operator
Public Shared Narrowing Operator CType(x As ColorF) As Color
Return Color.FromArgb(CByte(x.A * 255), CByte(x.R * 255), CByte(x.G * 255), CByte(x.B * 255))
End Operator
End Structure
Public Structure Color
Public A, R, G, B As Byte
Public Shared Function FromArgb(a As Byte, r As Byte, g As Byte, b As Byte) As Color
Return New Color With {.A = a, .R = r, .G = g, .B = b}
End Function
End Structure
</File>
Dim expected =
<File>
Option Strict Off
Module Module1
Sub Main()
Dim red = ColorF.FromArgb(255, 255, 0, 0)
Dim c As Color = red
End Sub
End Module
Public Structure ColorF
Public A, R, G, B As Single
Public Shared Function FromArgb(a As Double, r As Double, g As Double, b As Double) As ColorF
Return New ColorF With {.A = CSng(a), .R = CSng(r), .G = CSng(g), .B = CSng(b)}
End Function
Public Shared Widening Operator CType(x As Color) As ColorF
Return ColorF.FromArgb(x.A / 255, x.R / 255, x.G / 255, x.B / 255)
End Operator
Public Shared Narrowing Operator CType(x As ColorF) As Color
Return Color.FromArgb(CByte(x.A * 255), CByte(x.R * 255), CByte(x.G * 255), CByte(x.B * 255))
End Operator
End Structure
Public Structure Color
Public A, R, G, B As Byte
Public Shared Function FromArgb(a As Byte, r As Byte, g As Byte, b As Byte) As Color
Return New Color With {.A = a, .R = r, .G = g, .B = b}
End Function
End Structure
</File>
Dim compilationOptions = New VisualBasicCompilationOptions(OutputKind.ConsoleApplication).WithOptionInfer(True)
compilationOptions = compilationOptions.WithSpecificDiagnosticOptions(compilationOptions.SpecificDiagnosticOptions.Add("BC42016", ReportDiagnostic.Suppress))
Test(markup, expected, compareTokens:=False, compilationOptions:=compilationOptions)
End Sub
End Class
End Namespace
......@@ -254,7 +254,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions
Return (HaveSameUserDefinedConversion(expressionToCastType, expressionToOuterType) OrElse
HaveSameUserDefinedConversion(castToOuterType, expressionToOuterType)) AndAlso
(UserDefinedConversionIsAllowed(_castNode, _semanticModel) AndAlso
NarrowingConversionIsAllowed(expressionToCastType, _semanticModel))
Not expressionToCastType.IsNarrowing)
ElseIf expressionToOuterType.IsUserDefined Then
Return False
End If
......@@ -343,28 +343,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions
Return True
End Function
Private Shared Function NarrowingConversionIsAllowed(conversion As Conversion, semanticModel As SemanticModel) As Boolean
' If this is not a narrowing conversion then no VB compiler options will disallow it
If conversion.IsNarrowing Then
' If Option Strict is On then all narrowing conversions are illegal
If semanticModel.OptionStrict = OptionStrict.On Then
Return False
Else
' For all other cases we only want to label a cast as unnecessary if BC42016 is suppressed,
' otherwise removing the cast will cause a warning or error to be shown to the user.
Dim reportDiagnostic As ReportDiagnostic
If semanticModel.Compilation.Options.SpecificDiagnosticOptions.TryGetValue("BC42016", reportDiagnostic) AndAlso
reportDiagnostic = ReportDiagnostic.Suppress Then
Return True
Else
Return False
End If
End If
End If
Return True
End Function
Private Shared Function IsRequiredWideningNumericConversion(sourceType As ITypeSymbol, destinationType As ITypeSymbol) As Boolean
' VB Language Specification: Section 8.3 Numeric Conversions
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册