diff --git a/code/Exercise3/AmazingClass.java b/code/Exercise3/AmazingClass.java new file mode 100644 index 0000000..6bbe7a0 --- /dev/null +++ b/code/Exercise3/AmazingClass.java @@ -0,0 +1,15 @@ +public class AmazingClass { + + + public void something() { + if(true){ + while(true){ + if(true){ + if(true){ + + } + } + } + } + } +} \ No newline at end of file diff --git a/code/Exercise5/pom.xml b/code/Exercise5/pom.xml new file mode 100644 index 0000000..39ebc8b --- /dev/null +++ b/code/Exercise5/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + fr.istic.vv + javaparser-starter + 1.0 + + + UTF-8 + 9 + 9 + + + + + com.github.javaparser + javaparser-core + 3.16.2 + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + + true + fr.istic.vv.Main + + + + + + + + maven-assembly-plugin + + + + true + fr.istic.vv.Main + + + + jar-with-dependencies + + + + + make-my-jar-with-dependencies + package + + single + + + + + + + + \ No newline at end of file diff --git a/code/Exercise5/src/main/java/fr/istic/vv/Main.java b/code/Exercise5/src/main/java/fr/istic/vv/Main.java new file mode 100644 index 0000000..04df2d0 --- /dev/null +++ b/code/Exercise5/src/main/java/fr/istic/vv/Main.java @@ -0,0 +1,39 @@ +package fr.istic.vv; + +import com.github.javaparser.Problem; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.visitor.VoidVisitor; +import com.github.javaparser.ast.visitor.VoidVisitorAdapter; +import com.github.javaparser.utils.SourceRoot; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class Main { + + public static void main(String[] args) throws IOException { + if(args.length == 0) { + System.err.println("Should provide the path to the source code"); + System.exit(1); + } + + File file = new File(args[0]); + if(!file.exists() || !file.isDirectory() || !file.canRead()) { + System.err.println("Provide a path to an existing readable directory"); + System.exit(2); + } + + SourceRoot root = new SourceRoot(file.toPath()); + PublicElementsPrinter printer = new PublicElementsPrinter(); + root.parse("", (localPath, absolutePath, result) -> { + result.ifSuccessful(unit -> unit.accept(printer, null)); + return SourceRoot.Callback.Result.DONT_SAVE; + }); + } + + +} diff --git a/code/Exercise5/src/main/java/fr/istic/vv/PublicElementsPrinter.java b/code/Exercise5/src/main/java/fr/istic/vv/PublicElementsPrinter.java new file mode 100644 index 0000000..7065232 --- /dev/null +++ b/code/Exercise5/src/main/java/fr/istic/vv/PublicElementsPrinter.java @@ -0,0 +1,48 @@ +package fr.istic.vv; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.*; +import com.github.javaparser.ast.visitor.VoidVisitorWithDefaults; + + +// This class visits a compilation unit and +// prints all public enum, classes or interfaces along with their public methods +public class PublicElementsPrinter extends VoidVisitorWithDefaults { + + @Override + public void visit(CompilationUnit unit, Void arg) { + for(TypeDeclaration type : unit.getTypes()) { + type.accept(this, null); + } + } + + public void visitTypeDeclaration(TypeDeclaration declaration, Void arg) { + if(!declaration.isPublic()) return; + System.out.println(declaration.getFullyQualifiedName().orElse("[Anonymous]")); + for(MethodDeclaration method : declaration.getMethods()) { + method.accept(this, arg); + } + // Printing nested types in the top level + for(BodyDeclaration member : declaration.getMembers()) { + if (member instanceof TypeDeclaration) + member.accept(this, arg); + } + } + + @Override + public void visit(ClassOrInterfaceDeclaration declaration, Void arg) { + visitTypeDeclaration(declaration, arg); + } + + @Override + public void visit(EnumDeclaration declaration, Void arg) { + visitTypeDeclaration(declaration, arg); + } + + @Override + public void visit(MethodDeclaration declaration, Void arg) { + if(!declaration.isPublic()) return; + System.out.println(" " + declaration.getDeclarationAsString(true, true)); + } + +} diff --git a/code/javaparser-starter/target/classes/fr/istic/vv/Main.class b/code/javaparser-starter/target/classes/fr/istic/vv/Main.class new file mode 100644 index 0000000..15c0858 Binary files /dev/null and b/code/javaparser-starter/target/classes/fr/istic/vv/Main.class differ diff --git a/code/javaparser-starter/target/classes/fr/istic/vv/PublicElementsPrinter.class b/code/javaparser-starter/target/classes/fr/istic/vv/PublicElementsPrinter.class new file mode 100644 index 0000000..ef76036 Binary files /dev/null and b/code/javaparser-starter/target/classes/fr/istic/vv/PublicElementsPrinter.class differ diff --git a/exercises/extending-pmd.md b/exercises/extending-pmd.md index 2239dc6..1f26ac8 100644 --- a/exercises/extending-pmd.md +++ b/exercises/extending-pmd.md @@ -23,3 +23,37 @@ Use your rule with different projects and describe you findings below. See the [ ## Answer + + +```xml + + + + Ruleset pour détecter 3 niveaux (ou plus) de if imbriqués. + + + + Three or more nested `if` ! + + 3 + + + + + +``` + +en testant un programme Java, il détecte bien les imbrications de 'if' même s'ils ne sont pas directement imbriqués, séparés par un while par exemple