private ExpressionSyntax DeconstructionToMethod(SemanticModel model, ExpressionSyntax tuple, ExpressionSyntax obj, DeconstructionInfo deconstructionInfo) { List <ArgumentSyntax> arguments = new List <ArgumentSyntax>(); if (tuple is TupleExpressionSyntax te) { foreach (var arg in te.Arguments) { try { if (arg.Expression is DeclarationExpressionSyntax de) { if (de.Designation is SingleVariableDesignationSyntax sv) { arguments.Add(SyntaxFactory.Argument(SyntaxFactory.IdentifierName(sv.Identifier)).WithRefKindKeyword(SyntaxFactory.Token(SyntaxKind.OutKeyword)).WithRefOrOutKeyword( SyntaxFactory.Token(SyntaxKind.OutKeyword))); } } else { arguments.Add(arg.WithRefKindKeyword(SyntaxFactory.Token(SyntaxKind.OutKeyword)).WithRefOrOutKeyword( SyntaxFactory.Token(SyntaxKind.OutKeyword))); } } catch (Exception e) { throw new ReplacerException(arg, e); } } } else { var variables = ((ParenthesizedVariableDesignationSyntax)((DeclarationExpressionSyntax)tuple).Designation).Variables; foreach (var variable in variables) { try { if (variable is SingleVariableDesignationSyntax sv) { arguments.Add(SyntaxFactory.Argument(SyntaxFactory.IdentifierName(sv.Identifier)).WithRefKindKeyword(SyntaxFactory.Token(SyntaxKind.OutKeyword)).WithRefOrOutKeyword( SyntaxFactory.Token(SyntaxKind.OutKeyword))); } } catch (Exception e) { throw new ReplacerException(variable, e); } } } if (deconstructionInfo.Method != null) { if (deconstructionInfo.Method.IsExtensionMethod) { arguments.Insert(0, SyntaxFactory.Argument(obj)); return(SyntaxHelper.GenerateInvocation(deconstructionInfo.Method.Name, deconstructionInfo.Method.ContainingType.FullyQualifiedName(), arguments.ToArray()).NormalizeWhitespace()); } else { return(SyntaxHelper.GenerateInvocation(deconstructionInfo.Method.Name, obj, arguments.ToArray()).NormalizeWhitespace()); } } else { arguments.Insert(0, SyntaxFactory.Argument(obj)); return(SyntaxHelper.GenerateInvocation("Deconstruct", "H5.Script", arguments.ToArray()).NormalizeWhitespace()); } }