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); }