Beispiel #1
0
        public static DeclarationModifiers ToDeclarationModifiers(
            this SyntaxTokenList modifiers, DiagnosticBag diagnostics, bool isOrdinaryMethod = false)
        {
            var  result           = DeclarationModifiers.None;
            bool seenNoDuplicates = true;

            for (int i = 0; i < modifiers.Count; i++)
            {
                SyntaxToken          modifier = modifiers[i];
                DeclarationModifiers one      = ToDeclarationModifier(modifier.ContextualKind());

                ReportDuplicateModifiers(
                    modifier, one, result,
                    ref seenNoDuplicates,
                    diagnostics);

                if (one == DeclarationModifiers.Partial && i < modifiers.Count - 1)
                {
                    // There was a bug where we allowed `partial async` at the end of modifiers on methods. We keep this behavior for backcompat.
                    if (!(isOrdinaryMethod && i == modifiers.Count - 2 && ToDeclarationModifier(modifiers[i + 1].ContextualKind()) == DeclarationModifiers.Async))
                    {
                        diagnostics.Add(
                            ErrorCode.ERR_PartialMisplaced,
                            modifier.GetLocation());
                    }
                }

                result |= one;
            }

            switch (result & DeclarationModifiers.AccessibilityMask)
            {
            case DeclarationModifiers.Protected | DeclarationModifiers.Internal:
                // the two keywords "protected" and "internal" together are treated as one modifier.
                result &= ~DeclarationModifiers.AccessibilityMask;
                result |= DeclarationModifiers.ProtectedInternal;
                break;

            case DeclarationModifiers.Private | DeclarationModifiers.Protected:
                // the two keywords "private" and "protected" together are treated as one modifier.
                result &= ~DeclarationModifiers.AccessibilityMask;
                result |= DeclarationModifiers.PrivateProtected;
                break;
            }

            return(result);
        }