ErrorFactories.vb 7.9 KB
Newer Older
J
Jonathon Marolf 已提交
1 2 3
' 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.
P
Pilchie 已提交
4

5
Imports System.Collections.Immutable
P
Pilchie 已提交
6
Imports System.Globalization
T
TomasMatousek 已提交
7
Imports System.Reflection
P
Pilchie 已提交
8
Imports Microsoft.CodeAnalysis.Collections
T
Tomas Matousek 已提交
9
Imports Microsoft.CodeAnalysis.PooledObjects
P
Pilchie 已提交
10 11 12 13 14
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols

Namespace Microsoft.CodeAnalysis.VisualBasic

    Friend Class ErrorFactory
15

16 17 18 19
        Private Const s_titleSuffix As String = "_Title"
        Private Const s_descriptionSuffix As String = "_Description"
        Private Shared ReadOnly s_helpLinksMap As Lazy(Of ImmutableDictionary(Of ERRID, String)) = New Lazy(Of ImmutableDictionary(Of ERRID, String))(AddressOf CreateHelpLinks)
        Private Shared ReadOnly s_categoriesMap As Lazy(Of ImmutableDictionary(Of ERRID, String)) = New Lazy(Of ImmutableDictionary(Of ERRID, String))(AddressOf CreateCategoriesMap)
20 21 22 23 24 25 26 27 28

        Private Shared Function CreateHelpLinks() As ImmutableDictionary(Of ERRID, String)
            Dim map = New Dictionary(Of ERRID, String) From
                {   '  { ERROR_CODE,    HELP_LINK }
                }

            Return map.ToImmutableDictionary
        End Function

29 30 31 32 33 34 35 36
        Private Shared Function CreateCategoriesMap() As ImmutableDictionary(Of ERRID, String)
            Dim map = New Dictionary(Of ERRID, String) From
                {   '  { ERROR_CODE,    CATEGORY }
                }

            Return map.ToImmutableDictionary
        End Function

P
Pilchie 已提交
37 38 39 40 41
        Public Shared ReadOnly EmptyErrorInfo As DiagnosticInfo = ErrorInfo(0)

        Public Shared ReadOnly VoidDiagnosticInfo As DiagnosticInfo = ErrorInfo(ERRID.Void)

        Public Shared ReadOnly GetErrorInfo_ERR_WithEventsRequiresClass As Func(Of DiagnosticInfo) =
T
TomasMatousek 已提交
42
            Function() ErrorInfo(ERRID.ERR_WithEventsRequiresClass)
P
Pilchie 已提交
43 44

        Public Shared ReadOnly GetErrorInfo_ERR_StrictDisallowImplicitObject As Func(Of DiagnosticInfo) =
T
TomasMatousek 已提交
45
            Function() ErrorInfo(ERRID.ERR_StrictDisallowImplicitObject)
P
Pilchie 已提交
46 47

        Public Shared ReadOnly GetErrorInfo_WRN_ObjectAssumedVar1_WRN_StaticLocalNoInference As Func(Of DiagnosticInfo) =
T
TomasMatousek 已提交
48
            Function() ErrorInfo(ERRID.WRN_ObjectAssumedVar1, ErrorInfo(ERRID.WRN_StaticLocalNoInference))
P
Pilchie 已提交
49 50

        Public Shared ReadOnly GetErrorInfo_WRN_ObjectAssumedVar1_WRN_MissingAsClauseinVarDecl As Func(Of DiagnosticInfo) =
T
TomasMatousek 已提交
51
            Function() ErrorInfo(ERRID.WRN_ObjectAssumedVar1, ErrorInfo(ERRID.WRN_MissingAsClauseinVarDecl))
P
Pilchie 已提交
52 53

        Public Shared ReadOnly GetErrorInfo_ERR_StrictDisallowsImplicitProc As Func(Of DiagnosticInfo) =
T
TomasMatousek 已提交
54
            Function() ErrorInfo(ERRID.ERR_StrictDisallowsImplicitProc)
P
Pilchie 已提交
55 56

        Public Shared ReadOnly GetErrorInfo_ERR_StrictDisallowsImplicitArgs As Func(Of DiagnosticInfo) =
T
TomasMatousek 已提交
57
            Function() ErrorInfo(ERRID.ERR_StrictDisallowsImplicitArgs)
P
Pilchie 已提交
58 59

        Public Shared ReadOnly GetErrorInfo_WRN_ObjectAssumed1_WRN_MissingAsClauseinFunction As Func(Of DiagnosticInfo) =
T
TomasMatousek 已提交
60
            Function() ErrorInfo(ERRID.WRN_ObjectAssumed1, ErrorInfo(ERRID.WRN_MissingAsClauseinFunction))
P
Pilchie 已提交
61 62

        Public Shared ReadOnly GetErrorInfo_WRN_ObjectAssumed1_WRN_MissingAsClauseinOperator As Func(Of DiagnosticInfo) =
T
TomasMatousek 已提交
63
            Function() ErrorInfo(ERRID.WRN_ObjectAssumed1, ErrorInfo(ERRID.WRN_MissingAsClauseinOperator))
P
Pilchie 已提交
64 65

        Public Shared ReadOnly GetErrorInfo_WRN_ObjectAssumedProperty1_WRN_MissingAsClauseinProperty As Func(Of DiagnosticInfo) =
