private static ISet <string> GetMethodArgumentNames(ObjectCreationExpressionSyntax creationSyntax)
        {
            var creationContext = creationSyntax.AncestorsAndSelf().FirstOrDefault(ancestor =>
                                                                                   ancestor is SimpleLambdaExpressionSyntax ||
                                                                                   ancestor is ParenthesizedLambdaExpressionSyntax ||
                                                                                   ancestor is AccessorDeclarationSyntax ||
                                                                                   ancestor is BaseMethodDeclarationSyntax);

            return(new HashSet <string>(GetArgumentNames(creationContext)));
        }
Esempio n. 2
0
            public override SyntaxNode VisitObjectCreationExpression(ObjectCreationExpressionSyntax node)
            {
                if (((CSharpCompilation)semanticModel.Compilation).LanguageVersion.MapSpecifiedToEffectiveVersion() != LanguageVersion.CSharp9)
                {
                    return(base.VisitObjectCreationExpression(node));
                }

                if (node.NewKeyword == null ||
                    node.Parent.IsKind(SyntaxKind.LocalDeclarationStatement) ||
                    node.Parent.IsKind(SyntaxKind.SimpleMemberAccessExpression) ||
                    node.Parent.IsKind(SyntaxKind.UsingStatement))
                {
                    return(base.VisitObjectCreationExpression(node));
                }

                //if (node.Parent.IsKind(SyntaxKind.LocalDeclarationStatement))
                //    return base.VisitObjectCreationExpression(node);

                //if (node.Parent.IsKind(SyntaxKind.SimpleMemberAccessExpression))
                //    return base.VisitObjectCreationExpression(node);

                //if (node.Parent.IsKind(SyntaxKind.UsingStatement))
                //    return base.VisitObjectCreationExpression(node);

                var newNode = node.WithType(SyntaxFactory.ParseTypeName(""))
                              .WithNewKeyword(node.NewKeyword.WithoutWhiteSpaceTrivia())
                              .WithArgumentList(node.ArgumentList ?? SyntaxFactory.ParseArgumentList("()"));

                var nodeTypeinfo = semanticModel.GetTypeInfo(node);
                var parentSymbol = semanticModel.GetSymbolInfo(node.Parent).Symbol;

                if (parentSymbol?.Kind == SymbolKind.Method &&
                    (parentSymbol as IMethodSymbol)?.MethodKind == MethodKind.AnonymousFunction)
                {
                    return(base.VisitObjectCreationExpression(node));
                }

                if (node.Parent.IsKind(SyntaxKind.ReturnStatement))
                {
                    var methodDeclaration   = node.FirstAncestorOrSelf <MethodDeclarationSyntax>();
                    var propertyDeclaration = node.FirstAncestorOrSelf <PropertyDeclarationSyntax>();

                    if (methodDeclaration != null)
                    {
                        if (methodDeclaration.ReturnType.ToString() != nodeTypeinfo.Type.Name)
                        {
                            return(base.VisitObjectCreationExpression(node));
                        }

                        var symbol = semanticModel.GetDeclaredSymbol(methodDeclaration);

                        if (symbol.ReturnType.TypeKind != TypeKind.Class)
                        {
                            return(base.VisitObjectCreationExpression(node));
                        }
                    }
                    else if (propertyDeclaration != null)
                    {
                        var symbol = semanticModel.GetDeclaredSymbol(propertyDeclaration);

                        if (symbol.GetMethod.ReturnType.TypeKind != TypeKind.Class)
                        {
                            return(base.VisitObjectCreationExpression(node));
                        }
                    }
                }
                else if (node.Parent.IsKind(SyntaxKind.Argument))
                {
                    var methodInvocation = node.FirstAncestorOrSelf <InvocationExpressionSyntax>();

                    if (methodInvocation != null)
                    {
                        var methodSymbol = semanticModel.GetSymbolInfo(methodInvocation).Symbol;

                        var countofMethod = methodSymbol?.ContainingType?.GetMembers()
                                            .Count(x => x.Name ==
                                                   (methodInvocation.Expression.IsKind(SyntaxKind.SimpleMemberAccessExpression) ?
                                                    methodInvocation.GetRightSideNameSyntax().ToString() :
                                                    methodInvocation.Expression.ToString()));

                        if (countofMethod > 1)
                        {
                            return(base.VisitObjectCreationExpression(node));
                        }

                        var indexOfMethod = node.FirstAncestorOrSelf <ArgumentListSyntax>().Arguments
                                            .IndexOf(node.AncestorsAndSelf().FirstOrDefault(x => x.Parent.IsKind(SyntaxKind.ArgumentList)) as ArgumentSyntax);

                        if ((methodSymbol as IMethodSymbol)?.OriginalDefinition.Parameters[indexOfMethod].IsParams == true)
                        {
                            return(base.VisitObjectCreationExpression(node));
                        }

                        if ((methodSymbol as IMethodSymbol)?.OriginalDefinition.IsGenericMethod == true &&
                            (methodInvocation.Expression.IsKind(SyntaxKind.SimpleMemberAccessExpression) ?
                             !methodInvocation.GetRightSideNameSyntax().IsKind(SyntaxKind.GenericName) :
                             !methodInvocation.Expression.IsKind(SyntaxKind.GenericName)))
                        {
                            return(base.VisitObjectCreationExpression(node));
                        }
                    }
                    else
                    {
                        return(base.VisitObjectCreationExpression(node));
                    }
                }
                else if (node.Parent.IsKind(SyntaxKind.ArrayInitializerExpression))
                {
                    if (node.Parent.Parent.IsKind(SyntaxKind.ImplicitArrayCreationExpression))
                    {
                        return(base.VisitObjectCreationExpression(node));
                    }
                }

                if (nodeTypeinfo.ConvertedType.ToString() == nodeTypeinfo.Type.ToString())
                {
                    if (isReportOnlyMode)
                    {
                        var lineSpan = node.GetFileLinePosSpan();

                        AddReport(new ChangesReport(node)
                        {
                            LineNumber = lineSpan.StartLinePosition.Line,
                            Column     = lineSpan.StartLinePosition.Character,
                            Message    = "Object Creation new Syntax in c# v9",
                            Generator  = nameof(CSharpSyntaxUpgrade)
                        });
                    }

                    return(newNode);
                }

                return(base.VisitObjectCreationExpression(node));
            }