﻿' 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 System.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols

Namespace Microsoft.CodeAnalysis.VisualBasic
    Partial Friend NotInheritable Class DocumentationCommentIdVisitor
        Inherits VisualBasicSymbolVisitor(Of StringBuilder, Object)

        Public Shared ReadOnly Instance As New DocumentationCommentIdVisitor()

        Private Sub New()
        End Sub

        Public Overrides Function DefaultVisit(symbol As Symbol, builder As StringBuilder) As Object
            Return Nothing
        End Function

        Public Overrides Function VisitNamespace(symbol As NamespaceSymbol, builder As StringBuilder) As Object
            Return VisitSymbolUsingPrefix(symbol, builder, "N:")
        End Function

        Public Overrides Function VisitEvent(symbol As EventSymbol, builder As StringBuilder) As Object
            Return VisitSymbolUsingPrefix(symbol, builder, "E:")
        End Function

        Public Overrides Function VisitMethod(symbol As MethodSymbol, builder As StringBuilder) As Object
            Return VisitSymbolUsingPrefix(symbol, builder, "M:")
        End Function

        Public Overrides Function VisitField(symbol As FieldSymbol, builder As StringBuilder) As Object
            Return VisitSymbolUsingPrefix(symbol, builder, "F:")
        End Function

        Public Overrides Function VisitProperty(symbol As PropertySymbol, builder As StringBuilder) As Object
            Return VisitSymbolUsingPrefix(symbol, builder, "P:")
        End Function

        Public Overrides Function VisitNamedType(symbol As NamedTypeSymbol, builder As StringBuilder) As Object
            Return VisitSymbolUsingPrefix(symbol, builder, "T:")
        End Function

        Public Overrides Function VisitArrayType(symbol As ArrayTypeSymbol, builder As StringBuilder) As Object
            Return VisitSymbolUsingPrefix(symbol, builder, "T:")
        End Function

        Public Overrides Function VisitTypeParameter(symbol As TypeParameterSymbol, builder As StringBuilder) As Object
            Return VisitSymbolUsingPrefix(symbol, builder, "!:")
        End Function

        Public Overrides Function VisitErrorType(symbol As ErrorTypeSymbol, builder As StringBuilder) As Object
            Return VisitSymbolUsingPrefix(symbol, builder, "!:")
        End Function

        Private Shared Function VisitSymbolUsingPrefix(symbol As Symbol, builder As StringBuilder, prefix As String) As Object
            builder.Append(prefix)
            PartVisitor.Instance.Visit(symbol, builder)
            Return Nothing
        End Function

    End Class
End Namespace