T
TomasMatousek 已提交
66
            Function() ErrorInfo(ERRID.WRN_ObjectAssumedProperty1, ErrorInfo(ERRID.WRN_MissingAsClauseinProperty))
P
Pilchie 已提交
67

P
Pharring 已提交
68 69 70 71
        Public Shared Function ErrorInfo(id As ERRID) As DiagnosticInfo
            Return New DiagnosticInfo(MessageProvider.Instance, id)
        End Function

P
Pilchie 已提交
72 73 74 75 76
        Public Shared Function ErrorInfo(id As ERRID, ParamArray arguments As Object()) As DiagnosticInfo
            Return New DiagnosticInfo(MessageProvider.Instance, id, arguments)
        End Function

        Public Shared Function ErrorInfo(id As ERRID, ByRef syntaxToken As SyntaxToken) As DiagnosticInfo
77
            Return ErrorInfo(id, SyntaxFacts.GetText(syntaxToken.Kind))
P
Pilchie 已提交
78 79 80 81 82 83 84
        End Function

        Public Shared Function ErrorInfo(id As ERRID, ByRef syntaxTokenKind As SyntaxKind) As DiagnosticInfo
            Return ErrorInfo(id, SyntaxFacts.GetText(syntaxTokenKind))
        End Function

        Public Shared Function ErrorInfo(id As ERRID, ByRef syntaxToken As SyntaxToken, type As TypeSymbol) As DiagnosticInfo
85
            Return ErrorInfo(id, SyntaxFacts.GetText(syntaxToken.Kind), type)
P
Pilchie 已提交
86 87 88
        End Function

        Public Shared Function ErrorInfo(id As ERRID, ByRef syntaxToken As SyntaxToken, type1 As TypeSymbol, type2 As TypeSymbol) As DiagnosticInfo
89
            Return ErrorInfo(id, SyntaxFacts.GetText(syntaxToken.Kind), type1, type2)
P
Pilchie 已提交
90 91
        End Function

T
TomasMatousek 已提交
92 93
        Private Shared s_resourceManager As Resources.ResourceManager
        Friend Shared ReadOnly Property ResourceManager As Resources.ResourceManager
P
Pilchie 已提交
94 95
            Get
                If s_resourceManager Is Nothing Then
96
                    s_resourceManager = New Resources.ResourceManager(GetType(VBResources).FullName, GetType(ERRID).GetTypeInfo().Assembly)
P
Pilchie 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
                End If

                Return s_resourceManager
            End Get
        End Property

        'The function is a gigantic num->string switch, so verifying it is not interesting, but expensive.
        Friend Shared Function IdToString(id As ERRID) As String
            Return IdToString(id, CultureInfo.CurrentUICulture)
        End Function

        'The function is a gigantic num->string switch, so verifying it is not interesting, but expensive.
        Public Shared Function IdToString(id As ERRID, language As CultureInfo) As String
            Return ResourceManager.GetString(id.ToString(), language)
        End Function

113 114 115 116 117
        Public Shared Function GetMessageFormat(id As ERRID) As LocalizableResourceString
            Return New LocalizableResourceString(id.ToString(), ResourceManager, GetType(ErrorFactory))
        End Function

        Public Shared Function GetTitle(id As ERRID) As LocalizableResourceString
118
            Return New LocalizableResourceString(id.ToString() + s_titleSuffix, ResourceManager, GetType(ErrorFactory))
119 120 121
        End Function

        Public Shared Function GetDescription(id As ERRID) As LocalizableResourceString
122
            Return New LocalizableResourceString(id.ToString() + s_descriptionSuffix, ResourceManager, GetType(ErrorFactory))
123 124 125 126
        End Function

        Public Shared Function GetHelpLink(id As ERRID) As String
            Dim helpLink As String = Nothing
127
            If s_helpLinksMap.Value.TryGetValue(id, helpLink) Then
128 129 130 131 132
                Return helpLink
            End If

            Return String.Empty
        End Function
133 134 135

        Public Shared Function GetCategory(id As ERRID) As String
            Dim category As String = Nothing
136
            If s_categoriesMap.Value.TryGetValue(id, category) Then
137 138 139 140 141
                Return category
            End If

            Return Diagnostic.CompilerDiagnosticCategory
        End Function
P
Pilchie 已提交
142 143 144 145 146 147 148 149 150 151 152 153 154
    End Class


    ''' <summary>
    ''' Concatenates messages for a set of DiagnosticInfo.
    ''' </summary>
    Friend Class CompoundDiagnosticInfo
        Inherits DiagnosticInfo

        Friend Sub New(arguments As DiagnosticInfo())
            MyBase.New(VisualBasic.MessageProvider.Instance, 0, arguments)
        End Sub

M
manishv 已提交
155
        Public Overrides Function GetMessage(Optional formatProvider As IFormatProvider = Nothing) As String
P
Pilchie 已提交
156 157 158 159
            Dim builder = PooledStringBuilder.GetInstance()

            If Arguments IsNot Nothing Then
                For Each info As DiagnosticInfo In Arguments
160
                    builder.Builder.Append(info.GetMessage(formatProvider))
P
Pilchie 已提交
161 162 163 164 165 166 167 168 169 170 171
                Next
            End If

            Dim message = builder.Builder.ToString()
            builder.Free()

            Return message
        End Function
    End Class

End Namespace