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