You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2021/11/27 10:36:17 UTC

[ws-axiom] branch master updated: Add API for the weaver to provide more information to code generators

This is an automated email from the ASF dual-hosted git repository.

veithen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git


The following commit(s) were added to refs/heads/master by this push:
     new aa2743d  Add API for the weaver to provide more information to code generators
aa2743d is described below

commit aa2743d724d531963cd5717cf718dab0fbbf3fa9
Author: Andreas Veithen <an...@gmail.com>
AuthorDate: Sat Nov 27 10:35:52 2021 +0000

    Add API for the weaver to provide more information to code generators
---
 .../weaver/ImplementationClassDefinition.java      | 13 +++++++----
 .../apache/axiom/weaver/ImplementationNode.java    | 10 ++++----
 .../MethodBody.java => TargetContextImpl.java}     | 27 +++++++++++++++-------
 .../main/java/org/apache/axiom/weaver/Weaver.java  |  5 ++--
 .../MethodBody.java => WeavingContextImpl.java}    | 21 ++++++++++-------
 .../{MethodBody.java => DummyTargetContext.java}   | 18 +++++++++------
 ...xinInnerClass.java => DummyWeavingContext.java} | 11 +++++++--
 .../org/apache/axiom/weaver/mixin/MethodBody.java  |  4 ++--
 .../java/org/apache/axiom/weaver/mixin/Mixin.java  |  8 ++++---
 .../apache/axiom/weaver/mixin/MixinInnerClass.java |  2 +-
 .../org/apache/axiom/weaver/mixin/MixinMethod.java |  4 ++--
 .../{MixinInnerClass.java => TargetContext.java}   |  6 +++--
 .../{MixinInnerClass.java => WeavingContext.java}  |  4 ++--
 .../weaver/mixin/clazz/MixinClassVisitor.java      | 11 +++++----
 14 files changed, 92 insertions(+), 52 deletions(-)

diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationClassDefinition.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationClassDefinition.java
index b8236b7..a9823bb 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationClassDefinition.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationClassDefinition.java
@@ -28,12 +28,14 @@ import org.apache.axiom.weaver.mixin.InitializerMethod;
 import org.apache.axiom.weaver.mixin.Mixin;
 import org.apache.axiom.weaver.mixin.MixinMethod;
 import org.apache.axiom.weaver.mixin.StaticInitializerMethod;
