private void AddStatementToString(StringBuilder inOutput, StatementCode inStatement, int inIndentDepth)
        {
            switch (inStatement.StatementType)
            {
            case StatementTypeEnum.If:
                var tmpStatementCodeString = CreateStatementCodeBlock(inStatement.StatementCodeBlocks[0]);
                if (tmpStatementCodeString.StartsWith("("))
                {
                    inOutput.AppendLine($"if{tmpStatementCodeString}");
                }
                else
                {
                    inOutput.AppendLine($"if({tmpStatementCodeString})");
                }
                inOutput.AppendLine(CreateIndent(inIndentDepth) + "{");
                AddCodeBlockToString(inOutput, inStatement.InnerContent, inIndentDepth + 1);
                inOutput.AppendLine(CreateIndent(inIndentDepth) + "}");
                break;

            case StatementTypeEnum.Else:
                inOutput.AppendLine("else {");
                AddCodeBlockToString(inOutput, inStatement.InnerContent, inIndentDepth + 1);
                inOutput.AppendLine(CreateIndent(inIndentDepth) + "}");
                break;

            case StatementTypeEnum.Assert:
                foreach (var tmpBlock in inStatement.StatementCodeBlocks)
                {
                    inOutput.Append("Trace.Assert ");
                    AddCodeBlockToString(inOutput, tmpBlock, 0);
                }
                break;

            case StatementTypeEnum.Elvis:
                AddCodeBlockToString(inOutput, inStatement.StatementCodeBlocks[0], 0, false);
                inOutput.Append(" ? ");
                AddCodeBlockToString(inOutput, inStatement.StatementCodeBlocks[1], 0, false);
                inOutput.Append(" : ");
                AddCodeBlockToString(inOutput, inStatement.StatementCodeBlocks[2], 0);
                break;

            case StatementTypeEnum.For:
                inOutput.Append("for (");
                AddCodeBlockToString(inOutput, inStatement.StatementCodeBlocks[0], 0, false);
                inOutput.Append(":");
                AddCodeBlockToString(inOutput, inStatement.StatementCodeBlocks[1], 0, false);
                inOutput.Append(":");
                AddCodeBlockToString(inOutput, inStatement.StatementCodeBlocks[2], 0, false);
                inOutput.AppendLine(")");
                inOutput.AppendLine(CreateIndent(inIndentDepth) + "{");
                AddCodeBlockToString(inOutput, inStatement.InnerContent, inIndentDepth + 1);
                inOutput.AppendLine(CreateIndent(inIndentDepth) + "}");
                break;

            default:
                throw new Exception("Unhandlet Statement Type");
                break;
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Create new Variable
        /// </summary>
        public static CodeBlock AddIfStatement(this CodeBlock inParentBlock, CodeBlock inIfBlock, CodeBlock inIfContent, CodeBlock inElseContent = null)
        {
            var tmpStatement = new StatementCode()
            {
                StatementType       = StatementTypeEnum.If,
                InnerContent        = inIfContent,
                StatementCodeBlocks = new List <CodeBlock> {
                    inIfBlock
                }
            };

            inParentBlock.CodeEntries.Add(tmpStatement);
            if (inElseContent != null)
            {
                tmpStatement = new StatementCode()
                {
                    StatementType = StatementTypeEnum.Else,
                    InnerContent  = inElseContent
                };
                inParentBlock.CodeEntries.Add(tmpStatement);
            }
            return(inParentBlock);
        }
Esempio n. 3
0
        /// <summary>
        /// Handling of an Expression Block
        /// </summary>
        /// <param name="inCodeBlock"></param>
        /// <param name="inBlockStatement"></param>
        public void HandleExpressionContext(CodeBlock inCodeBlock, ExpressionContext inBlockStatement, VariableDeclaration inVariable = null)
        {
            if (inBlockStatement == null)
            {
                return;
            }

            //if (inBlockStatement.IDENTIFIER() != null)
            //{
            //    inCodeBlock.CodeEntries.Add(new ConstantValue { Value = inBlockStatement.IDENTIFIER().GetText() });
            //}
            //else if (inBlockStatement.THIS() != null)
            //{
            //    throw new NotImplementedException("Not done yet");
            //}
            //else if (inBlockStatement.NEW() != null)
            //{
            //    throw new NotImplementedException("Not done yet");
            //}
            //else if (inBlockStatement.SUPER() != null)
            //{
            //    throw new NotImplementedException("Not done yet");
            //}
            //else if (inBlockStatement.INSTANCEOF() != null)
            //{
            //    throw new NotImplementedException("Not done yet");
            //}
            //else
            {
                if (inBlockStatement.primary() != null)
                {
                    //Primary Value analyse type
                    var tmpPrimary       = inBlockStatement.primary();
                    var tmpPrimaryAsText = tmpPrimary.GetText();

                    if (tmpPrimary.expression() != null)
                    {
                        var tmpCodeBlock = new CodeBlockContainer();
                        HandleExpressionContext(tmpCodeBlock.InnerBlock, tmpPrimary.expression(), inVariable);
                        inCodeBlock.CodeEntries.Add(tmpCodeBlock);
                    }
                    else if (tmpPrimary.literal() != null)
                    {
                        inCodeBlock.CodeEntries.Add(new ConstantValue {
                            Value = tmpPrimaryAsText
                        });
                    }
                    else if (tmpPrimary.typeTypeOrVoid() != null)
                    {
                        var tmpType  = JavaAntlrClassLoader.CreateTypeContainerFromType(tmpPrimary.typeTypeOrVoid());
                        var tmpConst = new ConstantValue {
                            Type = tmpType, Value = tmpPrimary.typeTypeOrVoid().typeType().GetText()
                        };
                        if (tmpPrimary.CLASS() != null)
                        {
                            var tmpVariableAccess = new VariableAccess();
                            tmpVariableAccess.Access = tmpConst;
                            tmpVariableAccess.Child  = new ConstantValue {
                                Value = "class"
                            };
                            inCodeBlock.CodeEntries.Add(tmpConst);
                        }
                        else
                        {
                            inCodeBlock.CodeEntries.Add(tmpConst);
                        }
                    }
                    else if (tmpPrimary.nonWildcardTypeArguments() != null)
                    {
                        throw new NotImplementedException("Not done yet");
                    }
                    else if (tmpPrimary.explicitGenericInvocationSuffix() != null)
                    {
                        throw new NotImplementedException("Not done yet");
                    }
                    else if (tmpPrimary.arguments() != null)
                    {
                        throw new NotImplementedException("Not done yet");
                    }
                    else
                    {
                        inCodeBlock.CodeEntries.Add(new ConstantValue {
                            Value = tmpPrimaryAsText
                        });
                    }
                }
                else if (inBlockStatement.expression().Length == 1 &&
                         inBlockStatement.typeType() != null)
                {
                    //Type Conversion
                    var tmpInfo      = inBlockStatement.expression();
                    var tmpConverter = new TypeConversion();
                    tmpConverter.PreconversionValue = new CodeBlock();
                    HandleExpressionContext(tmpConverter.PreconversionValue, tmpInfo[0]);

                    var tmpType = inBlockStatement.typeType();
                    tmpConverter.Type = JavaAntlrClassLoader.GetTypeContainer(tmpType);
                    inCodeBlock.CodeEntries.Add(tmpConverter);
                }
                else if (inBlockStatement.expression().Length == 2 &&
                         inBlockStatement.children[1].GetText() == "[")
                {
                    var tmpAccess    = new VariableAccess {
                    };
                    var tmpCodeBlock = new CodeBlock();
                    HandleExpressionContext(tmpCodeBlock, inBlockStatement.expression()[0], null);
                    tmpAccess.Access = tmpCodeBlock.CodeEntries[0];

                    tmpCodeBlock = new CodeBlock();
                    HandleExpressionContext(tmpCodeBlock, inBlockStatement.expression()[1], null);
                    tmpAccess.Child = new CodeBlockContainer {
                        InnerBlock = tmpCodeBlock
                    };
                    tmpAccess.IsArrayAccess = true;

                    inCodeBlock.CodeEntries.Add(tmpAccess);
                }
                else if (inBlockStatement.expression().Length == 2 &&
                         inBlockStatement.children[1].GetText() != "=")
                {
                    var tmpCodeExpression = new CodeExpression
                    {
                        Manipulator = JavaStaticInfo.GetManipulator(string.Join("", inBlockStatement.children
                                                                                .Where(inItem => inItem is ITerminalNode)
                                                                                .Select(inItem => inItem.GetText())))
                    };
                    var tmpCodeBlock = new CodeBlock();
                    HandleExpressionContext(tmpCodeBlock, inBlockStatement.expression()[0], inVariable);
                    tmpCodeExpression.SubClauseEntries.Add(tmpCodeBlock);
                    tmpCodeBlock = new CodeBlock();//Second Code Block
                    HandleExpressionContext(tmpCodeBlock, inBlockStatement.expression()[1], inVariable);
                    tmpCodeExpression.SubClauseEntries.Add(tmpCodeBlock);

                    inCodeBlock.CodeEntries.Add(tmpCodeExpression);
                }
                else
                {
                    var tmpChildList = inBlockStatement.children;
                    if (tmpChildList.Count > 2)
                    {
                        var tmpSecondChildText = tmpChildList[1].GetText();
                        if (tmpSecondChildText == "=")
                        {
                            //SetVariable with Value
                            var tmpVarSetter = new SetFieldWithValue();
                            HandleExpressionContext(tmpVarSetter.VariableToAccess, tmpChildList[0] as ExpressionContext, inVariable);
                            HandleExpressionContext(tmpVarSetter.ValueToSet, tmpChildList[2] as ExpressionContext, inVariable);
                            inCodeBlock.CodeEntries.Add(tmpVarSetter);
                        }
                        else if (JavaStaticInfo.VariableOperators.ContainsKey(tmpSecondChildText))
                        {
                            var tmpCodeExpression = new CodeExpression
                            {
                                Manipulator = JavaStaticInfo.GetManipulator(tmpSecondChildText)
                            };
                            var tmpCodeBlock = new CodeBlock();
                            HandleExpressionContext(tmpCodeBlock, tmpChildList[0] as ExpressionContext, inVariable);
                            tmpCodeExpression.SubClauseEntries.Add(tmpCodeBlock);
                            tmpCodeBlock = new CodeBlock();//Second Code Block
                            HandleExpressionContext(tmpCodeBlock, tmpChildList[2] as ExpressionContext, inVariable);
                            tmpCodeExpression.SubClauseEntries.Add(tmpCodeBlock);

                            inCodeBlock.CodeEntries.Add(tmpCodeExpression);
                        }
                        //Multi Part Property Access
                        else if (tmpSecondChildText == ".")
                        {
                            VariableAccess tmpParent = null;
                            for (var tmpI = 0; tmpI < tmpChildList.Count; tmpI += 2)
                            {
                                var tmpChild  = tmpChildList[tmpI];
                                var tmpAccess = new VariableAccess();
                                if (tmpChild is ExpressionContext)
                                {
                                    var tmpCodeBlock = new CodeBlock();
                                    HandleExpressionContext(tmpCodeBlock, tmpChild as ExpressionContext, null);
                                    tmpAccess.Access = tmpCodeBlock.CodeEntries[0];
                                }
                                else if (tmpChild is MethodCallContext)
                                {
                                    var tmpResult = HandleMethodeCall(tmpChild as MethodCallContext);
                                    tmpAccess.Access = tmpResult;
                                }
                                else if (tmpChild is TerminalNodeImpl)
                                {
                                    var tmpChildText = tmpChild.GetText();
                                    if (tmpChildText == ".")
                                    {
                                    }
                                    else if (RegexHelper.WordCheck.IsMatch(tmpChildText))
                                    {
                                        tmpAccess.Access = new ConstantValue(tmpChildText);
                                    }
                                    else
                                    {
                                        throw new NotImplementedException("Not done yet");
                                    }
                                }
                                else
                                {
                                    throw new NotImplementedException("Not done yet");
                                }
                                if (tmpParent != null)
                                {
                                    tmpParent.Child = tmpAccess;
                                }
                                else
                                {
                                    inCodeBlock.CodeEntries.Add(tmpAccess);
                                }
                                tmpParent = tmpAccess;
                            }
                        }
                        else if (tmpSecondChildText == "?")
                        {
                            //Implement Elvis
                            var tmpStatement = new StatementCode
                            {
                                StatementType       = StatementTypeEnum.Elvis,
                                StatementCodeBlocks = new List <CodeBlock>()
                            };
                            //Boolean query
                            var tmpCodeBlock = new CodeBlock();
                            HandleExpressionContext(tmpCodeBlock, tmpChildList[0] as ExpressionContext, inVariable);
                            tmpStatement.StatementCodeBlocks.Add(tmpCodeBlock);
                            //First Result
                            tmpCodeBlock = new CodeBlock();
                            HandleExpressionContext(tmpCodeBlock, tmpChildList[2] as ExpressionContext, inVariable);
                            tmpStatement.StatementCodeBlocks.Add(tmpCodeBlock);
                            //Second Result
                            tmpCodeBlock = new CodeBlock();
                            HandleExpressionContext(tmpCodeBlock, tmpChildList[4] as ExpressionContext, inVariable);
                            tmpStatement.StatementCodeBlocks.Add(tmpCodeBlock);

                            inCodeBlock.CodeEntries.Add(tmpStatement);
                        }
                        else
                        {
                            throw new NotImplementedException("Not done yet");
                        }
                    }
                    else if (tmpChildList.Count == 1)
                    {
                        var         tmpValue       = tmpChildList[0] as MethodCallContext;
                        MethodeCall tmpMethodeCall = HandleMethodeCall(tmpValue);
                        inCodeBlock.CodeEntries.Add(tmpMethodeCall);
                    }
                    else if (tmpChildList.Count == 2 &&
                             tmpChildList[1] is ExpressionContext)
                    {
                        if (tmpChildList[0].GetText() == "!")
                        {
                            var tmpCodeExpression = new CodeExpression
                            {
                                Manipulator = JavaStaticInfo.GetManipulator(tmpChildList[0].GetText())
                            };
                            tmpCodeExpression.SubClauseEntries = new List <CodeBlock> {
                                new CodeBlock()
                            };
                            HandleExpressionContext(tmpCodeExpression.SubClauseEntries[0], tmpChildList[1] as ExpressionContext, inVariable);
                            inCodeBlock.CodeEntries.Add(tmpCodeExpression);
                        }
                        else if (tmpChildList[0].GetText() != "-")
                        {
                            throw new NotImplementedException("Not done yet");
                        }
                        else
                        {
                            HandleExpressionContext(inCodeBlock, tmpChildList[1] as ExpressionContext, inVariable);
                            (inCodeBlock.CodeEntries.Last() as ConstantValue).Value = "-" + (inCodeBlock.CodeEntries.Last() as ConstantValue).Value;
                        }
                    }
                    else if (tmpChildList.Count == 2 &&
                             tmpChildList[0] is ExpressionContext)
                    {
                        if (tmpChildList[1].GetText() != "--" && tmpChildList[1].GetText() != "++")
                        {
                            throw new NotImplementedException("Not done yet");
                        }
                        var tmpCodeExpression = new CodeExpression
                        {
                            Manipulator = JavaStaticInfo.GetManipulator(tmpChildList[1].GetText())
                        };
                        tmpCodeExpression.SubClauseEntries = new List <CodeBlock> {
                            new CodeBlock()
                        };
                        HandleExpressionContext(tmpCodeExpression.SubClauseEntries[0], tmpChildList[0] as ExpressionContext, inVariable);
                        inCodeBlock.CodeEntries.Add(tmpCodeExpression);
                    }
                    else if (tmpChildList.Count == 2)
                    {
                        if (tmpChildList[0].GetText() != "new")
                        {
                            throw new NotImplementedException("Not done yet");
                        }
                        inCodeBlock.CodeEntries.Add(HandleCreatorContext(tmpChildList[1] as CreatorContext, inVariable));
                    }
                    else
                    {
                        throw new NotImplementedException("Not done yet");
                    }
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Handling an Array Inizializer block
        /// I'm unsure why this is not an ExpressionCOntext, but whatever
        /// </summary>
        /// <param name="inCodeBlock"></param>
        /// <param name="inBlockStatement"></param>
        private void HandleBlockStatementStatement(CodeBlock inParentCodeBlock, StatementContext inStatement)
        {
            if (inStatement.expression().Length > 1)
            {
                throw new NotImplementedException("Not done yet");
            }
            var tmpStatement = new StatementCode();

            if (inStatement.IF() != null)
            {
                if (inStatement.statement().Length > 2)
                {
                    throw new NotImplementedException("statement.statement length bigger than 1");
                }
                tmpStatement.StatementType       = StatementTypeEnum.If;
                tmpStatement.StatementCodeBlocks = new List <CodeBlock>()
                {
                    new CodeBlock()
                };
                HandleExpressionContext(tmpStatement.StatementCodeBlocks[0], inStatement.parExpression().expression(), null);
                tmpStatement.InnerContent = new CodeBlock();
                HandleBlockStatementStatement(tmpStatement.InnerContent, inStatement.statement()[0]);

                if (inStatement.ELSE() != null)
                {
                    inParentCodeBlock.CodeEntries.Add(tmpStatement);
                    tmpStatement = new StatementCode();

                    tmpStatement.StatementType       = StatementTypeEnum.Else;
                    tmpStatement.StatementCodeBlocks = new List <CodeBlock>()
                    {
                        new CodeBlock()
                    };
                    HandleExpressionContext(tmpStatement.StatementCodeBlocks[0], inStatement.parExpression().expression(), null);
                    tmpStatement.InnerContent = new CodeBlock();
                    HandleBlockStatementStatement(tmpStatement.InnerContent, inStatement.statement().Last());
                }
            }
            else if (inStatement.ASSERT() != null)
            {
                tmpStatement.StatementType       = StatementTypeEnum.Assert;
                tmpStatement.StatementCodeBlocks = new List <CodeBlock>()
                {
                };
                foreach (var tmpStatementExpression in inStatement.expression())
                {
                    var tmpBlock = new CodeBlock();
                    HandleExpressionContext(tmpBlock, tmpStatementExpression);
                    tmpStatement.StatementCodeBlocks.Add(tmpBlock);
                }
            }
            else if (inStatement.IDENTIFIER() != null)
            {
                throw new NotImplementedException("Not done yet");
            }
            else if (inStatement.RETURN() != null)
            {
                var tmpReturnCodeEntry = new ReturnCodeEntry();
                HandleExpressionContext(tmpReturnCodeEntry, inStatement.expression()[0], null);
                inParentCodeBlock.CodeEntries.Add(tmpReturnCodeEntry);
                return;
            }
            else if (inStatement.THROW() != null)
            {
                tmpStatement.StatementType       = StatementTypeEnum.Throw;
                tmpStatement.StatementCodeBlocks = new List <CodeBlock>()
                {
                };
                var tmpBlock = new CodeBlock();
                HandleExpressionContext(tmpBlock, inStatement.expression()[0]);
                tmpStatement.StatementCodeBlocks.Add(tmpBlock);
                return;
            }
            else if (inStatement.SEMI() != null)
            {
                //Semicolon, so it is a simple Statement
                //tmpStatement.StatementCodeBlocks = new List<CodeBlock>() { new CodeBlock() };
                if (inStatement.expression()[0].GetText() + ";" != inStatement.GetText())
                {
                    throw new NotImplementedException("Unhandlet Statement in Semi");
                }

                HandleExpressionContext(inParentCodeBlock, inStatement.expression()[0], null);
                return;
            }
            else if (inStatement.block() != null)
            {
                foreach (var tmpCode in inStatement.block().blockStatement())
                {
                    HandloBlockStatementContent(inParentCodeBlock, tmpCode);
                }
                return;
            }
            else if (inStatement.forControl() != null)
            {
                var tmpForControl = inStatement.forControl();
                tmpStatement.StatementType       = StatementTypeEnum.For;
                tmpStatement.StatementCodeBlocks = new List <CodeBlock>()
                {
                    new CodeBlock(), new CodeBlock(), new CodeBlock()
                };
                tmpStatement.InnerContent = new CodeBlock();
                HandleBlockStatementStatement(tmpStatement.InnerContent, inStatement.statement()[0]);

                if (tmpForControl.forInit() != null)
                {
                    if (tmpForControl.forInit().localVariableDeclaration() != null)
                    {
                        HandleLocalVariableDeclarationContext(tmpStatement.StatementCodeBlocks[0], tmpForControl.forInit().localVariableDeclaration());
                    }
                    if (tmpForControl.forInit().expressionList() != null)
                    {
                        foreach (var tmpExpr in tmpForControl.forInit().expressionList().expression())
                        {
                            HandleExpressionContext(tmpStatement.StatementCodeBlocks[0], tmpExpr);
                        }
                    }
                }
                if (tmpForControl.expression() != null)
                {
                    HandleExpressionContext(tmpStatement.StatementCodeBlocks[1], tmpForControl.expression());
                }
                if (tmpForControl.expressionList() != null)
                {
                    foreach (var tmpExpr in tmpForControl.expressionList().expression())
                    {
                        HandleExpressionContext(tmpStatement.StatementCodeBlocks[2], tmpExpr);
                    }
                }
                if (tmpForControl.enhancedForControl() != null)
                {
                    throw new NotImplementedException("for Inline Variable Declaration missing yet");
                    HandleExpressionContext(tmpStatement.StatementCodeBlocks[1], tmpForControl.expression());
                }
            }
            else if (inStatement.WHILE() != null)
            {
                if (inStatement.statement().Length > 2)
                {
                    throw new NotImplementedException("statement.statement length bigger than 1");
                }
                tmpStatement.StatementType       = StatementTypeEnum.While;
                tmpStatement.StatementCodeBlocks = new List <CodeBlock>()
                {
                    new CodeBlock()
                };
                HandleExpressionContext(tmpStatement.StatementCodeBlocks[0], inStatement.parExpression().expression(), null);
                tmpStatement.InnerContent = new CodeBlock();
                HandleBlockStatementStatement(tmpStatement.InnerContent, inStatement.statement()[0]);
            }
            else
            {
                throw new NotImplementedException("Not done yet");
            }

            if (inStatement.statement().Length > 0)
            {
                var tmpinnercount = (inStatement.ELSE() != null ? 1 : 0)
                                    + (inStatement.IF() != null ? 1 : 0)
                                    + (inStatement.FOR() != null ? 1 : 0)
                                    + (inStatement.WHILE() != null ? 1 : 0);

                if (inStatement.statement().Length != tmpinnercount)
                {
                    throw new NotImplementedException("Statement inner Statement length not matching");
                }
            }

            inParentCodeBlock.CodeEntries.Add(tmpStatement);
        }