File: VisualBasicSimplifyObjectCreationDiagnosticAnalyzer.vb
Web Access
Project: ..\..\..\src\CodeStyle\VisualBasic\Analyzers\Microsoft.CodeAnalysis.VisualBasic.CodeStyle.vbproj (Microsoft.CodeAnalysis.VisualBasic.CodeStyle)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
 
Imports Microsoft.CodeAnalysis.CodeStyle
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.VisualBasic.CodeStyle
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
 
Namespace Microsoft.CodeAnalysis.VisualBasic.SimplifyObjectCreation
    <DiagnosticAnalyzer(LanguageNames.VisualBasic)>
    Friend NotInheritable Class VisualBasicSimplifyObjectCreationDiagnosticAnalyzer
        Inherits AbstractBuiltInCodeStyleDiagnosticAnalyzer
 
        Public Sub New()
            MyBase.New(
                diagnosticId:=IDEDiagnosticIds.SimplifyObjectCreationDiagnosticId,
                enforceOnBuild:=EnforceOnBuildValues.SimplifyObjectCreation,
                [option]:=VisualBasicCodeStyleOptions.PreferSimplifiedObjectCreation,
                title:=New LocalizableResourceString(NameOf(VisualBasicAnalyzersResources.Object_creation_can_be_simplified), VisualBasicAnalyzersResources.ResourceManager, GetType(VisualBasicAnalyzersResources)))
        End Sub
 
        Protected Overrides Sub InitializeWorker(context As AnalysisContext)
            context.RegisterSyntaxNodeAction(AddressOf AnalyzeVariableDeclarator, SyntaxKind.VariableDeclarator)
        End Sub
 
        Public Overrides Function GetAnalyzerCategory() As DiagnosticAnalyzerCategory
            Return DiagnosticAnalyzerCategory.SemanticSpanAnalysis
        End Function
 
        Private Sub AnalyzeVariableDeclarator(context As SyntaxNodeAnalysisContext)
            ' Finds and reports syntax on the form:
            ' Dim x As SomeType = New SomeType()
            ' which can be simplified to
            ' Dim x As New SomeType()
 
            Dim styleOption = context.GetVisualBasicAnalyzerOptions().PreferSimplifiedObjectCreation
            If Not styleOption.Value Then
                Return
            End If
 
            Dim node = context.Node
            Dim variableDeclarator = DirectCast(node, VariableDeclaratorSyntax)
            Dim asClauseType = variableDeclarator.AsClause?.Type()
            If asClauseType Is Nothing Then
                Return
            End If
 
            Dim objectCreation = TryCast(variableDeclarator.Initializer?.Value, ObjectCreationExpressionSyntax)
            If objectCreation Is Nothing Then
                Return
            End If
 
            Dim cancellationToken = context.CancellationToken
            Dim symbolInfo = context.SemanticModel.GetTypeInfo(objectCreation, cancellationToken)
            If symbolInfo.Type IsNot Nothing AndAlso symbolInfo.Type.Equals(symbolInfo.ConvertedType, SymbolEqualityComparer.Default) Then
                context.ReportDiagnostic(DiagnosticHelper.Create(Descriptor, variableDeclarator.GetLocation(), styleOption.Notification.Severity,
                    additionalLocations:=Nothing,
                    properties:=Nothing))
            End If
        End Sub
    End Class
End Namespace