Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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);
 }