private SyntaxList <StatementSyntax> InsertRequiredDeclarations(
        SyntaxList <StatementSyntax> convertedStatements, CS.CSharpSyntaxNode originaNode)
    {
        var descendantNodes        = originaNode.DescendantNodes().ToList();
        var declarationExpressions = descendantNodes.OfType <CSSyntax.DeclarationExpressionSyntax>()
                                     .Where(e => !e.Parent.IsKind(CSSyntaxKind.ForEachVariableStatement)) //Handled inline for tuple loop
                                     .ToList();
        var isPatternExpressions = descendantNodes.OfType <CSSyntax.IsPatternExpressionSyntax>().ToList();

        if (declarationExpressions.Any() || isPatternExpressions.Any())
        {
            convertedStatements = convertedStatements.InsertRange(0, ConvertToDeclarationStatement(declarationExpressions, isPatternExpressions));
        }

        return(convertedStatements);
    }
    private string AdjustIfEventIdentifier(string valueText, CS.CSharpSyntaxNode parent)
    {
        var  symbol  = GetSymbol(parent) as IEventSymbol;
        bool isEvent = symbol.IsKind(SymbolKind.Event);

        if (!isEvent)
        {
            return(valueText);
        }

        var operation = _semanticModel.GetAncestorOperationOrNull <IEventReferenceOperation>(parent);

        if (operation == null || !operation.Event.Equals(symbol, SymbolEqualityComparer.IncludeNullability) || operation.Parent is IEventAssignmentOperation ||
            operation.Parent is IRaiseEventOperation || operation.Parent is IInvocationOperation ||
            operation.Parent is IConditionalAccessOperation cao && cao.WhenNotNull is IInvocationOperation)
        {
            return(valueText);
        }

        return(valueText + "Event");
    }
    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));
    }
Exemple #4
0
 private static IEnumerable <CSSyntax.BlockSyntax> GetDeepestBlocks(CS.CSharpSyntaxNode body)
 {
     return(body.DescendantNodesAndSelf().OfType <CSSyntax.BlockSyntax>().Where(x => !x.DescendantNodes().OfType <CSSyntax.BlockSyntax>().Any()));
 }