Skip to content

Commit

Permalink
Added code generation cases
Browse files Browse the repository at this point in the history
  • Loading branch information
pollyvolk committed Oct 25, 2022
1 parent 27019b6 commit 74f02e4
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 3 deletions.
59 changes: 56 additions & 3 deletions src/main/java/org/cqfn/uast/lang/java/gen/Expressions.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -80,6 +83,7 @@ public String generate(final Expression expr) {
private Map<String, Generator> init() {
final Map<String, Generator> gen = new TreeMap<>();
gen.put("This", expr -> "this");
gen.put("NullLiteral", expr -> "null");
gen.put("IntegerLiteral", Node::getData);
gen.put(
"StringLiteral",
Expand All @@ -103,6 +107,58 @@ private Map<String, Generator> 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<String, Generator> initObjectRelatedExpressions() {
final Map<String, Generator> 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 -> {
Expand Down Expand Up @@ -136,9 +192,6 @@ private Map<String, Generator> init() {
return String.format("%s%s(%s)", owner, name, params);
}
);
gen.putAll(this.initBinaryExpressions());
gen.putAll(this.initUnaryExpressions());
gen.putAll(this.initAssignmentExpressions());
return gen;
}

Expand Down
20 changes: 20 additions & 0 deletions src/test/java/org/cqfn/uast/lang/java/gen/CodeGeneratorTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 74f02e4

Please sign in to comment.