+import org.apache.axiom.weaver.mixin.TargetContext;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 
 final class ImplementationClassDefinition extends ClassDefinition {
+    private final TargetContext targetContext;
     private final int version;
     private final int access;
     private final String superName;
@@ -44,13 +46,14 @@ final class ImplementationClassDefinition extends ClassDefinition {
     private final List<Named<StaticInitializerMethod>> staticInitializerMethods = new ArrayList<>();
 
     ImplementationClassDefinition(
+            TargetContext targetContext,
             int version,
             int access,
-            String className,
             String superName,
             String[] ifaceNames,
             Mixin[] mixins) {
-        super(className);
+        super(targetContext.getTargetClassName());
+        this.targetContext = targetContext;
         this.version = version;
         this.access = access;
         this.superName = superName != null ? superName : Type.getInternalName(Object.class);
@@ -135,7 +138,7 @@ final class ImplementationClassDefinition extends ClassDefinition {
             MethodVisitor mv =
                     cv.visitMethod(Opcodes.ACC_PRIVATE, method.getName(), "()V", null, null);
             if (mv != null) {
-                method.get().getBody().apply(className, mv);
+                method.get().getBody().apply(targetContext, mv);
             }
         }
         for (Named<StaticInitializerMethod> method : staticInitializerMethods) {
@@ -147,11 +150,11 @@ final class ImplementationClassDefinition extends ClassDefinition {
                             null,
                             null);
             if (mv != null) {
-                method.get().getBody().apply(className, mv);
+                method.get().getBody().apply(targetContext, mv);
             }
         }
         for (MixinMethod method : methods) {
-            method.apply(className, cv);
+            method.apply(targetContext, cv);
         }
         cv.visitEnd();
     }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationNode.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationNode.java
index 7f918c2..2b95690 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationNode.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationNode.java
@@ -27,6 +27,8 @@ import java.util.function.Supplier;
 
 import org.apache.axiom.weaver.mixin.ClassDefinition;
 import org.apache.axiom.weaver.mixin.Mixin;
+import org.apache.axiom.weaver.mixin.TargetContext;
+import org.apache.axiom.weaver.mixin.WeavingContext;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 
@@ -322,9 +324,9 @@ final class ImplementationNode {
         return builder.toString();
     }
 
-    List<ClassDefinition> toClassDefinitions() {
+    List<ClassDefinition> toClassDefinitions(WeavingContext weavingContext) {
         List<ClassDefinition> classDefinitions = new ArrayList<>();
-        String className = getClassName();
+        TargetContext targetContext = new TargetContextImpl(weavingContext, getClassName());
         int version = 0;
         List<Mixin> mixins = new ArrayList<>();
         for (MixinNode mixinNode : this.mixins) {
@@ -334,7 +336,7 @@ final class ImplementationNode {
             } else if (mixin.getBytecodeVersion() != version) {
                 throw new WeaverException("Inconsistent bytecode versions");
             }
-            classDefinitions.addAll(mixin.createInnerClassDefinitions(className));
+            classDefinitions.addAll(mixin.createInnerClassDefinitions(targetContext));
             mixins.add(mixin);
         }
         if (version == 0) {
@@ -353,9 +355,9 @@ final class ImplementationNode {
         }
         classDefinitions.add(
                 new ImplementationClassDefinition(
+                        targetContext,
                         version,
                         access,
-                        className,
                         parents.isEmpty() ? null : parents.iterator().next().getClassName(),
                         ifaceNames.toArray(new String[ifaceNames.size()]),
                         mixins.toArray(new Mixin[mixins.size()])));
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/TargetContextImpl.java
similarity index 55%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/TargetContextImpl.java
index 0f11bdd..00dddef 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/TargetContextImpl.java
@@ -16,16 +16,27 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.weaver.mixin;
+package org.apache.axiom.weaver;
 
-import org.objectweb.asm.MethodVisitor;
+import org.apache.axiom.weaver.mixin.TargetContext;
+import org.apache.axiom.weaver.mixin.WeavingContext;
 
-public abstract class MethodBody {
-    public abstract void apply(String targetClassName, MethodVisitor mv);
+final class TargetContextImpl implements TargetContext {
+    private final WeavingContext weavingContext;
+    private final String targetClassName;
 
-    public final int getWeight() {
-        Counter counter = new Counter();
-        apply("Dummy", new WeighingMethodVisitor(counter));
-        return counter.get();
+    TargetContextImpl(WeavingContext weavingContext, String targetClassName) {
+        this.weavingContext = weavingContext;
+        this.targetClassName = targetClassName;
+    }
+
+    @Override
+    public WeavingContext getWeavingContext() {
+        return weavingContext;
+    }
+
+    @Override
+    public String getTargetClassName() {
+        return targetClassName;
     }
 }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/Weaver.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/Weaver.java
index 622806f..f9e293b 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/Weaver.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/Weaver.java
@@ -27,6 +27,7 @@ import java.util.Set;
 
 import org.apache.axiom.weaver.mixin.ClassDefinition;
 import org.apache.axiom.weaver.mixin.Mixin;
+import org.apache.axiom.weaver.mixin.WeavingContext;
 import org.apache.axiom.weaver.mixin.clazz.MixinFactory;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -187,11 +188,11 @@ public final class Weaver {
                                         implementationNodes.iterator().next().getClassName());
                             }
                         });
-        log.debug(implementationClassNames);
+        WeavingContext context = new WeavingContextImpl(implementationClassNames);
 
         List<ClassDefinition> result = new ArrayList<>();
         for (ImplementationNode node : nodes) {
-            result.addAll(node.toClassDefinitions());
+            result.addAll(node.toClassDefinitions(context));
         }
         return result.toArray(new ClassDefinition[result.size()]);
     }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/WeavingContextImpl.java
similarity index 61%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/WeavingContextImpl.java
index 0f11bdd..cc7352e 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/WeavingContextImpl.java
@@ -16,16 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.weaver.mixin;
+package org.apache.axiom.weaver;
 
-import org.objectweb.asm.MethodVisitor;
+import java.util.Map;
 
-public abstract class MethodBody {
-    public abstract void apply(String targetClassName, MethodVisitor mv);
+import org.apache.axiom.weaver.mixin.WeavingContext;
 
-    public final int getWeight() {
-        Counter counter = new Counter();
-        apply("Dummy", new WeighingMethodVisitor(counter));
-        return counter.get();
+final class WeavingContextImpl implements WeavingContext {
+    private final Map<Class<?>, String> implementationClassNames;
+
+    WeavingContextImpl(Map<Class<?>, String> implementationClassNames) {
+        this.implementationClassNames = implementationClassNames;
+    }
+
+    @Override
+    public String getImplementationClassName(Class<?> iface) {
+        return implementationClassNames.get(iface);
     }
 }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyTargetContext.java
similarity index 70%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyTargetContext.java
index 0f11bdd..6d63ddb 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyTargetContext.java
@@ -18,14 +18,18 @@
  */
 package org.apache.axiom.weaver.mixin;
 
-import org.objectweb.asm.MethodVisitor;
+final class DummyTargetContext implements TargetContext {
+    static final DummyTargetContext INSTANCE = new DummyTargetContext();
 
-public abstract class MethodBody {
-    public abstract void apply(String targetClassName, MethodVisitor mv);
+    private DummyTargetContext() {}
 
-    public final int getWeight() {
-        Counter counter = new Counter();
-        apply("Dummy", new WeighingMethodVisitor(counter));
-        return counter.get();
+    @Override
+    public WeavingContext getWeavingContext() {
+        return DummyWeavingContext.INSTANCE;
+    }
+
+    @Override
+    public String getTargetClassName() {
+        return "Dummy";
     }
 }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyWeavingContext.java
similarity index 75%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyWeavingContext.java
index 0a36ecf..bc0ac2d 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyWeavingContext.java
@@ -18,6 +18,13 @@
  */
 package org.apache.axiom.weaver.mixin;
 
-public abstract class MixinInnerClass {
-    public abstract ClassDefinition createClassDefinition(String targetClassName);
+final class DummyWeavingContext implements WeavingContext {
+    static final DummyWeavingContext INSTANCE = new DummyWeavingContext();
+
+    private DummyWeavingContext() {}
+
+    @Override
+    public String getImplementationClassName(Class<?> iface) {
+        return "Dummy";
+    }
 }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
index 0f11bdd..5f23c0d 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
@@ -21,11 +21,11 @@ package org.apache.axiom.weaver.mixin;
 import org.objectweb.asm.MethodVisitor;
 
 public abstract class MethodBody {
-    public abstract void apply(String targetClassName, MethodVisitor mv);
+    public abstract void apply(TargetContext context, MethodVisitor mv);
 
     public final int getWeight() {
         Counter counter = new Counter();
-        apply("Dummy", new WeighingMethodVisitor(counter));
+        apply(DummyTargetContext.INSTANCE, new WeighingMethodVisitor(counter));
         return counter.get();
     }
 }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/Mixin.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/Mixin.java
index b051813..2e5432f 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/Mixin.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/Mixin.java
@@ -67,7 +67,9 @@ public final class Mixin {
         }
         for (MixinInnerClass innerClass : innerClasses) {
             Counter counter = new Counter();
-            innerClass.createClassDefinition("Dummy").accept(new WeighingClassVisitor(counter));
+            innerClass
+                    .createClassDefinition(DummyTargetContext.INSTANCE)
+                    .accept(new WeighingClassVisitor(counter));
             weight += counter.get();
         }
         this.weight = weight;
@@ -111,10 +113,10 @@ public final class Mixin {
         return staticInitializerMethod;
     }
 
-    public List<ClassDefinition> createInnerClassDefinitions(String targetClassName) {
+    public List<ClassDefinition> createInnerClassDefinitions(TargetContext targetContext) {
         List<ClassDefinition> classDefinitions = new ArrayList<>();
         for (MixinInnerClass innerClass : innerClasses) {
-            classDefinitions.add(innerClass.createClassDefinition(targetClassName));
+            classDefinitions.add(innerClass.createClassDefinition(targetContext));
         }
         return classDefinitions;
     }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
index 0a36ecf..994ec95 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
@@ -19,5 +19,5 @@
 package org.apache.axiom.weaver.mixin;
 
 public abstract class MixinInnerClass {
-    public abstract ClassDefinition createClassDefinition(String targetClassName);
+    public abstract ClassDefinition createClassDefinition(TargetContext context);
 }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinMethod.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinMethod.java
index 0495824..d67c7d3 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinMethod.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinMethod.java
@@ -60,10 +60,10 @@ public final class MixinMethod {
         return body;
     }
 
-    public void apply(String targetClassName, ClassVisitor cv) {
+    public void apply(TargetContext context, ClassVisitor cv) {
         MethodVisitor mv = cv.visitMethod(access, name, descriptor, signature, exceptions);
         if (mv != null) {
-            body.apply(targetClassName, mv);
+            body.apply(context, mv);
         }
     }
 }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/TargetContext.java
similarity index 87%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/TargetContext.java
index 0a36ecf..82f477c 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/TargetContext.java
@@ -18,6 +18,8 @@
  */
 package org.apache.axiom.weaver.mixin;
 
-public abstract class MixinInnerClass {
-    public abstract ClassDefinition createClassDefinition(String targetClassName);
+public interface TargetContext {
+    WeavingContext getWeavingContext();
+
+    String getTargetClassName();
 }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/WeavingContext.java
similarity index 87%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/WeavingContext.java
index 0a36ecf..5daaeb5 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/WeavingContext.java
@@ -18,6 +18,6 @@
  */
 package org.apache.axiom.weaver.mixin;
 
-public abstract class MixinInnerClass {
-    public abstract ClassDefinition createClassDefinition(String targetClassName);
+public interface WeavingContext {
+    String getImplementationClassName(Class<?> iface);
 }
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java
index a608928..419741f 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java
@@ -30,6 +30,7 @@ import org.apache.axiom.weaver.mixin.Mixin;
 import org.apache.axiom.weaver.mixin.MixinInnerClass;
 import org.apache.axiom.weaver.mixin.MixinMethod;
 import org.apache.axiom.weaver.mixin.StaticInitializerMethod;
+import org.apache.axiom.weaver.mixin.TargetContext;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.FieldVisitor;
@@ -123,9 +124,10 @@ final class MixinClassVisitor extends ClassVisitor {
         MethodBody body =
                 new MethodBody() {
                     @Override
-                    public void apply(String targetClassName, MethodVisitor mv) {
+                    public void apply(TargetContext context, MethodVisitor mv) {
                         method.accept(
-                                new MethodRemapper(mv, remapperFactory.apply(targetClassName)));
+                                new MethodRemapper(
+                                        mv, remapperFactory.apply(context.getTargetClassName())));
                     }
                 };
         if (name.equals("<init>")) {
@@ -155,8 +157,9 @@ final class MixinClassVisitor extends ClassVisitor {
             innerClasses.add(
                     new MixinInnerClass() {
                         @Override
-                        public ClassDefinition createClassDefinition(String targetClassName) {
-                            Remapper remapper = remapperFactory.apply(targetClassName);
+                        public ClassDefinition createClassDefinition(TargetContext targetContext) {
+                            Remapper remapper =
+                                    remapperFactory.apply(targetContext.getTargetClassName());
                             return new ClassDefinition(remapper.map(innerClass.name)) {
                                 @Override
                                 public void accept(ClassVisitor cv) {