예제 #1
0
        private SyntaxResult <SyntaxNode> TranslateStatement_With(WithStatement withStatement, TranslatorState state)
        {
            var contextManager = TranslateExpression(withStatement.ContextManager, state);
            var body           = TranslateBlock_Block(withStatement.Body, state);

            if (contextManager.IsError)
            {
                return(SyntaxResult <SyntaxNode> .WithErrors(contextManager.Errors));
            }

            var usingStatement = SyntaxFactory.UsingStatement(body).WithExpression(contextManager.Syntax);

            if (withStatement.Variable != null)
            {
                if (withStatement.Variable is NameExpression nameExpression)
                {
                    var declarationType = SyntaxFactory.ParseTypeName("object");
                    var variable        = SyntaxFactory.VariableDeclarator(nameExpression.Name);
                    var declaration     = SyntaxFactory.VariableDeclaration(declarationType, SyntaxFactory.SingletonSeparatedList(variable));
                    usingStatement = usingStatement.WithDeclaration(declaration);
                }
                else
                {
                    return(SyntaxResult <SyntaxNode> .WithError($"// py2cs: Unknown with statment variable ({withStatement.Variable})"));
                }
            }

            return(usingStatement);
        }
예제 #2
0
        private SyntaxResult <SyntaxNode> TranslateStatement_Assert(AssertStatement assertStatement, TranslatorState state)
        {
            var argumentList = SyntaxFactory.SeparatedList <ArgumentSyntax>();

            var test = TranslateExpression(assertStatement.Test, state);

            if (test.IsError)
            {
                return(SyntaxResult <SyntaxNode> .WithErrors(test.Errors));
            }

            argumentList = argumentList.Add(SyntaxFactory.Argument(test.Syntax));

            if (assertStatement.Message != null)
            {
                var message = TranslateExpression(assertStatement.Message, state);

                if (message.IsError)
                {
                    return(SyntaxResult <SyntaxNode> .WithErrors(message.Errors));
                }

                argumentList = argumentList.Add(SyntaxFactory.Argument(message.Syntax));
            }

            var target = SyntaxFactory.ParseName("System.Diagnostics.Debug.Assert");
            var invocationExpression = SyntaxFactory.InvocationExpression(target, SyntaxFactory.ArgumentList(argumentList));

            return(SyntaxFactory.ExpressionStatement(invocationExpression));
        }
예제 #3
0
        private SyntaxResult <StatementSyntax> TranslateStatement_If(IList <IfStatementTest> tests, Statement elseStatement, TranslatorState state)
        {
            var expression = TranslateExpression(tests[0].Test, state);
            var body       = TranslateBlock_Block(tests[0].Body, state);

            if (expression.IsError)
            {
                return(SyntaxResult <StatementSyntax> .WithErrors(expression.Errors));
            }

            IfStatementSyntax ifStatementSyntax = SyntaxFactory.IfStatement(expression.Syntax, body);

            if (tests.Count > 1)
            {
                var elseIf = TranslateStatement_If(tests.Skip(1).ToList(), elseStatement, state);

                if (elseIf.IsError)
                {
                    return(SyntaxResult <StatementSyntax> .WithErrors(expression.Errors));
                }

                var elseClause = SyntaxFactory.ElseClause(elseIf.Syntax);
                ifStatementSyntax = ifStatementSyntax.WithElse(elseClause);
            }
            else if (elseStatement != null)
            {
                var elseBody   = TranslateBlock_Block(elseStatement, state);
                var elseClause = SyntaxFactory.ElseClause(elseBody);
                ifStatementSyntax = ifStatementSyntax.WithElse(elseClause);
            }

            return(ifStatementSyntax);
        }
예제 #4
0
        private (SyntaxResult <SyntaxNode>, TranslatorState) TranslateStatement(Statement statement, TranslatorState state)
        {
            switch (statement)
            {
            // case FromImportStatement fromImportStatement:
            //     return TranslateStatement_FromImportStatement(fromImportStatement, state);
            case ExpressionStatement expressionStatement:
                return(TranslateStatement_Expression(expressionStatement, state), state);

            case AssignmentStatement assignmentStatement:
                return(TranslateStatement_Assignment(assignmentStatement, state), state);

            case ReturnStatement returnStatement:
                return(TranslateStatement_Return(returnStatement, state), state);

            case IfStatement ifStatement:
                return(TranslateStatement_If(ifStatement, state), state);

            case WhileStatement whileStatement:
                return(TranslateStatement_While(whileStatement, state), state);

            case WithStatement withStatement:
                return(TranslateStatement_With(withStatement, state), state);

            case RaiseStatement raiseStatement:
                return(TranslateStatement_Raise(raiseStatement, state), state);

            case AssertStatement assertStatement:
                return(TranslateStatement_Assert(assertStatement, state), state);

            default:
                return(SyntaxResult <SyntaxNode> .WithError($"// py2cs: Unknown statement type ({statement.NodeName})"), state);
            }
        }
