From f45c7a34bc16f56be846a3df6a451401882302ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=91=E6=88=9F?= Date: Tue, 12 May 2020 19:44:42 +0800 Subject: [PATCH] handle private method without parameter --- .../testable/processor/CallSuperMethod.java | 34 +++++++++++++------ .../testable/processor/TestableProcessor.java | 32 ++++++++++++++--- .../com/alibaba/testable/util/ConstPool.java | 3 ++ 3 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/alibaba/testable/processor/CallSuperMethod.java b/src/main/java/com/alibaba/testable/processor/CallSuperMethod.java index ec229a5..1dd7ed3 100644 --- a/src/main/java/com/alibaba/testable/processor/CallSuperMethod.java +++ b/src/main/java/com/alibaba/testable/processor/CallSuperMethod.java @@ -4,6 +4,7 @@ import com.alibaba.testable.util.ConstPool; import com.alibaba.testable.util.StringUtil; import com.sun.tools.javac.tree.JCTree; +import javax.lang.model.element.Modifier; import java.util.ArrayList; import java.util.List; @@ -11,11 +12,16 @@ import java.util.List; * @author flin */ public class CallSuperMethod { + private final String className; private final JCTree.JCMethodDecl method; private Object[] params; private String statement; - public CallSuperMethod(JCTree.JCMethodDecl method) {this.method = method;} + public CallSuperMethod(String className, JCTree.JCMethodDecl method) { + this.className = className; + this.method = method; + } + public Object[] getParams() { return params; @@ -26,17 +32,25 @@ public class CallSuperMethod { } public CallSuperMethod invoke() { - params = new String[method.params.length()]; + List args = new ArrayList<>(); List placeholders = new ArrayList<>(); - for (int i = 0; i < method.params.length(); i++) { - params[i] = (method.params.get(i).name.toString()); - placeholders.add("$N"); + if (method.getModifiers().getFlags().contains(Modifier.PRIVATE)) { + statement = className + ".class.getMethod(\"" + method.name + "\").invoke(this)"; + if (!method.restype.toString().equals(ConstPool.CONSTRUCTOR_VOID)) { + statement = "(" + method.restype + ")" + statement; + } + } else { + for (JCTree.JCVariableDecl p : method.params) { + args.add(p.name.toString()); + placeholders.add("$N"); + } + String call = "super"; + if (!method.name.toString().equals(ConstPool.CONSTRUCTOR_NAME)) { + call += ("." + method.name.toString()); + } + statement = call + "(" + StringUtil.join(placeholders, ", ") + ")"; } - String call = "super"; - if (!method.name.toString().equals(ConstPool.CONSTRUCTOR_NAME)) { - call += ("." + method.name.toString()); - } - statement = call + "(" + StringUtil.join(placeholders, ", ") + ")"; + params = args.toArray(); return this; } } diff --git a/src/main/java/com/alibaba/testable/processor/TestableProcessor.java b/src/main/java/com/alibaba/testable/processor/TestableProcessor.java index 82bb1cc..6bee204 100644 --- a/src/main/java/com/alibaba/testable/processor/TestableProcessor.java +++ b/src/main/java/com/alibaba/testable/processor/TestableProcessor.java @@ -18,6 +18,7 @@ import javax.tools.JavaFileObject; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -55,25 +56,38 @@ public class TestableProcessor extends BaseProcessor { List methodSpecs = new ArrayList<>(); for (JCTree.JCMethodDecl method : translator.getMethods()) { + if (method.getModifiers().getFlags().contains(Modifier.ABSTRACT)) { + continue; + } if (method.name.toString().equals(ConstPool.CONSTRUCTOR_NAME)) { MethodSpec.Builder builder = MethodSpec.constructorBuilder() .addModifiers(Modifier.PUBLIC); for (JCTree.JCVariableDecl p : method.getParameters()) { builder.addParameter(getParameterSpec(p)); } - CallSuperMethod callSuperMethod = new CallSuperMethod(method).invoke(); + CallSuperMethod callSuperMethod = new CallSuperMethod(classElement.getSimpleName().toString(), method).invoke(); builder.addStatement(callSuperMethod.getStatement(), callSuperMethod.getParams()); methodSpecs.add(builder.build()); } else { MethodSpec.Builder builder = MethodSpec.methodBuilder(method.name.toString()) - .addModifiers(method.getModifiers().getFlags()) - .addModifiers(Modifier.PUBLIC) + .addModifiers(toPublicFlags(method.getModifiers())) .returns(TypeName.get(((Type.MethodType)method.sym.type).restype)); for (JCTree.JCVariableDecl p : method.getParameters()) { builder.addParameter(getParameterSpec(p)); } - CallSuperMethod callSuperMethod = new CallSuperMethod(method).invoke(); - String statement = method.restype == null ? callSuperMethod.getStatement() : "return " + callSuperMethod.getStatement(); + CallSuperMethod callSuperMethod = new CallSuperMethod(classElement.getSimpleName().toString(), method).invoke(); + String statement = callSuperMethod.getStatement(); + if (!method.restype.toString().equals(ConstPool.CONSTRUCTOR_VOID)) { + statement = "return " + statement; + } + if (method.getModifiers().getFlags().contains(Modifier.PRIVATE)) { + builder.addException(Exception.class); + } else { + builder.addAnnotation(Override.class); + for (JCTree.JCExpression exception : method.getThrows()) { + builder.addException(TypeName.get(exception.type)); + } + } builder.addStatement(statement, callSuperMethod.getParams()); methodSpecs.add(builder.build()); } @@ -90,6 +104,14 @@ public class TestableProcessor extends BaseProcessor { return javaFile.toString(); } + private Set toPublicFlags(JCTree.JCModifiers modifiers) { + Set flags = new HashSet<>(modifiers.getFlags()); + flags.remove(Modifier.PRIVATE); + flags.remove(Modifier.PROTECTED); + flags.add(Modifier.PUBLIC); + return flags; + } + private ParameterSpec getParameterSpec(JCTree.JCVariableDecl type) { return ParameterSpec.builder(TypeName.get(type.sym.type), type.name.toString()).build(); } diff --git a/src/main/java/com/alibaba/testable/util/ConstPool.java b/src/main/java/com/alibaba/testable/util/ConstPool.java index 111b279..c4edb69 100644 --- a/src/main/java/com/alibaba/testable/util/ConstPool.java +++ b/src/main/java/com/alibaba/testable/util/ConstPool.java @@ -1,5 +1,7 @@ package com.alibaba.testable.util; +import com.sun.tools.javac.tree.JCTree; + /** * @author flin */ @@ -7,4 +9,5 @@ public final class ConstPool { public static final String CONSTRUCTOR_NAME = ""; + public static final String CONSTRUCTOR_VOID = "void"; }