diff --git a/src/EditorFeatures/Test2/Simplification/CastSimplificationTests.vb b/src/EditorFeatures/Test2/Simplification/CastSimplificationTests.vb index 675a813d234633c4e666bbb5cb5b04d47b9cd5b2..1bbacde128e69f044c832eb402b823ae6d3cea52 100644 --- a/src/EditorFeatures/Test2/Simplification/CastSimplificationTests.vb +++ b/src/EditorFeatures/Test2/Simplification/CastSimplificationTests.vb @@ -8434,6 +8434,7 @@ End Class Await TestAsync(input, expected) End Function + Public Async Function TestVisualBasic_Remove_IntegerToByte_OptionStrictOff() As Task Dim input = @@ -8465,6 +8466,7 @@ End Class Await TestAsync(input, expected) End Function + Public Async Function TestVisualBasic_DontRemove_IntegerToByte_OptionStrictOn1() As Task Dim input = @@ -8496,6 +8498,7 @@ End Class Await TestAsync(input, expected) End Function + Public Async Function TestVisualBasic_DontRemove_IntegerToByte_OptionStrictOn2() As Task Dim input = @@ -8529,6 +8532,7 @@ End Class Await TestAsync(input, expected) End Function + Public Async Function TestVisualBasic_DontRemove_IntegerToByte_OptionStrictOn3() As Task Dim input = @@ -8562,6 +8566,7 @@ End Class Await TestAsync(input, expected) End Function + 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 diff --git a/src/EditorFeatures/Test2/Simplification/TypeNameSimplifierTest.vb b/src/EditorFeatures/Test2/Simplification/TypeNameSimplifierTest.vb index 8884d586a34af8f728e31482be50b99f6e82309b..bf05ede0f248db8fb9322161970ddaffcbd46328 100644 --- a/src/EditorFeatures/Test2/Simplification/TypeNameSimplifierTest.vb +++ b/src/EditorFeatures/Test2/Simplification/TypeNameSimplifierTest.vb @@ -4456,11 +4456,173 @@ End Class Await TestAsync(input, expected, DontPreferIntrinsicPredefinedTypeKeywordInDeclaration) End Function + + + + Public Async Function SimplifyMeRegardlessOfTypeAndOptionStrict1() As Task + Dim input = + + + +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 + + + + + Dim expected = + +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 + + + Await TestAsync(input, expected, DontQualifyMemberAccessWithThisOrMe) + End Function + + + + Public Async Function SimplifyMeRegardlessOfTypeAndOptionStrict2() As Task + Dim input = + + + +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 + + + + + Dim expected = + +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 + + + Await TestAsync(input, expected, DontQualifyMemberAccessWithThisOrMe) + End Function + + + + Public Async Function SimplifyMeRegardlessOfTypeAndOptionStrict3() As Task + Dim input = + + + +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 + + + + + Dim expected = + +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 + + + Await TestAsync(input, expected, DontQualifyMemberAccessWithThisOrMe) + End Function + + + + Public Async Function SimplifyMeRegardlessOfTypeAndOptionStrict4() As Task + Dim input = + + + +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 + + + + + Dim expected = + +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 + + + 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 diff --git a/src/Features/CSharp/Portable/Diagnostics/Analyzers/CSharpSimplifyTypeNamesDiagnosticAnalyzer.cs b/src/Features/CSharp/Portable/Diagnostics/Analyzers/CSharpSimplifyTypeNamesDiagnosticAnalyzer.cs index a0c868a49ca03d47caaa9bc5cadf2e065cd9e0db..4e09598d76920bf3cbf74c3a2bb9c44a47e58f6e 100644 --- a/src/Features/CSharp/Portable/Diagnostics/Analyzers/CSharpSimplifyTypeNamesDiagnosticAnalyzer.cs +++ b/src/Features/CSharp/Portable/Diagnostics/Analyzers/CSharpSimplifyTypeNamesDiagnosticAnalyzer.cs @@ -16,16 +16,19 @@ namespace Microsoft.CodeAnalysis.CSharp.Diagnostics.SimplifyTypeNames [DiagnosticAnalyzer(LanguageNames.CSharp)] internal sealed class CSharpSimplifyTypeNamesDiagnosticAnalyzer : SimplifyTypeNamesDiagnosticAnalyzerBase { - private static readonly ImmutableArray 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) diff --git a/src/Features/VisualBasic/Portable/Diagnostics/Analyzers/VisualBasicSimplifyTypeNamesDiagnosticAnalyzer.vb b/src/Features/VisualBasic/Portable/Diagnostics/Analyzers/VisualBasicSimplifyTypeNamesDiagnosticAnalyzer.vb index 735c3ab8163b19ae8ae5dd46eb4ea1c968a5b85f..10105a60cce0b407d0fa560feb4ee8dfda4477ea 100644 --- a/src/Features/VisualBasic/Portable/Diagnostics/Analyzers/VisualBasicSimplifyTypeNamesDiagnosticAnalyzer.vb +++ b/src/Features/VisualBasic/Portable/Diagnostics/Analyzers/VisualBasicSimplifyTypeNamesDiagnosticAnalyzer.vb @@ -1,6 +1,5 @@ ' 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 diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/SpeculationAnalyzer.vb b/src/Workspaces/VisualBasic/Portable/Utilities/SpeculationAnalyzer.vb index 43a529c61706275d795ffc8329d0e220b9ce2f26..a5f74682f2c9d5cf1d3ba76de5c90b923556e765 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/SpeculationAnalyzer.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/SpeculationAnalyzer.vb @@ -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