Skip to content

Commit d5e4a96

Browse files
committed
增加IPassContext抽象
1 parent da330b4 commit d5e4a96

11 files changed

Lines changed: 288 additions & 97 deletions

File tree

.idea/uiDesigner.xml

Lines changed: 124 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

morpher-api/src/main/java/com/github/luiox/morpher/transformer/AbstractPass.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ public interface AbstractPass {
1111
*
1212
* @param context 上下文
1313
*/
14-
default void doInitialization(@NotNull PassContext context) {
14+
default void doInitialization(@NotNull IPassContext context) {
1515
}
1616

1717
/**
1818
* 在所有转换之后统一的清理操作
1919
*
2020
* @param context 上下文
2121
*/
22-
default void doFinalization(@NotNull PassContext context) {
22+
default void doFinalization(@NotNull IPassContext context) {
2323
}
2424
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package com.github.luiox.morpher.transformer;
2+
3+
import com.github.luiox.morpher.jar.IJarCaches;
4+
import com.github.luiox.morpher.jar.JarCachesEntry;
5+
import com.github.luiox.morpher.jar.JarCachesEntryType;
6+
import org.jetbrains.annotations.NotNull;
7+
import org.jetbrains.annotations.Nullable;
8+
import org.objectweb.asm.tree.ClassNode;
9+
10+
import java.util.ArrayList;
11+
import java.util.HashMap;
12+
import java.util.List;
13+
import java.util.Map;
14+
import java.util.concurrent.atomic.AtomicInteger;
15+
import java.util.function.Predicate;
16+
17+
public class BasicPassContext implements IPassContext{
18+
// pass声明周期操作
19+
private Map<AbstractPass, LifecycleHook> lifecycleHookMap = new HashMap<>();
20+
21+
/**
22+
* 生命周期钩子注册
23+
*/
24+
public LifecycleHook regLifecycleHook(AbstractPass owner) {
25+
if (!lifecycleHookMap.containsKey(owner)) {
26+
lifecycleHookMap.put(owner, new LifecycleHook());
27+
}
28+
return lifecycleHookMap.get(owner);
29+
}
30+
31+
public void runBeforeAllClassesHooks() {
32+
for (var entry : lifecycleHookMap.entrySet()) {
33+
var hook = entry.getValue().beforeAllClassesHook;
34+
if (hook != null) {
35+
hook.run();
36+
}
37+
}
38+
}
39+
40+
public void runAfterAllClassesHook() {
41+
for (var entry : lifecycleHookMap.entrySet()) {
42+
var hook = entry.getValue().afterAllClassesHook;
43+
if (hook != null) {
44+
hook.run();
45+
}
46+
}
47+
}
48+
49+
public void setNewClassNode(ClassNode newNode) {
50+
currentClass = newNode;
51+
}
52+
53+
public static class LifecycleHook {
54+
Runnable beforeAllClassesHook;
55+
Runnable afterAllClassesHook;
56+
57+
public LifecycleHook beforeAllClasses(Runnable hook) {
58+
beforeAllClassesHook = hook;
59+
return this;
60+
}
61+
62+
public LifecycleHook afterAllClasses(Runnable hook) {
63+
afterAllClassesHook = hook;
64+
return this;
65+
}
66+
}
67+
68+
// 计数器
69+
private Map<Class<?>, Map<String, AtomicInteger>> passCounters = new HashMap<>();
70+
71+
public AtomicInteger getCounter(Class<?> clazz, String name) {
72+
passCounters.computeIfAbsent(clazz, k -> new HashMap<>()).computeIfAbsent(name, k -> new AtomicInteger());
73+
return passCounters.get(clazz).get(name);
74+
}
75+
76+
// 基础的上下文信息
77+
private ClassNode currentClass;
78+
// 如果为null就不过滤,其次就是传入一个谓词,用于判断是否需要过滤,如果类名让这个谓词返回true那么就被保留
79+
private Predicate<String> currentClassFilter;
80+
81+
private AbstractPass prevPass;
82+
83+
public void setCurrentClassFilter(Predicate<String> currentClassFilter) {
84+
this.currentClassFilter = currentClassFilter;
85+
}
86+
87+
public Predicate<String> getCurrentClassFilter() {
88+
return currentClassFilter;
89+
}
90+
91+
@Override
92+
public @NotNull ClassNode currentClass() {
93+
return currentClass;
94+
}
95+
96+
@Override
97+
public void setCurrentClass(@NotNull ClassNode classNode) {
98+
currentClass = classNode;
99+
}
100+
101+
@Override
102+
public @Nullable AbstractPass prevPass() {
103+
return prevPass;
104+
}
105+
106+
@Override
107+
public void setPrevPass(@NotNull AbstractPass pass) {
108+
prevPass = pass;
109+
}
110+
}

morpher-api/src/main/java/com/github/luiox/morpher/transformer/ClassPass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
* Class级别的Pass
88
*/
99
public abstract class ClassPass implements AbstractPass {
10-
public abstract void run(@NotNull ClassNode classNode, @NotNull PassContext context);
10+
public abstract void run(@NotNull ClassNode classNode, @NotNull IPassContext context);
1111
}

morpher-api/src/main/java/com/github/luiox/morpher/transformer/GlobalPass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
*/
88
public abstract class GlobalPass implements AbstractPass {
99
// 全局级别的pass
10-
public abstract void run(@NotNull PassContext context);
10+
public abstract void run(@NotNull IPassContext context);
1111
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.github.luiox.morpher.transformer;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import org.jetbrains.annotations.Nullable;
5+
import org.objectweb.asm.tree.ClassNode;
6+
7+
public interface IPassContext {
8+
/**
9+
* 当前正在处理的ClassNode,只对MethodPass和ClassPass有效
10+
* @return 当前的ClassNode
11+
*/
12+
@NotNull ClassNode currentClass();
13+
14+
/**
15+
* 设置当前正在处理的ClassNode
16+
* @param classNode class
17+
*/
18+
void setCurrentClass(@NotNull ClassNode classNode);
19+
20+
/**
21+
* 上一个pass
22+
* @return 如果此pass是第一个pass,那么上一个pass是null
23+
*/
24+
default @Nullable AbstractPass prevPass(){
25+
return null;
26+
}
27+
28+
/**
29+
* 设置之前运行的pass
30+
* @param pass pass
31+
*/
32+
void setPrevPass(@NotNull AbstractPass pass);
33+
34+
35+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.github.luiox.morpher.transformer;
22

33
public interface IPassRunner {
4-
void transform(PassContext context);
4+
void transform(IPassContext context);
55
}

morpher-api/src/main/java/com/github/luiox/morpher/transformer/MethodPass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
* 方法级别的Pass
88
*/
99
public abstract class MethodPass implements AbstractPass {
10-
public abstract void run(@NotNull MethodNode methodNode, @NotNull PassContext context);
10+
public abstract void run(@NotNull MethodNode methodNode, @NotNull IPassContext context);
1111
}

0 commit comments

Comments
 (0)