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