Exemple #1
0
        public static void ComputeRefactoring(
            RefactoringContext context,
            EnumDeclarationSyntax enumDeclaration,
            SeparatedSyntaxListSelection <EnumMemberDeclarationSyntax> selection,
            SemanticModel semanticModel)
        {
            INamedTypeSymbol enumSymbol = semanticModel.GetDeclaredSymbol(enumDeclaration, context.CancellationToken);

            if (enumSymbol?.IsEnumWithFlagsAttribute(semanticModel) == true)
            {
                object[] constantValues = selection
                                          .Select(f => semanticModel.GetDeclaredSymbol(f, context.CancellationToken))
                                          .Where(f => f.HasConstantValue)
                                          .Select(f => f.ConstantValue)
                                          .ToArray();

                object combinedValue = GetCombinedValue(constantValues, enumSymbol);

                if (combinedValue != null &&
                    !IsValueDefined(enumSymbol, combinedValue))
                {
                    string name = NameGenerator.Default.EnsureUniqueEnumMemberName(
                        string.Concat(selection.Select(f => f.Identifier.ValueText)),
                        enumSymbol);

                    EnumMemberDeclarationSyntax newEnumMember = CreateEnumMember(name, selection.SelectedItems);

                    int insertIndex = selection.EndIndex + 1;

                    context.RegisterRefactoring(
                        $"Generate enum member '{name}'",
                        cancellationToken => RefactorAsync(context.Document, enumDeclaration, newEnumMember, insertIndex, cancellationToken));
                }
            }
        }
        public static void ComputeRefactoring(
            RefactoringContext context,
            EnumDeclarationSyntax enumDeclaration,
            SeparatedSyntaxListSelection <EnumMemberDeclarationSyntax> selectedMembers,
            SemanticModel semanticModel)
        {
            INamedTypeSymbol enumSymbol = semanticModel.GetDeclaredSymbol(enumDeclaration, context.CancellationToken);

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

            ImmutableArray <ulong> constantValues = selectedMembers
                                                    .Select(f => semanticModel.GetDeclaredSymbol(f, context.CancellationToken))
                                                    .Where(f => f.HasConstantValue)
                                                    .Select(f => SymbolUtility.GetEnumValueAsUInt64(f.ConstantValue, enumSymbol))
                                                    .ToImmutableArray();

            Optional <ulong> optionalValue = FlagsUtility <ulong> .Instance.TryCompose(constantValues);

            if (!optionalValue.HasValue)
            {
                return;
            }

            if (IsValueDefined(enumSymbol, optionalValue))
            {
                return;
            }

            string name = NameGenerator.Default.EnsureUniqueMemberName(
                string.Concat(selectedMembers.Select(f => f.Identifier.ValueText)),
                enumSymbol);

            context.RegisterRefactoring(
                $"Generate enum member '{name}'",
                ct => RefactorAsync(context.Document, enumDeclaration, selectedMembers, name, ct),
                RefactoringIdentifiers.GenerateCombinedEnumMember);
        }
Exemple #3
0
        public static void ComputeRefactoring(
            RefactoringContext context,
            EnumDeclarationSyntax enumDeclaration,
            SeparatedSyntaxListSelection <EnumMemberDeclarationSyntax> selectedMembers,
            SemanticModel semanticModel)
        {
            if (!enumDeclaration.AttributeLists.Any())
            {
                return;
            }

            INamedTypeSymbol enumSymbol = semanticModel.GetDeclaredSymbol(enumDeclaration, context.CancellationToken);

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

            IEnumerable <(IFieldSymbol symbol, ulong value)> symbolsValues = selectedMembers
                                                                             .Select(f => semanticModel.GetDeclaredSymbol(f, context.CancellationToken))
                                                                             .Where(f => f.HasConstantValue)
                                                                             .Select(f => (symbol: f, value: SymbolUtility.GetEnumValueAsUInt64(f.ConstantValue, enumSymbol)))
                                                                             .Where(f => !FlagsUtility <ulong> .Instance.IsComposite(f.value));

            ImmutableArray <ulong> constantValues = symbolsValues.Select(f => f.value).ToImmutableArray();

            if (constantValues.Length <= 1)
            {
                return;
            }

            Optional <ulong> optionalValue = FlagsUtility <ulong> .Instance.TryCompose(constantValues);

            if (!optionalValue.HasValue)
            {
                return;
            }

            if (IsValueDefined(optionalValue))
            {
                return;
            }

            string name = NameGenerator.Default.EnsureUniqueEnumMemberName(
                string.Concat(symbolsValues.Select(f => f.symbol.Name)),
                enumSymbol);

            context.RegisterRefactoring(
                $"Generate member '{name}'",
                ct => RefactorAsync(context.Document, enumDeclaration, selectedMembers, enumSymbol, name, semanticModel, ct),
                RefactoringIdentifiers.GenerateCombinedEnumMember);

            bool IsValueDefined(object value)
            {
                foreach (ISymbol member in enumSymbol.GetMembers())
                {
                    if (member.Kind == SymbolKind.Field)
                    {
                        var fieldSymbol = (IFieldSymbol)member;

                        if (fieldSymbol.HasConstantValue &&
                            object.Equals(fieldSymbol.ConstantValue, value))
                        {
                            return(true);
                        }
                    }
                }

                return(false);
            }
        }