예제 #5
0
        private SyntaxResult <SyntaxNode> TranslateStatement_Raise(RaiseStatement raiseStatement, TranslatorState state)
        {
            var value = TranslateExpression(raiseStatement.ExceptType, state);

            if (value.IsError)
            {
                return(SyntaxResult <SyntaxNode> .WithErrors(value.Errors));
            }

            return(SyntaxFactory.ThrowStatement(value.Syntax));
        }
예제 #6
0
        private SyntaxResult <SyntaxNode> TranslateStatement_If(IfStatement ifStatement, TranslatorState state)
        {
            var ifSyntax = TranslateStatement_If(ifStatement.Tests, ifStatement.ElseStatement, state);

            if (ifSyntax.IsError)
            {
                return(SyntaxResult <SyntaxNode> .WithErrors(ifSyntax.Errors));
            }

            return(ifSyntax.Syntax);
        }
예제 #7
0
        private SyntaxResult <SyntaxNode> TranslateStatement_While(WhileStatement whileStatement, TranslatorState state)
        {
            var expression = TranslateExpression(whileStatement.Test, state);
            var body       = TranslateBlock_Block(whileStatement.Body, state);

            if (expression.IsError)
            {
                return(SyntaxResult <SyntaxNode> .WithErrors(expression.Errors));
            }

            return(SyntaxFactory.WhileStatement(expression.Syntax, body));
        }
예제 #8
0
        // private (SyntaxResult<SyntaxNode>, TranslatorState) TranslateStatement_FromImportStatement(FromImportStatement fromImportStatement, TranslatorState state)
        // {
        //     for (int nameIndex = 0; nameIndex < fromImportStatement.Names.Count; nameIndex++)
        //     {
        //         var name = fromImportStatement.Names[nameIndex];
        //         var asName = fromImportStatement.AsNames[nameIndex] ?? name;

        //         state = state.WithVariable(asName, name);
        //     }

        //     return (SyntaxFactory.EmptyStatement(), state);
        // }

        private SyntaxResult <SyntaxNode> TranslateStatement_Expression(ExpressionStatement expressionStatement, TranslatorState state)
        {
            if (expressionStatement.Expression is ConstantExpression constantExpression)
            {
                return(SyntaxResult <SyntaxNode> .WithError("/* " + constantExpression.Value + " */"));
            }

            var expression = TranslateExpression(expressionStatement.Expression, state);

            if (expression.IsError)
            {
                return(SyntaxResult <SyntaxNode> .WithErrors(expression.Errors));
            }

            return(SyntaxFactory.ExpressionStatement(expression.Syntax));
        }
예제 #9
0
        private SyntaxResult <SyntaxNode> TranslateStatement_Assignment(AssignmentStatement assignmentStatement, TranslatorState state)
        {
            if (assignmentStatement.Left.Count != 1)
            {
                return(SyntaxResult <SyntaxNode> .WithError($"// py2cs: Unsupported assignment left expression count"));
            }

            var leftExpression  = TranslateExpression(assignmentStatement.Left[0], state);
            var rightExpression = TranslateExpression(assignmentStatement.Right, state);

            if (leftExpression.IsError || rightExpression.IsError)
            {
                return(SyntaxResult <SyntaxNode> .WithErrors(Enumerable.Concat(leftExpression.Errors, rightExpression.Errors)));
            }

            var expression = SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, leftExpression.Syntax, rightExpression.Syntax);

            return(SyntaxFactory.ExpressionStatement(expression));
        }
예제 #10
0
        private (SyntaxResult <SyntaxNode[]>, TranslatorState) TranslateBlock_Members(Statement statement, TranslatorState state)
        {
            if (statement is SuiteStatement suiteStatement)
            {
                var errors  = new List <SyntaxTrivia>();
                var members = new List <SyntaxNode>();

                foreach (Statement memberStatement in suiteStatement.Statements)
                {
                    SyntaxResult <SyntaxNode> member;
                    (member, state) = TranslateStatement(memberStatement, state);

                    if (member.IsError)
                    {
                        errors.AddRange(member.Errors);
                    }
                    else
                    {
                        members.Add(member.Syntax.WithLeadingTrivia(errors));
                        errors.Clear();
                    }
                }

                if (errors.Count != 0)
                {
                    if (members.Count > 0)
                    {
                        members[members.Count - 1] = members[members.Count - 1].WithTrailingTrivia(errors);
                    }
                    else
                    {
                        return(SyntaxResult <SyntaxNode[]> .WithErrors(errors), state);
                    }
                }

                return(members.ToArray(), state);
            }
            else
            {
                return(SyntaxResult <SyntaxNode[]> .WithError($"// py2cs: Expected SuiteStatement"), state);
            }
        }