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