Beispiel #1
0
        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());
            }
        }