Merge branch 'master' into wiki_samples_test
diff --git a/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java b/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java
index 383b2f3..dff98ef 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java
@@ -160,6 +160,11 @@
         return parse(file, Charset.defaultCharset().name(),true);
     }
 
+    public static CompilationUnit parse(final Reader reader)
+            throws ParseException {
+        return parse(reader, true);
+    }
+    
     public static CompilationUnit parse(final Reader reader, boolean considerComments)
             throws ParseException {
         try {
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/ChangingMethodsFromAClassWithAVisitorTest.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/ChangingMethodsFromAClassWithAVisitorTest.java
new file mode 100644
index 0000000..dd2d08a
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/ChangingMethodsFromAClassWithAVisitorTest.java
@@ -0,0 +1,12 @@
+package com.github.javaparser.junit;
+
+import org.junit.Test;
+
+public class ChangingMethodsFromAClassWithAVisitorTest {
+    @Test
+    public void printingTheCompilationUnitToSystemOutput() throws Exception {
+        try (TestFileToken f = new TestFileToken("test.java")) {
+            MethodChanger_1.main(new String[]{});
+        }
+    }
+}
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/ChangingMethodsFromAClassWithoutAVisitorTest.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/ChangingMethodsFromAClassWithoutAVisitorTest.java
new file mode 100644
index 0000000..0ef2e6f
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/ChangingMethodsFromAClassWithoutAVisitorTest.java
@@ -0,0 +1,12 @@
+package com.github.javaparser.junit;
+
+import org.junit.Test;
+
+public class ChangingMethodsFromAClassWithoutAVisitorTest {
+    @Test
+    public void printingTheCompilationUnitToSystemOutput() throws Exception {
+        try (TestFileToken f = new TestFileToken("test.java")) {
+            MethodChanger_2.main(new String[]{});
+        }
+    }
+}
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/ClassCreator.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/ClassCreator.java
new file mode 100644
index 0000000..01fb0f4
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/ClassCreator.java
@@ -0,0 +1,61 @@
+package com.github.javaparser.junit;
+
+import com.github.javaparser.ASTHelper;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.PackageDeclaration;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.body.ModifierSet;
+import com.github.javaparser.ast.body.Parameter;
+import com.github.javaparser.ast.expr.FieldAccessExpr;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.expr.NameExpr;
+import com.github.javaparser.ast.expr.StringLiteralExpr;
+import com.github.javaparser.ast.stmt.BlockStmt;
+
+public class ClassCreator {
+
+    public static void main(String[] args) throws Exception {
+        // creates the compilation unit
+        CompilationUnit cu = createCU();
+
+        // prints the created compilation unit
+        System.out.println(cu.toString());
+    }
+
+    /**
+     * creates the compilation unit
+     */
+    private static CompilationUnit createCU() {
+        CompilationUnit cu = new CompilationUnit();
+        // set the package
+        cu.setPackage(new PackageDeclaration(ASTHelper.createNameExpr("java.parser.test")));
+
+        // create the type declaration 
+        ClassOrInterfaceDeclaration type = new ClassOrInterfaceDeclaration(ModifierSet.PUBLIC, false, "GeneratedClass");
+        ASTHelper.addTypeDeclaration(cu, type);
+
+        // create a method
+        MethodDeclaration method = new MethodDeclaration(ModifierSet.PUBLIC, ASTHelper.VOID_TYPE, "main");
+        method.setModifiers(ModifierSet.addModifier(method.getModifiers(), ModifierSet.STATIC));
+        ASTHelper.addMember(type, method);
+
+        // add a parameter to the method
+        Parameter param = ASTHelper.createParameter(ASTHelper.createReferenceType("String", 0), "args");
+        param.setVarArgs(true);
+        ASTHelper.addParameter(method, param);
+
+        // add a body to the method
+        BlockStmt block = new BlockStmt();
+        method.setBody(block);
+
+        // add a statement do the method body
+        NameExpr clazz = new NameExpr("System");
+        FieldAccessExpr field = new FieldAccessExpr(clazz, "out");
+        MethodCallExpr call = new MethodCallExpr(field, "println");
+        ASTHelper.addArgument(call, new StringLiteralExpr("Hello World!"));
+        ASTHelper.addStmt(block, call);
+
+        return cu;
+    }
+}
\ No newline at end of file
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/CreatingACompilationUnitFromScratch.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/CreatingACompilationUnitFromScratch.java
new file mode 100644
index 0000000..5fc6723
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/CreatingACompilationUnitFromScratch.java
@@ -0,0 +1,10 @@
+package com.github.javaparser.junit;
+
+import org.junit.Test;
+
+public class CreatingACompilationUnitFromScratch {
+    @Test
+    public void printingTheCompilationUnitToSystemOutput() throws Exception {
+        ClassCreator.main(new String[]{});
+    }
+}
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/CuPrinter.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/CuPrinter.java
new file mode 100644
index 0000000..20cc4f6
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/CuPrinter.java
@@ -0,0 +1,25 @@
+package com.github.javaparser.junit;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+
+import java.io.FileInputStream;
+
+public class CuPrinter {
+
+    public static void main(String[] args) throws Exception {
+        // creates an input stream for the file to be parsed
+        FileInputStream in = new FileInputStream("test.java");
+
+        CompilationUnit cu;
+        try {
+            // parse the file
+            cu = JavaParser.parse(in);
+        } finally {
+            in.close();
+        }
+
+        // prints the resulting compilation unit to default system output
+        System.out.println(cu.toString());
+    }
+}
\ No newline at end of file
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/MethodChanger_1.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/MethodChanger_1.java
new file mode 100644
index 0000000..98be6aa
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/MethodChanger_1.java
@@ -0,0 +1,50 @@
+package com.github.javaparser.junit;
+
+import com.github.javaparser.ASTHelper;
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.body.Parameter;
+import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
+
+import java.io.FileInputStream;
+
+public class MethodChanger_1 {
+
+    public static void main(String[] args) throws Exception {
+        // creates an input stream for the file to be parsed
+        FileInputStream in = new FileInputStream("test.java");
+
+        CompilationUnit cu;
+        try {
+            // parse the file
+            cu = JavaParser.parse(in);
+        } finally {
+            in.close();
+        }
+
+        // visit and change the methods names and parameters
+        new MethodChangerVisitor().visit(cu, null);
+
+        // prints the changed compilation unit
+        System.out.println(cu.toString());
+    }
+
+    /**
+     * Simple visitor implementation for visiting MethodDeclaration nodes.
+     */
+    private static class MethodChangerVisitor extends VoidVisitorAdapter {
+
+        @Override
+        public void visit(MethodDeclaration n, Object arg) {
+            // change the name of the method to upper case
+            n.setName(n.getName().toUpperCase());
+
+            // create the new parameter
+            Parameter newArg = ASTHelper.createParameter(ASTHelper.INT_TYPE, "value");
+
+            // add the parameter to the method
+            ASTHelper.addParameter(n, newArg);
+        }
+    }
+}
\ No newline at end of file
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/MethodChanger_2.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/MethodChanger_2.java
new file mode 100644
index 0000000..07c9737
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/MethodChanger_2.java
@@ -0,0 +1,58 @@
+package com.github.javaparser.junit;
+
+import com.github.javaparser.ASTHelper;
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.BodyDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.body.Parameter;
+import com.github.javaparser.ast.body.TypeDeclaration;
+
+import java.io.FileInputStream;
+import java.util.List;
+
+public class MethodChanger_2 {
+
+    public static void main(String[] args) throws Exception {
+        // creates an input stream for the file to be parsed
+        FileInputStream in = new FileInputStream("test.java");
+
+        CompilationUnit cu;
+        try {
+            // parse the file
+            cu = JavaParser.parse(in);
+        } finally {
+            in.close();
+        }
+
+        // change the methods names and parameters
+        changeMethods(cu);
+
+        // prints the changed compilation unit
+        System.out.println(cu.toString());
+    }
+
+    private static void changeMethods(CompilationUnit cu) {
+        List<TypeDeclaration> types = cu.getTypes();
+        for (TypeDeclaration type : types) {
+            List<BodyDeclaration> members = type.getMembers();
+            for (BodyDeclaration member : members) {
+                if (member instanceof MethodDeclaration) {
+                    MethodDeclaration method = (MethodDeclaration) member;
+                    changeMethod(method);
+                }
+            }
+        }
+    }
+
+    private static void changeMethod(MethodDeclaration n) {
+        // change the name of the method to upper case
+        n.setName(n.getName().toUpperCase());
+
+        // create the new parameter
+        Parameter newArg = ASTHelper.createParameter(ASTHelper.INT_TYPE, "value");
+
+        // add the parameter to the method
+        ASTHelper.addParameter(n, newArg);
+    }
+}
\ No newline at end of file
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/MethodPrinter.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/MethodPrinter.java
new file mode 100644
index 0000000..348a524
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/MethodPrinter.java
@@ -0,0 +1,42 @@
+package com.github.javaparser.junit;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
+
+import java.io.FileInputStream;
+
+public class MethodPrinter {
+
+    public static void main(String[] args) throws Exception {
+        // creates an input stream for the file to be parsed
+        FileInputStream in = new FileInputStream("test.java");
+
+        CompilationUnit cu;
+        try {
+            // parse the file
+            cu = JavaParser.parse(in);
+        } finally {
+            in.close();
+        }
+
+        // visit and print the methods names
+        new MethodVisitor().visit(cu, null);
+    }
+
+    /**
+     * Simple visitor implementation for visiting MethodDeclaration nodes. 
+     */
+    private static class MethodVisitor extends VoidVisitorAdapter {
+
+        @Override
+        public void visit(MethodDeclaration n, Object arg) {
+            // here you can access the attributes of the method.
+            // this method will be called for all methods in this 
+            // CompilationUnit, including inner class methods
+            System.out.println(n.getName());
+            super.visit(n, arg);
+        }
+    }
+}
\ No newline at end of file
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/PrintingTheCompilationUnitToSystemOutputTest.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/PrintingTheCompilationUnitToSystemOutputTest.java
new file mode 100644
index 0000000..414975c
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/PrintingTheCompilationUnitToSystemOutputTest.java
@@ -0,0 +1,13 @@
+package com.github.javaparser.junit;
+
+import org.junit.Test;
+
+public class PrintingTheCompilationUnitToSystemOutputTest {
+    @Test
+    public void printingTheCompilationUnitToSystemOutput() throws Exception {
+        try (TestFileToken f = new TestFileToken("test.java")) {
+            CuPrinter.main(new String[]{});
+        }
+    }
+
+}
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/TestFileToken.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/TestFileToken.java
new file mode 100644
index 0000000..e3726ab
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/TestFileToken.java
@@ -0,0 +1,40 @@
+package com.github.javaparser.junit;
+
+import org.apache.commons.io.IOUtils;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * Creates a temporary test file that a sample can use. This way we don't have to rewrite the samples to fit them into
+ * these tests.
+ */
+public class TestFileToken implements AutoCloseable {
+    private final String filename;
+
+    public TestFileToken(String filename) {
+        this.filename = filename;
+        try {
+            try (InputStream i = getClass().getResourceAsStream("TestFile.java"); OutputStream o = new FileOutputStream(filename)) {
+                assertNotNull(i);
+                IOUtils.copy(i, o);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail(e.getMessage());
+        }
+    }
+
+    @Override
+    public void close() {
+        boolean deleted = new File(filename).delete();
+        assertTrue(deleted);
+    }
+}
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/VisitingClassMethodsTest.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/VisitingClassMethodsTest.java
new file mode 100644
index 0000000..0a0751a
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/VisitingClassMethodsTest.java
@@ -0,0 +1,12 @@
+package com.github.javaparser.junit;
+
+import org.junit.Test;
+
+public class VisitingClassMethodsTest {
+    @Test
+    public void testCode() throws Exception {
+        try (TestFileToken f = new TestFileToken("test.java")) {
+            MethodPrinter.main(new String[]{});
+        }
+    }
+}
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/D.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/D.java
new file mode 100644
index 0000000..0852da8
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/D.java
@@ -0,0 +1,9 @@
+package com.github.javaparser.junit.removenode;
+
+public class D {
+
+    public int foo(int e) {
+        int a = 20;
+        return a;
+    }
+}
\ No newline at end of file
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/GitHubTest.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/GitHubTest.java
new file mode 100644
index 0000000..501ee09
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/GitHubTest.java
@@ -0,0 +1,49 @@
+package com.github.javaparser.junit.removenode;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.Node;
+import com.github.javaparser.ast.body.VariableDeclarator;
+import com.github.javaparser.ast.visitor.ModifierVisitorAdapter;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+public class GitHubTest {
+
+    public static void main(String... args) throws Exception {
+
+        FileInputStream file1 = new FileInputStream("forGitHubTest.java");
+        CompilationUnit cu = getCompilationUnit(file1);
+        String result = cu.toString();
+        new MyVisitor().visit(cu, null);
+        System.out.println(cu.toString());
+
+    }
+
+    public static CompilationUnit getCompilationUnit(InputStream in) {
+        try {
+            CompilationUnit cu;
+            try {
+                // parse the file
+                cu = JavaParser.parse(in);
+                return cu;
+            } finally {
+                in.close();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
+
+class MyVisitor extends ModifierVisitorAdapter {
+    @Override
+    public Node visit(VariableDeclarator declarator, Object args) {
+        if (declarator.getId().getName().equals("a") && declarator.getInit().toString().equals("20")) {
+            return null;
+        }
+        return declarator;
+    }
+}
\ No newline at end of file
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/GitHubTest_2.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/GitHubTest_2.java
new file mode 100644
index 0000000..f194ee6
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/GitHubTest_2.java
@@ -0,0 +1,71 @@
+package com.github.javaparser.junit.removenode;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.Node;
+import com.github.javaparser.ast.body.VariableDeclarator;
+import com.github.javaparser.ast.expr.VariableDeclarationExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.ast.visitor.ModifierVisitorAdapter;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+public class GitHubTest_2 {
+
+    public static void main(String... args) throws Exception {
+        FileInputStream file1 = new FileInputStream("forGitHubTest.java");
+        CompilationUnit cu = getCompilationUnit(file1);
+        String result = cu.toString();
+        new MyVisitor_2().visit(cu, null);
+        System.out.println(cu.toString());
+    }
+
+    public static CompilationUnit getCompilationUnit(InputStream in) {
+        try {
+            CompilationUnit cu;
+            try {
+                // parse the file
+                cu = JavaParser.parse(in);
+                return cu;
+            } finally {
+                in.close();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
+
+class MyVisitor_2 extends ModifierVisitorAdapter {
+
+    @Override
+    public Node visit(ExpressionStmt stmt, Object args) {
+        super.visit(stmt, args);
+        if (stmt.getExpression() == null) {
+            return null;
+        }
+        return stmt;
+    }
+
+    @Override
+    public Node visit(VariableDeclarationExpr declarationExpr, Object args) {
+        super.visit(declarationExpr, args);
+
+        if (declarationExpr.getVars().isEmpty()) {
+            return null;
+        }
+
+        return declarationExpr;
+    }
+
+    @Override
+    public Node visit(VariableDeclarator declarator, Object args) {
+        if (declarator.getId().getName().equals("a") && declarator.getInit().toString().equals("20")) {
+            return null;
+        }
+        return declarator;
+    }
+
+}
\ No newline at end of file
diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/RemoveDeleteNodeFromAst.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/RemoveDeleteNodeFromAst.java
new file mode 100644
index 0000000..1399e74
--- /dev/null
+++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/removenode/RemoveDeleteNodeFromAst.java
@@ -0,0 +1,20 @@
+package com.github.javaparser.junit.removenode;
+
+import com.github.javaparser.junit.TestFileToken;
+import org.junit.Test;
+
+public class RemoveDeleteNodeFromAst {
+    @Test
+    public void testCode1() throws Exception {
+        try (TestFileToken f = new TestFileToken("forGitHubTest.java")) {
+            GitHubTest.main();
+        }
+    }
+
+    @Test
+    public void testCode2() throws Exception {
+        try (TestFileToken f = new TestFileToken("forGitHubTest.java")) {
+            GitHubTest_2.main();
+        }
+    }
+}
diff --git a/javaparser-testing/src/test/resources/com/github/javaparser/junit/TestFile.java b/javaparser-testing/src/test/resources/com/github/javaparser/junit/TestFile.java
new file mode 100644
index 0000000..d89e7e6
--- /dev/null
+++ b/javaparser-testing/src/test/resources/com/github/javaparser/junit/TestFile.java
@@ -0,0 +1,16 @@
+package com.github.javaparser.junit;
+
+public class TestFile {
+    public int foo(int e) {
+        int a = 20;
+        return a;
+    }
+
+    public void abc() {
+
+    }
+
+    public int def() {
+        return 10;
+    }
+}