提交 bfc4e54d 编写于 作者: D Dustin Campbell

Merge pull request #8390 from DustinCampbell/issue-8381

Fix speculation analyzer to correctly use converted type when testing conversions with Option Strict On
......@@ -8434,6 +8434,7 @@ End Class
Await TestAsync(input, expected)
End Function
<WorkItem(2560, "https://github.com/dotnet/roslyn/issues/2560")>
<Fact, Trait(Traits.Feature, Traits.Features.Simplification)>
Public Async Function TestVisualBasic_Remove_IntegerToByte_OptionStrictOff() As Task
Dim input =
......@@ -8465,6 +8466,7 @@ End Class
Await TestAsync(input, expected)
End Function
<WorkItem(2560, "https://github.com/dotnet/roslyn/issues/2560")>
<Fact, Trait(Traits.Feature, Traits.Features.Simplification)>
Public Async Function TestVisualBasic_DontRemove_IntegerToByte_OptionStrictOn1() As Task
Dim input =
......@@ -8496,6 +8498,7 @@ End Class
Await TestAsync(input, expected)
End Function
<WorkItem(2560, "https://github.com/dotnet/roslyn/issues/2560")>
<Fact, Trait(Traits.Feature, Traits.Features.Simplification)>
Public Async Function TestVisualBasic_DontRemove_IntegerToByte_OptionStrictOn2() As Task
Dim input =
......@@ -8529,6 +8532,7 @@ End Class
Await TestAsync(input, expected)
End Function
<WorkItem(2560, "https://github.com/dotnet/roslyn/issues/2560")>
<Fact, Trait(Traits.Feature, Traits.Features.Simplification)>
Public Async Function TestVisualBasic_DontRemove_IntegerToByte_OptionStrictOn3() As Task
Dim input =
......@@ -8562,6 +8566,7 @@ End Class
Await TestAsync(input, expected)
End Function
<WorkItem(2560, "https://github.com/dotnet/roslyn/issues/2560")>
<Fact, Trait(Traits.Feature, Traits.Features.Simplification)>
Public Async Function TestVisualBasic_DontRemove_IntegerToByte_OptionStrictOn4() As Task
Dim input =
......@@ -8592,6 +8597,7 @@ End Class
Await TestAsync(input, expected)
End Function
#End Region
End Class
......
......@@ -4456,11 +4456,173 @@ End Class
Await TestAsync(input, expected, DontPreferIntrinsicPredefinedTypeKeywordInDeclaration)
End Function
<WorkItem(8381, "https://github.com/dotnet/roslyn/issues/8381")>
<Fact, Trait(Traits.Feature, Traits.Features.Simplification)>
Public Async Function SimplifyMeRegardlessOfTypeAndOptionStrict1() As Task
Dim input =
<Workspace>
<Project Language="Visual Basic" CommonReferences="true">
<Document>
Option Strict On
Class Class1
Private field1 As Short
Private field2 As Integer
Public Sub New()
{|SimplifyParent:Me.field1|} = 0
Me.field2 = 0
End Sub
End Class
</Document>
</Project>
</Workspace>
Dim expected =
<text>
Option Strict On
Class Class1
Private field1 As Short
Private field2 As Integer
Public Sub New()
field1 = 0
Me.field2 = 0
End Sub
End Class
</text>
Await TestAsync(input, expected, DontQualifyMemberAccessWithThisOrMe)
End Function
<WorkItem(8381, "https://github.com/dotnet/roslyn/issues/8381")>
<Fact, Trait(Traits.Feature, Traits.Features.Simplification)>
Public Async Function SimplifyMeRegardlessOfTypeAndOptionStrict2() As Task
Dim input =
<Workspace>
<Project Language="Visual Basic" CommonReferences="true">
<Document>
Option Strict On
Class Class1
Private field1 As Short
Private field2 As Integer
Public Sub New()
Me.field1 = 0
{|SimplifyParent:Me.field2|} = 0
End Sub
End Class
</Document>
</Project>
</Workspace>
Dim expected =
<text>
Option Strict On
Class Class1
Private field1 As Short
Private field2 As Integer
Public Sub New()
Me.field1 = 0
field2 = 0
End Sub
End Class
</text>
Await TestAsync(input, expected, DontQualifyMemberAccessWithThisOrMe)
End Function
<WorkItem(8381, "https://github.com/dotnet/roslyn/issues/8381")>
<Fact, Trait(Traits.Feature, Traits.Features.Simplification)>
Public Async Function SimplifyMeRegardlessOfTypeAndOptionStrict3() As Task
Dim input =
<Workspace>
<Project Language="Visual Basic" CommonReferences="true">
<Document>
Option Strict Off
Class Class1
Private field1 As Short
Private field2 As Integer
Public Sub New()
{|SimplifyParent:Me.field1|} = 0
Me.field2 = 0
End Sub
End Class
</Document>
</Project>
</Workspace>
Dim expected =
<text>
Option Strict Off
Class Class1
Private field1 As Short
Private field2 As Integer
Public Sub New()
field1 = 0
Me.field2 = 0
End Sub
End Class
</text>
Await TestAsync(input, expected, DontQualifyMemberAccessWithThisOrMe)
End Function
<WorkItem(8381, "https://github.com/dotnet/roslyn/issues/8381")>
<Fact, Trait(Traits.Feature, Traits.Features.Simplification)>
Public Async Function SimplifyMeRegardlessOfTypeAndOptionStrict4() As Task
Dim input =
<Workspace>
<Project Language="Visual Basic" CommonReferences="true">
<Document>
Option Strict Off
Class Class1
Private field1 As Short
Private field2 As Integer
Public Sub New()
Me.field1 = 0
{|SimplifyParent:Me.field2|} = 0
End Sub
End Class
</Document>
</Project>
</Workspace>
Dim expected =
<text>
Option Strict Off
Class Class1
Private field1 As Short
Private field2 As Integer
Public Sub New()
Me.field1 = 0
field2 = 0
End Sub
End Class
</text>
Await TestAsync(input, expected, DontQualifyMemberAccessWithThisOrMe)
End Function
#End Region
#Region "Helpers"
Shared DontPreferIntrinsicPredefinedTypeKeywordInDeclaration As Dictionary(Of OptionKey, Object) = New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic), False}}
Shared DontQualifyMemberAccessWithThisOrMe As Dictionary(Of OptionKey, Object) = New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.QualifyMemberAccessWithThisOrMe, LanguageNames.VisualBasic), False}}
#End Region
......
......@@ -16,16 +16,19 @@ namespace Microsoft.CodeAnalysis.CSharp.Diagnostics.SimplifyTypeNames
[DiagnosticAnalyzer(LanguageNames.CSharp)]
internal sealed class CSharpSimplifyTypeNamesDiagnosticAnalyzer : SimplifyTypeNamesDiagnosticAnalyzerBase<SyntaxKind>
{
private static readonly ImmutableArray<SyntaxKind> s_kindsOfInterest = ImmutableArray.Create(SyntaxKind.QualifiedName,
private static readonly SyntaxKind[] s_kindsOfInterest = new[]
{
SyntaxKind.QualifiedName,
SyntaxKind.AliasQualifiedName,
SyntaxKind.GenericName,
SyntaxKind.IdentifierName,
SyntaxKind.SimpleMemberAccessExpression,
SyntaxKind.QualifiedCref);
SyntaxKind.QualifiedCref
};
public override void Initialize(AnalysisContext analysisContext)
{
analysisContext.RegisterSyntaxNodeAction(AnalyzeNode, s_kindsOfInterest.ToArray());
analysisContext.RegisterSyntaxNodeAction(AnalyzeNode, s_kindsOfInterest);
}
protected override void AnalyzeNode(SyntaxNodeAnalysisContext context)
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Collections.Immutable
Imports System.Threading
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.Diagnostics.SimplifyTypeNames
......@@ -14,17 +13,20 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.SimplifyTypeNames
Friend NotInheritable Class VisualBasicSimplifyTypeNamesDiagnosticAnalyzer
Inherits SimplifyTypeNamesDiagnosticAnalyzerBase(Of SyntaxKind)
Private Shared ReadOnly s_kindsOfInterest As ImmutableArray(Of SyntaxKind) = ImmutableArray.Create(SyntaxKind.QualifiedName,
SyntaxKind.SimpleMemberAccessExpression,
SyntaxKind.IdentifierName,
SyntaxKind.GenericName)
Private Shared ReadOnly s_kindsOfInterest As SyntaxKind() =
{
SyntaxKind.QualifiedName,
SyntaxKind.SimpleMemberAccessExpression,
SyntaxKind.IdentifierName,
SyntaxKind.GenericName
}
Public Overrides Sub Initialize(context As AnalysisContext)
context.RegisterSyntaxNodeAction(AddressOf AnalyzeNode, s_kindsOfInterest.ToArray())
context.RegisterSyntaxNodeAction(AddressOf AnalyzeNode, s_kindsOfInterest)
End Sub
Protected Overrides Sub AnalyzeNode(context As SyntaxNodeAnalysisContext)
If context.Node.Ancestors(ascendOutOfTrivia:=False).Any(Function(n) IsNodeKindInteresting(n)) Then
If context.Node.Ancestors(ascendOutOfTrivia:=False).Any(AddressOf IsNodeKindInteresting) Then
' Already simplified an ancestor of this node.
Return
End If
......@@ -48,8 +50,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.SimplifyTypeNames
End Sub
Private Shared Function IsNodeKindInteresting(node As SyntaxNode) As Boolean
' PERF: Use dedicated EqualityComparer to avoid boxing of enums.
Return s_kindsOfInterest.IndexOf(node.Kind, startIndex:=0, equalityComparer:=SyntaxFacts.EqualityComparer) >= 0
Return s_kindsOfInterest.Contains(node.Kind)
End Function
Friend Shared Function IsCandidate(node As SyntaxNode) As Boolean
......
......@@ -538,7 +538,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities
If Me.OriginalSemanticModel.OptionStrict() <> OptionStrict.Off AndAlso
Me.SpeculativeSemanticModel.GetConstantValue(newExpression).HasValue Then
Dim newExpressionType = Me.SpeculativeSemanticModel.GetTypeInfo(newExpression).Type
Dim newExpressionType = Me.SpeculativeSemanticModel.GetTypeInfo(newExpression).ConvertedType
newConversion = Me.OriginalSemanticModel.Compilation.ClassifyConversion(newExpressionType, newTargetType)
End If
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册