diff --git a/agent/pom.xml b/agent/pom.xml index af9d76c..86ac5e0 100755 --- a/agent/pom.xml +++ b/agent/pom.xml @@ -3,9 +3,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>com.alibaba</groupId> - <artifactId>testable-agent</artifactId> - <version>0.0.2-SNAPSHOT</version> + <groupId>com.alibaba.testable</groupId> + <artifactId>agent</artifactId> + <version>0.0.3-SNAPSHOT</version> <packaging>jar</packaging> <properties> @@ -27,7 +27,7 @@ </dependencies> <build> - <finalName>${artifactId}</finalName> + <finalName>testable-agent</finalName> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 18f791b..3e1dd14 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -6,9 +6,9 @@ <name>Testable</name> <description>Unit test enhancement toolkit</description> - <groupId>com.alibaba</groupId> - <artifactId>testable-core</artifactId> - <version>0.0.2-SNAPSHOT</version> + <groupId>com.alibaba.testable</groupId> + <artifactId>core</artifactId> + <version>0.0.3-SNAPSHOT</version> <properties> <plugin.compiler.version>3.8.1</plugin.compiler.version> diff --git a/core/src/main/java/com/alibaba/testable/processor/EnableTestableInjectProcessor.java b/core/src/main/java/com/alibaba/testable/processor/EnableTestableInjectProcessor.java deleted file mode 100644 index 841934b..0000000 --- a/core/src/main/java/com/alibaba/testable/processor/EnableTestableInjectProcessor.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.alibaba.testable.processor; - -import com.alibaba.testable.annotation.EnableTestableInject; -import com.alibaba.testable.translator.EnableTestableInjectTranslator; -import com.alibaba.testable.translator.MethodRecordTranslator; -import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.tree.JCTree; - -import javax.annotation.processing.RoundEnvironment; -import javax.annotation.processing.SupportedAnnotationTypes; -import javax.annotation.processing.SupportedSourceVersion; -import javax.lang.model.SourceVersion; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; -import java.util.Set; - -/** - * @author flin - */ -@SupportedAnnotationTypes("com.alibaba.testable.annotation.EnableTestableInject") -@SupportedSourceVersion(SourceVersion.RELEASE_7) -public class EnableTestableInjectProcessor extends BaseProcessor { - - @Override - public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { - Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(EnableTestableInject.class); - for (Element element : elements) { - if (element.getKind().isClass()) { - processClassElement((Symbol.ClassSymbol)element); - } - } - return true; - } - - private void processClassElement(Symbol.ClassSymbol clazz) { - JCTree tree = cx.trees.getTree(clazz); - MethodRecordTranslator methodRecordTranslator = new MethodRecordTranslator(); - tree.accept(methodRecordTranslator); - tree.accept(new EnableTestableInjectTranslator(cx, methodRecordTranslator.getMethods())); - } - -} diff --git a/core/src/main/java/com/alibaba/testable/translator/EnableTestableInjectTranslator.java b/core/src/main/java/com/alibaba/testable/translator/EnableTestableInjectTranslator.java deleted file mode 100644 index 657598f..0000000 --- a/core/src/main/java/com/alibaba/testable/translator/EnableTestableInjectTranslator.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.alibaba.testable.translator; - -import com.alibaba.testable.model.TestableContext; -import com.alibaba.testable.util.ConstPool; -import com.sun.tools.javac.tree.JCTree.*; -import com.sun.tools.javac.util.List; -import com.sun.tools.javac.util.ListBuffer; -import com.sun.tools.javac.util.Name; - -/** - * Travel AST - * - * @author flin - */ -public class EnableTestableInjectTranslator extends BaseTranslator { - - private final TestableContext cx; - private List<JCMethodDecl> methods; - - public EnableTestableInjectTranslator(TestableContext cx, List<JCMethodDecl> methods) { - this.cx = cx; - this.methods = methods; - } - - /** - * new Demo() -> n.e.w(Demo.class) - * member() -> n.e.f(this, "member") - */ - @Override - public void visitExec(JCExpressionStatement jcExpressionStatement) { - jcExpressionStatement.expr = checkAndExchange(jcExpressionStatement.expr); - super.visitExec(jcExpressionStatement); - } - - /** - * return new Demo() -> return n.e.w(Demo.class) - * return member() -> return n.e.f(this, "member") - */ - @Override - public void visitReturn(JCReturn jcReturn) { - jcReturn.expr = checkAndExchange(jcReturn.expr); - super.visitReturn(jcReturn); - } - - /** - * Demo d = new Demo() -> Demo d = n.e.w(Demo.class) - * Demo d = member() -> Demo d = n.e.f(this, "member") - */ - @Override - public void visitVarDef(JCVariableDecl jcVariableDecl) { - jcVariableDecl.init = checkAndExchange(jcVariableDecl.init); - super.visitVarDef(jcVariableDecl); - } - - /** - * new Demo().call() -> n.e.w(Demo.class).call() - * member().call() -> n.e.f(this, "member").call() - */ - @Override - public void visitSelect(JCFieldAccess jcFieldAccess) { - jcFieldAccess.selected = checkAndExchange(jcFieldAccess.selected); - super.visitSelect(jcFieldAccess); - } - - /** - * member() + new Demo() -> n.e.f(this, "member") + n.e.w(Demo.class) - */ - @Override - public void visitBinary(JCBinary jcBinary) { - jcBinary.lhs = checkAndExchange(jcBinary.lhs); - jcBinary.rhs = checkAndExchange(jcBinary.rhs); - super.visitBinary(jcBinary); - } - - /** - * For member method invocation break point - * call(new Demo()) -> call(n.e.w(Demo.class)) - */ - @Override - public void visitApply(JCMethodInvocation tree) { - tree.args = checkAndExchange(tree.args); - super.visitApply(tree); - } - - /** - * For new operation break point - */ - @Override - public void visitNewClass(JCNewClass jcNewClass) { - super.visitNewClass(jcNewClass); - } - - /** - * For new operation break point - */ - @Override - public void visitNewArray(JCNewArray jcNewArray) { - super.visitNewArray(jcNewArray); - } - - @Override - protected JCExpression checkAndExchange(JCExpression expr) { - if (isNewOperation(expr)) { - JCNewClass newClassExpr = (JCNewClass)expr; - Name className = ((JCIdent)newClassExpr.clazz).name; - try { - return getGlobalNewInvocation(newClassExpr, className); - } catch (Exception e) { - e.printStackTrace(); - } - } else if (isMemberMethodInvocation(expr)) { - Name methodName = ((JCIdent)((JCMethodInvocation)expr).meth).name; - List<JCExpression> args = ((JCMethodInvocation)expr).args; - return getGlobalMemberInvocation(methodName, args); - } - return expr; - } - - private boolean isMemberMethodInvocation(JCExpression expr) { - return expr != null && expr.getClass().equals(JCMethodInvocation.class) && - ((JCMethodInvocation)expr).meth.getClass().equals(JCIdent.class); - } - - private boolean isNewOperation(JCExpression expr) { - return expr != null && expr.getClass().equals(JCNewClass.class); - } - - private JCExpression getGlobalNewInvocation(JCNewClass newClassExpr, Name className) { - JCFieldAccess snClass = cx.treeMaker.Select(cx.treeMaker.Ident(cx.names.fromString(ConstPool.NE_PKG)), - cx.names.fromString(ConstPool.NE_CLS)); - JCFieldAccess snMethod = cx.treeMaker.Select(snClass, cx.names.fromString(ConstPool.NE_NEW)); - JCExpression classType = cx.treeMaker.Select(cx.treeMaker.Ident(className), - cx.names.fromString(ConstPool.TYPE_TO_CLASS)); - ListBuffer<JCExpression> args = ListBuffer.of(classType); - args.addAll(newClassExpr.args); - return cx.treeMaker.Apply(List.<JCExpression>nil(), snMethod, args.toList()); - } - - private JCExpression getGlobalMemberInvocation(Name methodName, List<JCExpression> param) { - JCFieldAccess snClass = cx.treeMaker.Select(cx.treeMaker.Ident(cx.names.fromString(ConstPool.NE_PKG)), - cx.names.fromString(ConstPool.NE_CLS)); - JCFieldAccess snMethod = cx.treeMaker.Select(snClass, cx.names.fromString(ConstPool.NE_FUN)); - ListBuffer<JCExpression> args = new ListBuffer<>(); - args.add(cx.treeMaker.Ident(cx.names.fromString(ConstPool.REF_THIS))); - args.add(cx.treeMaker.Literal(methodName.toString())); - args.addAll(param); - JCMethodInvocation apply = cx.treeMaker.Apply(List.<JCExpression>nil(), snMethod, args.toList()); - for (JCMethodDecl m : methods) { - if (m.restype != null && !m.restype.toString().equals(ConstPool.VOID) && - m.name.equals(methodName) && paramEquals(m.params, param)) { - JCTypeCast cast = cx.treeMaker.TypeCast(m.restype, apply); - return cx.treeMaker.Parens(cast); - } - } - return apply; - } - - private boolean paramEquals(List<JCVariableDecl> p1, List<JCExpression> p2) { - if (p1.length() != p2.length()) { - return false; - } - for (int i = 0; i < p1.length(); i++) { - // TODO: Compare parameters type - } - return true; - } -} diff --git a/core/src/main/java/com/alibaba/testable/translator/MethodRecordTranslator.java b/core/src/main/java/com/alibaba/testable/translator/MethodRecordTranslator.java deleted file mode 100644 index 98a08b3..0000000 --- a/core/src/main/java/com/alibaba/testable/translator/MethodRecordTranslator.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.alibaba.testable.translator; - -import com.sun.tools.javac.tree.JCTree.JCMethodDecl; -import com.sun.tools.javac.tree.TreeTranslator; -import com.sun.tools.javac.util.List; - -/** - * Travel AST - * - * @author flin - */ -public class MethodRecordTranslator extends TreeTranslator { - - /** - * Member methods - */ - private List<JCMethodDecl> methods = List.nil(); - - public List<JCMethodDecl> getMethods() { - return methods; - } - - /** - * Record all methods - */ - @Override - public void visitMethodDef(JCMethodDecl jcMethodDecl) { - super.visitMethodDef(jcMethodDecl); - methods = methods.append(jcMethodDecl); - } - -} diff --git a/core/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/core/src/main/resources/META-INF/services/javax.annotation.processing.Processor index 72eb2fe..5f11897 100644 --- a/core/src/main/resources/META-INF/services/javax.annotation.processing.Processor +++ b/core/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -1,2 +1 @@ com.alibaba.testable.processor.EnableTestableProcessor -com.alibaba.testable.processor.EnableTestableInjectProcessor