diff --git a/src/main/java/org/cqfn/uast/lang/java/gen/Expressions.java b/src/main/java/org/cqfn/uast/lang/java/gen/Expressions.java index 833f220..6a6637e 100644 --- a/src/main/java/org/cqfn/uast/lang/java/gen/Expressions.java +++ b/src/main/java/org/cqfn/uast/lang/java/gen/Expressions.java @@ -27,17 +27,20 @@ import java.util.Map; import java.util.TreeMap; import org.cqfn.astranaut.core.Node; +import org.cqfn.uast.tree.green.ArrayInitializer; import org.cqfn.uast.tree.green.Assignment; import org.cqfn.uast.tree.green.BinaryExpression; import org.cqfn.uast.tree.green.Expression; import org.cqfn.uast.tree.green.ExpressionList; import org.cqfn.uast.tree.green.FunctionCall; import org.cqfn.uast.tree.green.Name; +import org.cqfn.uast.tree.green.ObjectCreationExpression; import org.cqfn.uast.tree.green.ParenthesizedExpression; import org.cqfn.uast.tree.green.PostDecrement; import org.cqfn.uast.tree.green.PostIncrement; import org.cqfn.uast.tree.green.PropertyAccess; import org.cqfn.uast.tree.green.StringLiteral; +import org.cqfn.uast.tree.green.TypeName; import org.cqfn.uast.tree.green.UnaryExpression; import org.cqfn.uast.tree.green.Variable; @@ -80,6 +83,7 @@ public String generate(final Expression expr) { private Map init() { final Map gen = new TreeMap<>(); gen.put("This", expr -> "this"); + gen.put("NullLiteral", expr -> "null"); gen.put("IntegerLiteral", Node::getData); gen.put( "StringLiteral", @@ -103,6 +107,58 @@ private Map init() { return String.format("(%s)", this.generate(node.getExpression())); } ); + gen.put( + "ArrayInitializer", + expr -> { + final ArrayInitializer node = (ArrayInitializer) expr; + String params = ""; + final int size = node.getChildCount(); + if (size > 0) { + final StringBuilder builder = new StringBuilder(); + builder.append(this.generate(node.getExpression(0))); + for (int idx = 1; idx < size; idx += 1) { + builder.append(", ").append(this.generate(node.getExpression(idx))); + } + params = builder.toString(); + } + return String.format("{%s}", params); + } + ); + gen.putAll(this.initBinaryExpressions()); + gen.putAll(this.initUnaryExpressions()); + gen.putAll(this.initAssignmentExpressions()); + gen.putAll(this.initObjectRelatedExpressions()); + return gen; + } + + /** + * Initialises map with expressions related to objects. + * @return A map + */ + private Map initObjectRelatedExpressions() { + final Map gen = new TreeMap<>(); + gen.put( + "ObjectCreationExpression", + expr -> { + final ObjectCreationExpression node = (ObjectCreationExpression) expr; + final TypeName typename = node.getDatatype(); + final String name = TypeNames.INSTANCE.generate(typename); + final ExpressionList list = node.getArguments(); + String params = ""; + if (list != null) { + final int size = list.getChildCount(); + if (size > 0) { + final StringBuilder builder = new StringBuilder(); + builder.append(this.generate(list.getExpression(0))); + for (int idx = 1; idx < size; idx += 1) { + builder.append(", ").append(this.generate(list.getExpression(idx))); + } + params = builder.toString(); + } + } + return String.format("new %s(%s)", name, params); + } + ); gen.put( "PropertyAccess", expr -> { @@ -136,9 +192,6 @@ private Map init() { return String.format("%s%s(%s)", owner, name, params); } ); - gen.putAll(this.initBinaryExpressions()); - gen.putAll(this.initUnaryExpressions()); - gen.putAll(this.initAssignmentExpressions()); return gen; } diff --git a/src/test/java/org/cqfn/uast/lang/java/gen/CodeGeneratorTest.java b/src/test/java/org/cqfn/uast/lang/java/gen/CodeGeneratorTest.java index eda0dc9..f8d4c9a 100644 --- a/src/test/java/org/cqfn/uast/lang/java/gen/CodeGeneratorTest.java +++ b/src/test/java/org/cqfn/uast/lang/java/gen/CodeGeneratorTest.java @@ -155,6 +155,26 @@ void printToConsoleCase() { Assertions.assertEquals(code, result); } + /** + * Testing generator for object creation. + */ + @Test + void objectCreation() { + final String code = this.readTest("variable_declaration/ObjectDeclarator.java"); + final String result = CodeGeneratorTest.parseAndGenerate(code); + Assertions.assertEquals(code, result); + } + + /** + * Testing generator for array creation. + */ + @Test + void arrayCreation() { + final String code = this.readTest("arrays/ArrayCreation.java"); + final String result = CodeGeneratorTest.parseAndGenerate(code); + Assertions.assertEquals(code, result); + } + /** * Test that parses Java source code and then generate it again. * @param source Java source code