Esempio n. 1
0
        public SyntaxNode InsertVariables(SyntaxNode root, SemanticModel model)
        {
            var patterns = root
                           .DescendantNodes()
                           .OfType <IsPatternExpressionSyntax>();

            var updatedStatements = new Dictionary <SyntaxNode, List <LocalDeclarationStatementSyntax> >();

            foreach (var pattern in patterns)
            {
                try
                {
                    SyntaxNode lambdaExpr      = pattern.Ancestors().OfType <LambdaExpressionSyntax>().FirstOrDefault();
                    SyntaxNode beforeStatement = pattern.Ancestors().OfType <StatementSyntax>().FirstOrDefault();

                    if (pattern.Pattern is DeclarationPatternSyntax declarationPattern)
                    {
                        if (lambdaExpr != null && !SyntaxHelper.IsChildOf(beforeStatement, lambdaExpr))
                        {
                            if (lambdaExpr is ParenthesizedLambdaExpressionSyntax pl && !(pl.Body is BlockSyntax))
                            {
                                beforeStatement = lambdaExpr;
                            }
                            else if (lambdaExpr is SimpleLambdaExpressionSyntax sl && !(sl.Body is BlockSyntax))
                            {
                                beforeStatement = lambdaExpr;
                            }
                        }

                        if (beforeStatement != null)
                        {
                            var designation = declarationPattern.Designation as SingleVariableDesignationSyntax;

                            if (designation != null)
                            {
                                if (!typesInfo.Keys.Contains(declarationPattern.Type.ToString()))
                                {
                                    var ti          = model.GetTypeInfo(declarationPattern.Type);
                                    var isValueType = ti.Type != null ? ti.Type.IsValueType : false;
                                    typesInfo[declarationPattern.Type.ToString()] = isValueType;
                                }

                                var locals = updatedStatements.ContainsKey(beforeStatement) ? updatedStatements[beforeStatement] : new List <LocalDeclarationStatementSyntax>();

                                var varDecl = SyntaxFactory.VariableDeclaration(declarationPattern.Type).WithVariables(SyntaxFactory.SingletonSeparatedList <VariableDeclaratorSyntax>(
                                                                                                                           SyntaxFactory.VariableDeclarator(SyntaxFactory.Identifier(designation.Identifier.ValueText))
                                                                                                                           ));

                                locals.Add(SyntaxFactory.LocalDeclarationStatement(varDecl).WithTrailingTrivia(SyntaxFactory.Whitespace("\n")).NormalizeWhitespace());

                                updatedStatements[beforeStatement] = locals;
                            }
                        }
                    }
                }