--- /dev/null 2018-05-03 07:48:58.155163031 -0700
+++ new/plugins/simple_methods_anc/build.xml 2018-05-03 08:02:29.951159934 -0700
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null 2018-05-03 07:48:58.155163031 -0700
+++ new/plugins/simple_methods_anc/src/openjdk/jcov/filter/simplemethods/Delegators.java 2018-05-03 08:02:30.191159933 -0700
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package openjdk.jcov.filter.simplemethods;
+
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.InvokeDynamicInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import java.util.function.BiPredicate;
+
+import static java.util.Arrays.binarySearch;
+import static openjdk.jcov.filter.simplemethods.Utils.isInvokeInstruction;
+import static openjdk.jcov.filter.simplemethods.Utils.isReturnInstruction;
+import static openjdk.jcov.filter.simplemethods.Utils.isSimpleInstruction;
+
+public class Delegators implements BiPredicate {
+
+ private final boolean sameNameDelegationOnly;
+
+ public Delegators(boolean sameNameDelegationOnly) {
+ this.sameNameDelegationOnly = sameNameDelegationOnly;
+ }
+
+ public Delegators() {
+ this(false);
+ }
+
+ /**
+ * Identifies simple delegation. A simple delegator is a method obtaining any number of values with a "simple" code
+ * and then calling a method with the obtained values.
+ * @see Utils#isSimpleInstruction(int)
+ */
+ @Override
+ public boolean test(ClassNode clazz, MethodNode m) {
+ int index = 0;
+ int opCode = -1;
+ //skip all instructions allowed to get values
+ for(; index < m.instructions.size(); index++) {
+ opCode = m.instructions.get(index).getOpcode();
+ if(opCode >=0) {
+ if (!isSimpleInstruction(opCode)) {
+ break;
+ }
+ }
+ }
+ //that should be an invocation instruction
+ if(!isInvokeInstruction(opCode)) {
+ return false;
+ }
+ if(sameNameDelegationOnly) {
+ //check name
+ AbstractInsnNode node = m.instructions.get(index);
+ String name;
+ if (node instanceof MethodInsnNode) {
+ name = ((MethodInsnNode) node).name;
+ } else if (node instanceof InvokeDynamicInsnNode) {
+ name = ((InvokeDynamicInsnNode) node).name;
+ } else {
+ throw new IllegalStateException("Unknown node type: " + node.getClass().getName());
+ }
+ if(!m.name.equals(name)) {
+ return false;
+ }
+ }
+ //scroll to next instruction
+ for(index++; index < m.instructions.size(); index++) {
+ opCode = m.instructions.get(index).getOpcode();
+ if(opCode >=0) {
+ break;
+ }
+ }
+ //that should be a return instruction
+ return isReturnInstruction(opCode);
+ }
+}
--- /dev/null 2018-05-03 07:48:58.155163031 -0700
+++ new/plugins/simple_methods_anc/src/openjdk/jcov/filter/simplemethods/EmptyMethods.java 2018-05-03 08:02:30.431159932 -0700
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package openjdk.jcov.filter.simplemethods;
+
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import java.util.function.BiPredicate;
+
+import static org.objectweb.asm.Opcodes.RETURN;
+
+public class EmptyMethods implements BiPredicate {
+ @Override
+ public boolean test(ClassNode node, MethodNode m) {
+ int index = 0;
+ int opCode = -1;
+ //skip all instructions allowed to get values
+ for(; index < m.instructions.size(); index++) {
+ opCode = m.instructions.get(index).getOpcode();
+ if(opCode >=0) {
+ if (!Utils.isSimpleInstruction(opCode)) {
+ break;
+ }
+ }
+ }
+ //that should be a return
+ return opCode == RETURN;
+ }
+}
--- /dev/null 2018-05-03 07:48:58.155163031 -0700
+++ new/plugins/simple_methods_anc/src/openjdk/jcov/filter/simplemethods/Getters.java 2018-05-03 08:02:30.671159931 -0700
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package openjdk.jcov.filter.simplemethods;
+
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import java.util.function.BiPredicate;
+
+import static org.objectweb.asm.Opcodes.RETURN;
+
+public class Getters implements BiPredicate {
+ /**
+ * Identifies simple getters. A simple getter is a method obtaining a value with a "simple" code and returning it.
+ * @see Utils#isSimpleInstruction(int)
+ */
+ @Override
+ public boolean test(ClassNode clazz, MethodNode m) {
+ int index = 0;
+ int opCode = -1;
+ //skip all instructions allowed to get values
+ for(; index < m.instructions.size(); index++) {
+ opCode = m.instructions.get(index).getOpcode();
+ if(opCode >=0) {
+ if (!Utils.isSimpleInstruction(opCode)) {
+ break;
+ }
+ }
+ }
+ //that should be a return instruction, but returning a value
+ return Utils.isReturnInstruction(opCode) && opCode != RETURN;
+ }
+}
--- /dev/null 2018-05-03 07:48:58.155163031 -0700
+++ new/plugins/simple_methods_anc/src/openjdk/jcov/filter/simplemethods/Scanner.java 2018-05-03 08:02:30.915159930 -0700
@@ -0,0 +1,276 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package openjdk.jcov.filter.simplemethods;
+
+import com.sun.tdk.jcov.util.Utils;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.BiPredicate;
+
+import static java.util.stream.Collectors.joining;
+
+public class Scanner {
+ private static String USAGE =
+ "java -classpath jcov.jar:SimpleMethods.jar --usage\n" +
+ "\n" +
+ "java -classpath jcov.jar:simple_methods_anc.jar " + Scanner.class.getName() +
+ " [--include|-i ] [--exclude|-e ]" +
+ " [--include-module|-im ] [--exclude-module|-em ] \\\n" +
+ "[--getters