├── .gitignore
├── README.md
├── build.xml
├── pom.xml
├── run.sh
└── src
└── main
└── java
├── BooleanExchange.java
├── Common.java
├── LogStatement.java
├── LoopExchange.java
├── Main.java
├── PermuteStatement.java
├── ReorderCondition.java
├── SwitchToIf.java
├── TryCatch.java
├── UnusedStatement.java
└── VariableRenaming.java
/.gitignore:
--------------------------------------------------------------------------------
1 | # OS file
2 | .DS_Store
3 |
4 | # Generated files
5 | /target/
6 | .idea/
7 | *.iml
8 |
9 | # Compiled class file
10 | *.class
11 |
12 | # Log file
13 | *.log
14 |
15 | # BlueJ files
16 | *.ctxt
17 |
18 | # Mobile Tools for Java (J2ME)
19 | .mtj.tmp/
20 |
21 | # Package Files #
22 | *.jar
23 | *.war
24 | *.nar
25 | *.ear
26 | *.zip
27 | *.tar.gz
28 | *.rar
29 |
30 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
31 | hs_err_pid*
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # JavaTransformer
2 | A tool to apply program transformations on Java **(\*.java)** methods for generating semantic-preserving transformed programs.
3 | - - -
4 |
5 | # Used Version(s):
6 | - openjdk 1.8.0_222
7 | - javaparser 3.24.4
8 |
9 | # JavaTransformer.jar:
10 |
11 | - Create Jar file with Maven:
12 | ```
13 | $ mvn clean compile assembly:single
14 | # Output: target/jar/JavaTransformer.jar
15 | ```
16 |
17 | - Create Jar file with Ant:
18 | ```
19 | $ mvn dependency:copy-dependencies
20 | $ ant jar
21 | # Output: build/jar/JavaTransformer.jar
22 | ```
23 |
24 | - Given input and output path, execute jar:
25 | ```
26 | # input_path = Input directory to the original programs.
27 | # output_path = Output directory to the transformed programs.
28 | $ java -jar JavaTransformer.jar "input_path" "output_path"
29 | ```
30 | Note:
31 | > The scope of transformation is at the method level, so each **(\*.java)** file should contain only a single method.
32 | > To modify the scope, first check [getParseUnit](https://github.com/mdrafiqulrabin/JavaTransformer/blob/31bab80927b9b86de0650cc1c0f659edae89ebdc/src/main/java/Common.java#L48) for CompilationUnit.
33 | > Or, convert java files into single method-only files using [JavaMethodExtractor](https://github.com/mdrafiqulrabin/tnpa-generalizability/tree/master/JavaMethodExtractor) before applying transformation.
34 |
35 | ## Transformations:
36 |
37 | - BooleanExchange
38 | - LogStatement
39 | - LoopExchange
40 | - PermuteStatement
41 | - ReorderCondition
42 | - SwitchToIf
43 | - TryCatch
44 | - UnusedStatement
45 | - VariableRenaming
46 |
47 | # References:
48 |
49 | - Testing Neural Program Analyzers [[Paper](https://arxiv.org/abs/1908.10711)] [[GitHub](https://github.com/mdrafiqulrabin/tnpa-framework)]
50 | - On the generalizability of Neural Program Models with respect to semantic-preserving program transformations [[Paper](https://arxiv.org/abs/2008.01566)] [[GitHub](https://github.com/mdrafiqulrabin/tnpa-generalizability)]
51 | - JavaParser: https://github.com/javaparser/javaparser
52 |
--------------------------------------------------------------------------------
/build.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | com.uhserg.tnpa.javatransformer
8 | JavaTransformer
9 | 1.0
10 |
11 |
12 |
13 |
14 | maven-assembly-plugin
15 |
16 | jar/JavaTransformer
17 | false
18 |
19 |
20 | Main
21 |
22 |
23 |
24 | jar-with-dependencies
25 |
26 |
27 |
28 |
29 | org.apache.maven.plugins
30 | maven-compiler-plugin
31 |
32 | 1.8
33 | 1.8
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | com.github.javaparser
42 | javaparser-core
43 | 3.24.4
44 |
45 |
46 | junit
47 | junit
48 | 4.13.2
49 |
50 |
51 | commons-io
52 | commons-io
53 | 2.11.0
54 |
55 |
56 | org.apache.commons
57 | commons-lang3
58 | 3.12.0
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/run.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | clear
3 | echo "Creating JavaTransformer.jar"
4 | mvn clean compile assembly:single
5 | java -jar target/jar/JavaTransformer.jar > target/default.log
6 | echo "Saved JAR into target/jar/"
7 |
--------------------------------------------------------------------------------
/src/main/java/BooleanExchange.java:
--------------------------------------------------------------------------------
1 | import com.github.javaparser.StaticJavaParser;
2 | import com.github.javaparser.ast.CompilationUnit;
3 | import com.github.javaparser.ast.Node;
4 | import com.github.javaparser.ast.body.VariableDeclarator;
5 | import com.github.javaparser.ast.expr.*;
6 | import com.github.javaparser.ast.stmt.Statement;
7 | import com.github.javaparser.ast.type.PrimitiveType;
8 | import com.github.javaparser.ast.visitor.TreeVisitor;
9 | import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
10 |
11 | import java.io.File;
12 | import java.util.ArrayList;
13 | import java.util.Objects;
14 |
15 | public class BooleanExchange extends VoidVisitorAdapter