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; } }
/// <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); }
/// <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"); } } } }
/// <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); }