public LambdaExpressionSyntax ConvertLambdaExpression(AnonymousFunctionExpressionSyntax node, CSharpSyntaxNode body, IEnumerable <ParameterSyntax> parameters, SyntaxTokenList modifiers)
        {
            var symbol        = (IMethodSymbol)ModelExtensions.GetSymbolInfo(_semanticModel, node).Symbol;
            var parameterList = SyntaxFactory.ParameterList(SyntaxFactory.SeparatedList(parameters.Select(p => (Microsoft.CodeAnalysis.VisualBasic.Syntax.ParameterSyntax)p.Accept(_nodesVisitor))));
            LambdaHeaderSyntax      header;
            EndBlockStatementSyntax endBlock;
            SyntaxKind multiLineExpressionKind;
            SyntaxKind singleLineExpressionKind;

            if (symbol.ReturnsVoid)
            {
                header = SyntaxFactory.SubLambdaHeader(SyntaxFactory.List <AttributeListSyntax>(),
                                                       ConvertModifiers(modifiers, TokenContext.Local), parameterList, null);
                endBlock = SyntaxFactory.EndBlockStatement(SyntaxKind.EndSubStatement,
                                                           SyntaxFactory.Token(SyntaxKind.SubKeyword));
                multiLineExpressionKind  = SyntaxKind.MultiLineSubLambdaExpression;
                singleLineExpressionKind = SyntaxKind.SingleLineSubLambdaExpression;
            }
            else
            {
                header = CreateFunctionHeader(modifiers, parameterList, out endBlock, out multiLineExpressionKind);
                singleLineExpressionKind = SyntaxKind.SingleLineFunctionLambdaExpression;
            }

            SyntaxList <StatementSyntax> statements;

            if (body is BlockSyntax block)
            {
                statements = ConvertStatements(block.Statements);
            }
            else if (body.Kind() == CSSyntaxKind.ThrowExpression)
            {
                var csThrowExpression = (ThrowExpressionSyntax)body;
                var vbThrowExpression = (ExpressionSyntax)csThrowExpression.Expression.Accept(_nodesVisitor);
                var vbThrowStatement  = SyntaxFactory.ThrowStatement(SyntaxFactory.Token(SyntaxKind.ThrowKeyword), vbThrowExpression);

                return(SyntaxFactory.MultiLineFunctionLambdaExpression(header,
                                                                       SyntaxFactory.SingletonList <StatementSyntax>(vbThrowStatement), endBlock));
            }
            else
            {
                statements = InsertRequiredDeclarations(
                    SyntaxFactory.SingletonList <StatementSyntax>(
                        SyntaxFactory.ReturnStatement((ExpressionSyntax)body.Accept(_nodesVisitor))),
                    body);
            }

            if (statements.Count == 1 && UnpackExpressionFromStatement(statements[0], out var expression))
            {
                return(SyntaxFactory.SingleLineLambdaExpression(singleLineExpressionKind, header, expression));
            }

            return(SyntaxFactory.MultiLineLambdaExpression(multiLineExpressionKind, header, statements, endBlock));
        }
Exemplo n.º 2
0
        private static LambdaHeaderSyntax CreateFunctionHeader(SyntaxTokenList modifiers, ParameterListSyntax parameterList,
                                                               out EndBlockStatementSyntax endBlock, out SyntaxKind multiLineExpressionKind)
        {
            LambdaHeaderSyntax header;

            header = SyntaxFactory.FunctionLambdaHeader(SyntaxFactory.List <AttributeListSyntax>(),
                                                        ConvertModifiers(modifiers, SyntaxKindExtensions.TokenContext.Local), parameterList, null);
            endBlock = SyntaxFactory.EndBlockStatement(SyntaxKind.EndFunctionStatement,
                                                       SyntaxFactory.Token(SyntaxKind.FunctionKeyword));
            multiLineExpressionKind = SyntaxKind.MultiLineFunctionLambdaExpression;
            return(header);
        }
    public LambdaExpressionSyntax ConvertLambdaExpression(CSSyntax.AnonymousFunctionExpressionSyntax node, CS.CSharpSyntaxNode body, IEnumerable <ParameterSyntax> parameters, SyntaxTokenList modifiers)
    {
        var parameterList = SyntaxFactory.ParameterList(SyntaxFactory.SeparatedList(parameters.Select(p => (Microsoft.CodeAnalysis.VisualBasic.Syntax.ParameterSyntax)p.Accept(_nodesVisitor))));
        LambdaHeaderSyntax      header;
        EndBlockStatementSyntax endBlock;
        SyntaxKind multiLineExpressionKind;
        SyntaxKind singleLineExpressionKind;
        bool       isSub = ReturnsVoid(node);

        if (isSub)
        {
            header = SyntaxFactory.SubLambdaHeader(SyntaxFactory.List <AttributeListSyntax>(),
                                                   ConvertModifiers(modifiers, TokenContext.Local), parameterList, null);
            endBlock = SyntaxFactory.EndBlockStatement(SyntaxKind.EndSubStatement,
                                                       SyntaxFactory.Token(SyntaxKind.SubKeyword));
            multiLineExpressionKind  = SyntaxKind.MultiLineSubLambdaExpression;
            singleLineExpressionKind = SyntaxKind.SingleLineSubLambdaExpression;
        }
        else
        {
            header = CreateFunctionHeader(modifiers, parameterList, out endBlock, out multiLineExpressionKind);
            singleLineExpressionKind = SyntaxKind.SingleLineFunctionLambdaExpression;
        }

        SyntaxList <StatementSyntax> statements;

        if (body is CSSyntax.BlockSyntax block)
        {
            statements = ConvertStatements(block.Statements);
        }
        else if (body.Kind() == CSSyntaxKind.ThrowExpression)
        {
            var csThrowExpression = (CSSyntax.ThrowExpressionSyntax)body;
            var vbThrowExpression = (ExpressionSyntax)csThrowExpression.Expression.Accept(_nodesVisitor);
            var vbThrowStatement  = SyntaxFactory.ThrowStatement(SyntaxFactory.Token(SyntaxKind.ThrowKeyword), vbThrowExpression);

            return(SyntaxFactory.MultiLineFunctionLambdaExpression(header,
                                                                   SyntaxFactory.SingletonList <StatementSyntax>(vbThrowStatement), endBlock));
        }
        else
        {
            var stmt = GetStatementSyntax(body.Accept(_nodesVisitor),
                                          expression => isSub ? SyntaxFactory.ExpressionStatement(expression) : SyntaxFactory.ReturnStatement(expression));
            statements = InsertRequiredDeclarations(SyntaxFactory.SingletonList(stmt), body);
        }

        return(CreateLambdaExpression(singleLineExpressionKind, multiLineExpressionKind, header, statements, endBlock));
    }