public override SyntaxList <StatementSyntax> VisitExitStatement(VBSyntax.ExitStatementSyntax node)
            {
                switch (VBasic.VisualBasicExtensions.Kind(node.BlockKeyword))
                {
                case VBasic.SyntaxKind.SubKeyword:
                    return(SingleStatement(SyntaxFactory.ReturnStatement()));

                case VBasic.SyntaxKind.FunctionKeyword:
                    VBasic.VisualBasicSyntaxNode typeContainer = (VBasic.VisualBasicSyntaxNode)node.Ancestors().OfType <VBSyntax.LambdaExpressionSyntax>().FirstOrDefault()
                                                                 ?? node.Ancestors().OfType <VBSyntax.MethodBlockSyntax>().FirstOrDefault();
                    var info = typeContainer.TypeSwitch(
                        (VBSyntax.LambdaExpressionSyntax e) => _semanticModel.GetTypeInfo(e).Type.GetReturnType(),
                        (VBSyntax.MethodBlockSyntax e) => {
                        var type = (TypeSyntax)e.SubOrFunctionStatement.AsClause?.Type.Accept(_nodesVisitor) ?? SyntaxFactory.ParseTypeName("object");
                        return(_semanticModel.GetSymbolInfo(type).Symbol?.GetReturnType());
                    }
                        );
                    ExpressionSyntax expr;
                    if (HasReturnVariable)
                    {
                        expr = ReturnVariable;
                    }
                    else if (info == null)
                    {
                        expr = null;
                    }
                    else if (info.IsReferenceType)
                    {
                        expr = SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression);
                    }
                    else if (info.CanBeReferencedByName)
                    {
                        expr = SyntaxFactory.DefaultExpression(SyntaxFactory.ParseTypeName(info.ToMinimalCSharpDisplayString(_semanticModel, node.SpanStart)));
                    }
                    else
                    {
                        throw new NotSupportedException();
                    }
                    return(SingleStatement(SyntaxFactory.ReturnStatement(expr)));

                default:
                    return(SingleStatement(SyntaxFactory.BreakStatement()));
                }
            }
 public override SyntaxList <StatementSyntax> VisitExitStatement(VBSyntax.ExitStatementSyntax node) => AddLocalVariables(node);
Beispiel #3
0
 public override Task <SyntaxList <StatementSyntax> > VisitExitStatement(VBSyntax.ExitStatementSyntax node) => AddLocalVariablesAsync(node);