Public Function DecodeModifiers()

in src/Compilers/VisualBasic/Portable/Binding/Binder_Utils.vb [139:250]


        Public Function DecodeModifiers(syntax As SyntaxTokenList,
                                        allowableModifiers As SourceMemberFlags,
                                        errIdBadModifier As ERRID,
                                        defaultAccessibility As Accessibility,
                                        diagBag As DiagnosticBag) As MemberModifiers
            Dim foundModifiers As SourceMemberFlags = Nothing
            Dim privateProtectedToken As SyntaxToken = Nothing
            Dim privateOverridableModifier As SyntaxToken = Nothing
            Dim privateMustOverrideModifier As SyntaxToken = Nothing
            Dim privateNotOverridableModifier As SyntaxToken = Nothing

            
            For Each keywordSyntax In syntax
                Dim currentModifier As SourceMemberFlags = MapKeywordToFlag(keywordSyntax)

                If currentModifier = SourceMemberFlags.None Then
                    Continue For
                End If

                
                If (currentModifier And allowableModifiers) = 0 Then
                    ReportDiagnostic(diagBag, keywordSyntax, errIdBadModifier, keywordSyntax.ToString())
                ElseIf (currentModifier And foundModifiers) <> 0 Then
                    ReportDiagnostic(diagBag, keywordSyntax, ERRID.ERR_DuplicateSpecifier)
                ElseIf (currentModifier And SourceMemberFlags.AllAccessibilityModifiers) <> 0 AndAlso
                       (foundModifiers And SourceMemberFlags.AllAccessibilityModifiers) <> 0 AndAlso
                       Not ((foundModifiers Or currentModifier) And SourceMemberFlags.AllAccessibilityModifiers) = (SourceMemberFlags.Protected Or SourceMemberFlags.Friend) AndAlso
                       Not (((foundModifiers Or currentModifier) And SourceMemberFlags.AllAccessibilityModifiers) = (SourceMemberFlags.Protected Or SourceMemberFlags.Private)) Then
                    ReportDiagnostic(diagBag, keywordSyntax, ERRID.ERR_DuplicateAccessCategoryUsed)
                ElseIf (currentModifier And SourceMemberFlags.AllOverrideModifiers) <> 0 AndAlso
                       (foundModifiers And SourceMemberFlags.AllOverrideModifiers) <> 0 Then
                    ReportDiagnostic(diagBag, keywordSyntax, ERRID.ERR_DuplicateModifierCategoryUsed)
                ElseIf (currentModifier And SourceMemberFlags.AllWriteabilityModifiers) <> 0 AndAlso
                       (foundModifiers And SourceMemberFlags.AllWriteabilityModifiers) <> 0 Then
                    ReportDiagnostic(diagBag, keywordSyntax, ERRID.ERR_DuplicateWriteabilityCategoryUsed)
                ElseIf (currentModifier And SourceMemberFlags.AllConversionModifiers) <> 0 AndAlso
                       (foundModifiers And SourceMemberFlags.AllConversionModifiers) <> 0 Then
                    ReportDiagnostic(diagBag, keywordSyntax, ERRID.ERR_DuplicateConversionCategoryUsed)
                ElseIf (currentModifier And SourceMemberFlags.AllShadowingModifiers) <> 0 AndAlso
                       (foundModifiers And SourceMemberFlags.AllShadowingModifiers) <> 0 Then
                    ReportDiagnostic(diagBag, keywordSyntax, ERRID.ERR_BadSpecifierCombo2, "Overloads", "Shadows")
                ElseIf (currentModifier And (SourceMemberFlags.Overrides Or SourceMemberFlags.Overridable)) <> 0 AndAlso
                       (foundModifiers And (SourceMemberFlags.Overrides Or SourceMemberFlags.Overridable)) <> 0 Then
                    ReportDiagnostic(diagBag, keywordSyntax, ERRID.ERR_OverridesImpliesOverridable)
                ElseIf (currentModifier And SourceMemberFlags.PrivateOverridableModifiers) <> 0 AndAlso
                       (foundModifiers And SourceMemberFlags.PrivateOverridableModifiers) <> 0 Then
                    privateOverridableModifier = keywordSyntax
                    foundModifiers = foundModifiers Or currentModifier
                ElseIf (currentModifier And SourceMemberFlags.ShadowsAndOverrides) <> 0 AndAlso
                    (foundModifiers And SourceMemberFlags.ShadowsAndOverrides) <> 0 Then
                    ReportDiagnostic(diagBag, keywordSyntax, ERRID.ERR_BadSpecifierCombo2, "Overrides", "Shadows")
                ElseIf (currentModifier And SourceMemberFlags.PrivateMustOverrideModifiers) <> 0 AndAlso
                       (foundModifiers And SourceMemberFlags.PrivateMustOverrideModifiers) <> 0 Then
                    privateMustOverrideModifier = keywordSyntax
                    foundModifiers = foundModifiers Or currentModifier
                ElseIf (currentModifier And SourceMemberFlags.PrivateNotOverridableModifiers) <> 0 AndAlso
                       (foundModifiers And SourceMemberFlags.PrivateNotOverridableModifiers) <> 0 Then
                    privateNotOverridableModifier = keywordSyntax
                    foundModifiers = foundModifiers Or currentModifier
                ElseIf (currentModifier And (SourceMemberFlags.Iterator Or SourceMemberFlags.WriteOnly)) <> 0 AndAlso
                       (foundModifiers And (SourceMemberFlags.Iterator Or SourceMemberFlags.WriteOnly)) <> 0 Then
                    ReportDiagnostic(diagBag, keywordSyntax, ERRID.ERR_BadSpecifierCombo2, "Iterator", "WriteOnly")
                ElseIf (currentModifier And SourceMemberFlags.TypeInheritModifiers) <> 0 AndAlso
                       (foundModifiers And SourceMemberFlags.TypeInheritModifiers) <> 0 Then
                    ReportDiagnostic(diagBag, keywordSyntax, ERRID.ERR_BadSpecifierCombo2, "MustInherit", "NotInheritable")
                    
                    foundModifiers = foundModifiers Or currentModifier
                Else
                    If currentModifier = SourceMemberFlags.Private OrElse currentModifier = SourceMemberFlags.Protected Then
                        privateProtectedToken = keywordSyntax
                    End If
                    foundModifiers = foundModifiers Or currentModifier
                End If
            Next

            
            Dim access As Accessibility
            If (foundModifiers And SourceMemberFlags.Public) <> 0 Then
                access = Accessibility.Public
            ElseIf (foundModifiers And (SourceMemberFlags.Friend Or SourceMemberFlags.Protected)) = (SourceMemberFlags.Friend Or SourceMemberFlags.Protected) Then
                access = Accessibility.ProtectedOrFriend
            ElseIf (foundModifiers And (SourceMemberFlags.Private Or SourceMemberFlags.Protected)) = (SourceMemberFlags.Private Or SourceMemberFlags.Protected) Then
                access = Accessibility.ProtectedAndFriend
                InternalSyntax.Parser.CheckFeatureAvailability(
                    diagBag,
                    privateProtectedToken.GetLocation(),
                    DirectCast(privateProtectedToken.SyntaxTree, VisualBasicSyntaxTree).Options.LanguageVersion,
                    InternalSyntax.Feature.PrivateProtected)
            ElseIf (foundModifiers And SourceMemberFlags.Friend) <> 0 Then
                access = Accessibility.Friend
            ElseIf (foundModifiers And SourceMemberFlags.Protected) <> 0 Then
                access = Accessibility.Protected
            ElseIf (foundModifiers And SourceMemberFlags.Private) <> 0 Then
                access = Accessibility.Private
            Else
                access = defaultAccessibility
            End If

            If access = Accessibility.Private Then
                If (foundModifiers And SourceMemberFlags.Overridable) <> 0 Then
                    ReportDiagnostic(diagBag, privateOverridableModifier, ERRID.ERR_BadSpecifierCombo2, "Private", "Overridable")
                ElseIf (foundModifiers And SourceMemberFlags.MustOverride) <> 0 Then
                    ReportDiagnostic(diagBag, privateMustOverrideModifier, ERRID.ERR_BadSpecifierCombo2, "Private", "MustOverride")
                ElseIf (foundModifiers And SourceMemberFlags.NotOverridable) <> 0 Then
                    ReportDiagnostic(diagBag, privateNotOverridableModifier, ERRID.ERR_BadSpecifierCombo2, "Private", "NotOverridable")
                End If
                foundModifiers = foundModifiers And Not (SourceMemberFlags.Overridable Or SourceMemberFlags.MustOverride Or SourceMemberFlags.NotOverridable)
            End If

            
            Return New MemberModifiers(foundModifiers, DirectCast(access, SourceMemberFlags))
        End Function