internal static DeclarationModifiers CheckModifiers( DeclarationModifiers modifiers, DeclarationModifiers allowedModifiers, Location errorLocation, BindingDiagnosticBag diagnostics, SyntaxTokenList?modifierTokens, out bool modifierErrors) { modifierErrors = false; DeclarationModifiers reportStaticNotVirtualForModifiers = DeclarationModifiers.None; if ((modifiers & allowedModifiers & DeclarationModifiers.Static) != 0) { reportStaticNotVirtualForModifiers = allowedModifiers & (DeclarationModifiers.Override | DeclarationModifiers.Virtual); allowedModifiers &= ~reportStaticNotVirtualForModifiers; } DeclarationModifiers errorModifiers = modifiers & ~allowedModifiers; DeclarationModifiers result = modifiers & allowedModifiers; while (errorModifiers != DeclarationModifiers.None) { DeclarationModifiers oneError = errorModifiers & ~(errorModifiers - 1); Debug.Assert(oneError != DeclarationModifiers.None); errorModifiers = errorModifiers & ~oneError; switch (oneError) { case DeclarationModifiers.Partial: // Provide a specialized error message in the case of partial. ReportPartialError(errorLocation, diagnostics, modifierTokens); break; case DeclarationModifiers.Override: case DeclarationModifiers.Virtual: if ((reportStaticNotVirtualForModifiers & oneError) == 0) { goto default; } diagnostics.Add(ErrorCode.ERR_StaticNotVirtual, errorLocation, ModifierUtils.ConvertSingleModifierToSyntaxText(oneError)); break; default: diagnostics.Add(ErrorCode.ERR_BadMemberFlag, errorLocation, ConvertSingleModifierToSyntaxText(oneError)); break; } modifierErrors = true; } if ((result & DeclarationModifiers.PrivateProtected) != 0) { modifierErrors |= !Binder.CheckFeatureAvailability(errorLocation.SourceTree, MessageID.IDS_FeaturePrivateProtected, diagnostics, errorLocation); } return(result); }
static bool reportBadMemberFlagIfAny(DeclarationModifiers result, DeclarationModifiers modifier, BindingDiagnosticBag diagnostics, SourceLocation errorLocation) { if ((result & modifier) != 0) { // The modifier '{0}' is not valid for this item diagnostics.Add(ErrorCode.ERR_BadMemberFlag, errorLocation, ModifierUtils.ConvertSingleModifierToSyntaxText(modifier)); return(true); } return(false); }