' 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.VisualBasic.Symbols

Namespace Microsoft.CodeAnalysis.VisualBasic

    ''' <summary>
    ''' This class associates a symbol with particular custom format for display.
    ''' It can be passed as an argument for an error message in place where symbol display should go, 
    ''' which allows to defer building strings and doing many other things (like loading metadata) 
    ''' associated with that until the error message is actually requested.
    ''' </summary>
    Friend Class CustomSymbolDisplayFormatter
        Friend Shared ReadOnly QualifiedNameFormat As SymbolDisplayFormat = New SymbolDisplayFormat(
                                                                        globalNamespaceStyle:=SymbolDisplayGlobalNamespaceStyle.Omitted,
                                                                        typeQualificationStyle:=SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces,
                                                                        genericsOptions:=SymbolDisplayGenericsOptions.IncludeTypeParameters,
                                                                        memberOptions:=SymbolDisplayMemberOptions.IncludeParameters Or
                                                                                        SymbolDisplayMemberOptions.IncludeContainingType,
                                                                        parameterOptions:=SymbolDisplayParameterOptions.IncludeName Or
                                                                                            SymbolDisplayParameterOptions.IncludeType Or
                                                                                            SymbolDisplayParameterOptions.IncludeParamsRefOut Or
                                                                                            SymbolDisplayParameterOptions.IncludeDefaultValue,
                                                                        miscellaneousOptions:=SymbolDisplayMiscellaneousOptions.EscapeKeywordIdentifiers Or
                                                                                                SymbolDisplayMiscellaneousOptions.UseSpecialTypes)

        Friend Shared ReadOnly WithContainingTypeFormat As SymbolDisplayFormat = New SymbolDisplayFormat(
                                                                        globalNamespaceStyle:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.GlobalNamespaceStyle,
                                                                        typeQualificationStyle:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.TypeQualificationStyle,
                                                                        genericsOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.GenericsOptions,
                                                                        memberOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.MemberOptions Or
                                                                                        SymbolDisplayMemberOptions.IncludeContainingType,
                                                                        kindOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.KindOptions,
                                                                        parameterOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.ParameterOptions,
                                                                        miscellaneousOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.MiscellaneousOptions)

        Friend Shared ReadOnly ErrorMessageFormatNoModifiersNoReturnType As New SymbolDisplayFormat(
                                                            globalNamespaceStyle:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.GlobalNamespaceStyle,
                                                            typeQualificationStyle:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.TypeQualificationStyle,
                                                            genericsOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.GenericsOptions,
                                                            memberOptions:=SymbolDisplayMemberOptions.IncludeContainingType Or
                                                                           SymbolDisplayMemberOptions.IncludeExplicitInterface Or
                                                                           SymbolDisplayMemberOptions.IncludeParameters,
                                                            parameterOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.ParameterOptions,
                                                            propertyStyle:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.PropertyStyle,
                                                            localOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.LocalOptions,
                                                            kindOptions:=SymbolDisplayKindOptions.None,
                                                            miscellaneousOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.MiscellaneousOptions)

        Friend Shared ReadOnly ErrorNameWithKindFormat As New SymbolDisplayFormat(
                                                            globalNamespaceStyle:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.GlobalNamespaceStyle,
                                                            typeQualificationStyle:=SymbolDisplayTypeQualificationStyle.NameOnly,
                                                            genericsOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.GenericsOptions,
                                                            memberOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.MemberOptions,
                                                            parameterOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.ParameterOptions,
                                                            propertyStyle:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.PropertyStyle,
                                                            localOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.LocalOptions,
                                                            kindOptions:=SymbolDisplayKindOptions.IncludeTypeKeyword Or SymbolDisplayKindOptions.IncludeNamespaceKeyword,
                                                            miscellaneousOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.MiscellaneousOptions)

        ' vb error format + complete signature for delegates instead of just the name.
        Friend Shared ReadOnly DelegateSignatureFormat As New SymbolDisplayFormat(
                                                            globalNamespaceStyle:=SymbolDisplayFormat.VisualBasicShortErrorMessageFormat.GlobalNamespaceStyle,
                                                            typeQualificationStyle:=SymbolDisplayFormat.VisualBasicShortErrorMessageFormat.TypeQualificationStyle,
                                                            genericsOptions:=SymbolDisplayFormat.VisualBasicShortErrorMessageFormat.GenericsOptions,
                                                            memberOptions:=SymbolDisplayFormat.VisualBasicShortErrorMessageFormat.MemberOptions,
                                                            parameterOptions:=SymbolDisplayFormat.VisualBasicShortErrorMessageFormat.ParameterOptions,
                                                            propertyStyle:=SymbolDisplayFormat.VisualBasicShortErrorMessageFormat.PropertyStyle,
                                                            localOptions:=SymbolDisplayFormat.VisualBasicShortErrorMessageFormat.LocalOptions,
                                                            kindOptions:=SymbolDisplayKindOptions.IncludeTypeKeyword Or SymbolDisplayKindOptions.IncludeNamespaceKeyword,
                                                            delegateStyle:=SymbolDisplayDelegateStyle.NameAndSignature,
                                                            miscellaneousOptions:=SymbolDisplayFormat.VisualBasicErrorMessageFormat.MiscellaneousOptions)

        ' Like Short format, but includes type arguments 
        Friend Shared ReadOnly ShortWithTypeArgsFormat As New SymbolDisplayFormat(
                                                            globalNamespaceStyle:=SymbolDisplayFormat.ShortFormat.GlobalNamespaceStyle,
                                                            typeQualificationStyle:=SymbolDisplayFormat.ShortFormat.TypeQualificationStyle,
                                                            genericsOptions:=SymbolDisplayGenericsOptions.IncludeTypeParameters,
                                                            memberOptions:=SymbolDisplayFormat.ShortFormat.MemberOptions,
                                                            parameterOptions:=SymbolDisplayFormat.ShortFormat.ParameterOptions,
                                                            propertyStyle:=SymbolDisplayFormat.ShortFormat.PropertyStyle,
                                                            localOptions:=SymbolDisplayFormat.ShortFormat.LocalOptions,
                                                            kindOptions:=SymbolDisplayFormat.ShortFormat.KindOptions,
                                                            miscellaneousOptions:=SymbolDisplayFormat.ShortFormat.MiscellaneousOptions)

        ' Like Short format, but includes type arguments and containing types
        Friend Shared ReadOnly ShortWithTypeArgsAndContainingTypesFormat As New SymbolDisplayFormat(
                                                            globalNamespaceStyle:=SymbolDisplayFormat.ShortFormat.GlobalNamespaceStyle,
                                                            typeQualificationStyle:=SymbolDisplayTypeQualificationStyle.NameAndContainingTypes,
                                                            genericsOptions:=SymbolDisplayGenericsOptions.IncludeTypeParameters,
                                                            memberOptions:=SymbolDisplayFormat.ShortFormat.MemberOptions,
                                                            parameterOptions:=SymbolDisplayFormat.ShortFormat.ParameterOptions,
                                                            propertyStyle:=SymbolDisplayFormat.ShortFormat.PropertyStyle,
                                                            localOptions:=SymbolDisplayFormat.ShortFormat.LocalOptions,
                                                            kindOptions:=SymbolDisplayFormat.ShortFormat.KindOptions,
                                                            miscellaneousOptions:=SymbolDisplayFormat.ShortFormat.MiscellaneousOptions)

        Public Shared Function QualifiedName(symbol As Symbol) As FormattedSymbol
            Return New FormattedSymbol(symbol, QualifiedNameFormat)
        End Function

        Public Shared Function WithContainingType(symbol As Symbol) As FormattedSymbol
            Return New FormattedSymbol(symbol, WithContainingTypeFormat)
        End Function

        Public Shared Function ErrorNameWithKind(symbol As Symbol) As FormattedSymbol
            Return New FormattedSymbol(symbol, ErrorNameWithKindFormat)
        End Function

        Public Shared Function ShortErrorName(symbol As Symbol) As FormattedSymbol
            Return New FormattedSymbol(symbol, SymbolDisplayFormat.ShortFormat)
        End Function

        Public Shared Function DelegateSignature(symbol As Symbol) As FormattedSymbol
            Return New FormattedSymbol(symbol, DelegateSignatureFormat)
        End Function

        Public Shared Function ShortNameWithTypeArgs(symbol As Symbol) As FormattedSymbol
            Return New FormattedSymbol(symbol, ShortWithTypeArgsFormat)
        End Function

        Public Shared Function ShortNameWithTypeArgsAndContainingTypes(symbol As Symbol) As FormattedSymbol
            Return New FormattedSymbol(symbol, ShortWithTypeArgsAndContainingTypesFormat)
        End Function

        Public Shared Function DefaultErrorFormat(symbol As Symbol) As FormattedSymbol
            Return New FormattedSymbol(symbol, SymbolDisplayFormat.VisualBasicErrorMessageFormat)
        End Function
    End Class
End Namespace
