private void Analyze(SyntaxNodeAnalysisContext context)
        {
            if (GeneratedCodeAnalyzer?.IsGeneratedCode(context) == true)
            {
                return;
            }

            var lambda = (ParenthesizedLambdaExpressionSyntax)context.Node;

            ParameterListSyntax parameterList = lambda.ParameterList;

            if (parameterList != null)
            {
                SeparatedSyntaxList <ParameterSyntax> parameters = parameterList.Parameters;

                if (parameters.Count == 1)
                {
                    ParameterSyntax parameter = parameters[0];

                    if (parameter.Modifiers.Count == 0 &&
                        parameter.AttributeLists.Count == 0 &&
                        parameter.Default == null)
                    {
                        Analyze(context, parameterList);
                    }
                }
                else if (parameters.Count > 1)
                {
                    if (parameters.All(parameter => parameter.Modifiers.Count == 0 &&
                                       parameter.AttributeLists.Count == 0 &&
                                       parameter.Default == null &&
                                       parameter.Type?.IsMissing == false))
                    {
                        Analyze(context, parameterList);
                    }
                }
            }
        }
예제 #2
0
        public static void ComputeRefactoring(
            RefactoringContext context,
            EnumDeclarationSyntax enumDeclaration,
            SemanticModel semanticModel)
        {
            SeparatedSyntaxList <EnumMemberDeclarationSyntax> members = enumDeclaration.Members;

            if (!members.Any())
            {
                return;
            }

            if (members.All(f => f.EqualsValue?.Value == null))
            {
                return;
            }

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

            bool isFlags = enumSymbol.HasAttribute(MetadataNames.System_FlagsAttribute);

            if (!AreNewValuesDifferentFromExistingValues())
            {
                return;
            }

            Document document = context.Document;

            context.RegisterRefactoring(
                "Declare explicit values (overwrite existing values)",
                ct => RefactorAsync(document, enumDeclaration, enumSymbol, semanticModel, ct),
                EquivalenceKey);

            bool AreNewValuesDifferentFromExistingValues()
            {
                ulong value = 0;

                foreach (EnumMemberDeclarationSyntax member in enumDeclaration.Members)
                {
                    IFieldSymbol fieldSymbol = semanticModel.GetDeclaredSymbol(member, context.CancellationToken);

                    EnumFieldSymbolInfo fieldSymbolInfo = EnumFieldSymbolInfo.Create(fieldSymbol);

                    if (!fieldSymbolInfo.HasValue)
                    {
                        return(true);
                    }

                    if (isFlags &&
                        fieldSymbolInfo.HasCompositeValue())
                    {
                        continue;
                    }

                    if (value != fieldSymbolInfo.Value)
                    {
                        return(true);
                    }

                    if (isFlags)
                    {
                        value = (value == 0) ? 1 : value * 2;
                    }
                    else
                    {
                        value++;
                    }

                    if (!ConvertHelpers.CanConvertFromUInt64(value, enumSymbol.EnumUnderlyingType.SpecialType))
                    {
                        return(false);
                    }
                }

                return(false);
            }
        }
예제 #3
0
        public static async Task ComputeRefactoringsAsync(RefactoringContext context, InitializerExpressionSyntax initializer)
        {
            if (initializer.IsKind(SyntaxKind.ComplexElementInitializerExpression) &&
                initializer.IsParentKind(SyntaxKind.CollectionInitializerExpression))
            {
                initializer = (InitializerExpressionSyntax)initializer.Parent;
            }

            if (context.Span.IsEmptyAndContainedInSpanOrBetweenSpans(initializer) ||
                context.Span.IsEmptyAndContainedInSpanOrBetweenSpans(initializer.Expressions))
            {
                SeparatedSyntaxList <ExpressionSyntax> expressions = initializer.Expressions;

                if (context.IsRefactoringEnabled(RefactoringDescriptors.WrapInitializerExpressions) &&
                    expressions.Any() &&
                    !initializer.IsKind(SyntaxKind.ComplexElementInitializerExpression) &&
                    initializer.IsParentKind(
                        SyntaxKind.ArrayCreationExpression,
                        SyntaxKind.ImplicitArrayCreationExpression,
                        SyntaxKind.ObjectCreationExpression,
                        SyntaxKind.CollectionInitializerExpression,
                        SyntaxKind.WithExpression))
                {
                    if (initializer.IsSingleLine(includeExteriorTrivia: false))
                    {
                        context.RegisterRefactoring(
                            "Wrap initializer expression",
                            ct => SyntaxFormatter.ToMultiLineAsync(context.Document, initializer, ct),
                            RefactoringDescriptors.WrapInitializerExpressions);
                    }
                    else if (expressions.All(expression => expression.IsSingleLine()) &&
                             initializer.DescendantTrivia(initializer.Span).All(f => f.IsWhitespaceOrEndOfLineTrivia()))
                    {
                        context.RegisterRefactoring(
                            "Unwrap initializer expressions",
                            ct => SyntaxFormatter.ToSingleLineAsync(
                                context.Document,
                                initializer.Parent,
                                TextSpan.FromBounds(initializer.OpenBraceToken.GetPreviousToken().Span.End, initializer.CloseBraceToken.Span.End),
                                ct),
                            RefactoringDescriptors.WrapInitializerExpressions);
                    }
                }

                if (context.IsRefactoringEnabled(RefactoringDescriptors.AddAllPropertiesToInitializer) &&
                    initializer.IsKind(SyntaxKind.ObjectInitializerExpression, SyntaxKind.WithInitializerExpression) &&
                    AddAllPropertiesToInitializerRefactoring.IsApplicableSpan(initializer, context.Span))
                {
                    SemanticModel semanticModdel = await context.GetSemanticModelAsync().ConfigureAwait(false);

                    AddAllPropertiesToInitializerRefactoring.ComputeRefactorings(context, initializer, semanticModdel);
                }

                await ExpandInitializerRefactoring.ComputeRefactoringsAsync(context, initializer).ConfigureAwait(false);

                if (context.IsRefactoringEnabled(RefactoringDescriptors.UseIndexInitializer) &&
                    context.SupportsCSharp6)
                {
                    await UseIndexInitializerRefactoring.ComputeRefactoringAsync(context, initializer).ConfigureAwait(false);
                }
            }
        }