public static async Task <Document> RefactorAsync(
            Document document,
            EnumMemberDeclarationSyntax enumMemberDeclaration,
            CancellationToken cancellationToken)
        {
            SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);

            IFieldSymbol enumMemberSymbol = semanticModel.GetDeclaredSymbol(enumMemberDeclaration, cancellationToken);

            ImmutableArray <EnumFieldSymbolInfo> infos = EnumFieldSymbolInfo.CreateRange(enumMemberSymbol.ContainingType);

            ExpressionSyntax value = enumMemberDeclaration.EqualsValue?.Value;

            var info = new EnumFieldSymbolInfo(enumMemberSymbol);

            List <EnumFieldSymbolInfo> values = info.Decompose(infos);

            values.Sort((f, g) =>
            {
                if (f.IsComposite())
                {
                    if (g.IsComposite())
                    {
                        return(((IComparable)f.Value).CompareTo((IComparable)g.Value));
                    }
                    else
                    {
                        return(-1);
                    }
                }
                else if (g.IsComposite())
                {
                    return(1);
                }

                return(((IComparable)f.Value).CompareTo((IComparable)g.Value));
            });

            BinaryExpressionSyntax newValue = BitwiseOrExpression(values[0].ToIdentifierName(), values[1].ToIdentifierName());

            for (int i = 2; i < values.Count; i++)
            {
                newValue = BitwiseOrExpression(newValue, values[i].ToIdentifierName());
            }

            newValue = newValue.WithFormatterAnnotation();

            return(await document.ReplaceNodeAsync(value, newValue, cancellationToken).ConfigureAwait(false));
        }
        public static void AnalyzeNamedType(SymbolAnalysisContext context)
        {
            var enumSymbol = (INamedTypeSymbol)context.Symbol;

            if (enumSymbol.TypeKind != TypeKind.Enum)
            {
                return;
            }

            if (!enumSymbol.HasAttribute(MetadataNames.System_FlagsAttribute))
            {
                return;
            }

            var infos = default(ImmutableArray <EnumFieldSymbolInfo>);

            foreach (ISymbol member in enumSymbol.GetMembers())
            {
                if (member is IFieldSymbol fieldSymbol)
                {
                    if (!fieldSymbol.HasConstantValue)
                    {
                        return;
                    }

                    var info = new EnumFieldSymbolInfo(fieldSymbol);

                    if (info.IsComposite())
                    {
                        var declaration = (EnumMemberDeclarationSyntax)info.Symbol.GetSyntax(context.CancellationToken);

                        ExpressionSyntax valueExpression = declaration.EqualsValue?.Value;

                        if (valueExpression != null &&
                            (valueExpression.IsKind(SyntaxKind.NumericLiteralExpression) ||
                             valueExpression
                             .DescendantNodes()
                             .Any(f => f.IsKind(SyntaxKind.NumericLiteralExpression))))
                        {
                            if (infos.IsDefault)
                            {
                                infos = EnumFieldSymbolInfo.CreateRange(enumSymbol);

                                if (infos.IsDefault)
                                {
                                    return;
                                }
                            }

                            List <EnumFieldSymbolInfo> values = info.Decompose(infos);

                            if (values?.Count > 1)
                            {
                                context.ReportDiagnostic(
                                    DiagnosticDescriptors.DeclareEnumValueAsCombinationOfNames,
                                    valueExpression);
                            }
                        }
                    }
                }
            }
        }