summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/mapping/EntryFactory.java
blob: 2351dcfbb0031341ebf65a20023ff54dc1ca218c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*******************************************************************************
 * Copyright (c) 2015 Jeff Martin.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser General Public
 * License v3.0 which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl.html
 * <p>
 * Contributors:
 * Jeff Martin - initial API and implementation
 ******************************************************************************/
package cuchaz.enigma.mapping;

import cuchaz.enigma.analysis.JarIndex;
import javassist.*;
import javassist.bytecode.Descriptor;
import javassist.expr.ConstructorCall;
import javassist.expr.FieldAccess;
import javassist.expr.MethodCall;
import javassist.expr.NewExpr;

public class EntryFactory {

    public static ClassEntry getClassEntry(CtClass c) {
        return new ClassEntry(Descriptor.toJvmName(c.getName()));
    }

    public static ClassEntry getObfClassEntry(JarIndex jarIndex, ClassMapping classMapping) {
        ClassEntry obfClassEntry = new ClassEntry(classMapping.getObfFullName());
        return obfClassEntry.buildClassEntry(jarIndex.getObfClassChain(obfClassEntry));
    }

    private static ClassEntry getObfClassEntry(ClassMapping classMapping) {
        return new ClassEntry(classMapping.getObfFullName());
    }

    public static ClassEntry getSuperclassEntry(CtClass c) {
        return new ClassEntry(Descriptor.toJvmName(c.getClassFile().getSuperclass()));
    }

    public static FieldEntry getFieldEntry(CtField field) {
        return new FieldEntry(getClassEntry(field.getDeclaringClass()), field.getName(), new Type(field.getFieldInfo().getDescriptor()));
    }

    public static FieldEntry getFieldEntry(FieldAccess call) {
        return new FieldEntry(new ClassEntry(Descriptor.toJvmName(call.getClassName())), call.getFieldName(), new Type(call.getSignature()));
    }

    public static FieldEntry getFieldEntry(String className, String name, String type) {
        return new FieldEntry(new ClassEntry(className), name, new Type(type));
    }

    public static FieldEntry getObfFieldEntry(ClassMapping classMapping, FieldMapping fieldMapping) {
        return new FieldEntry(getObfClassEntry(classMapping), fieldMapping.getObfName(), fieldMapping.getObfType());
    }

    public static MethodEntry getMethodEntry(CtMethod method) {
        return new MethodEntry(getClassEntry(method.getDeclaringClass()), method.getName(), new Signature(method.getMethodInfo().getDescriptor()));
    }

    public static MethodEntry getMethodEntry(MethodCall call) {
        return new MethodEntry(new ClassEntry(Descriptor.toJvmName(call.getClassName())), call.getMethodName(), new Signature(call.getSignature()));
    }

    public static ConstructorEntry getConstructorEntry(CtConstructor constructor) {
        if (constructor.isClassInitializer()) {
            return new ConstructorEntry(getClassEntry(constructor.getDeclaringClass()));
        } else {
            return new ConstructorEntry(getClassEntry(constructor.getDeclaringClass()), new Signature(constructor.getMethodInfo().getDescriptor()));
        }
    }

    public static ConstructorEntry getConstructorEntry(ConstructorCall call) {
        return new ConstructorEntry(new ClassEntry(Descriptor.toJvmName(call.getClassName())), new Signature(call.getSignature()));
    }

    public static ConstructorEntry getConstructorEntry(NewExpr call) {
        return new ConstructorEntry(new ClassEntry(Descriptor.toJvmName(call.getClassName())), new Signature(call.getSignature()));
    }

    public static BehaviorEntry getBehaviorEntry(CtBehavior behavior) {
        if (behavior instanceof CtMethod) {
            return getMethodEntry((CtMethod) behavior);
        } else if (behavior instanceof CtConstructor) {
            return getConstructorEntry((CtConstructor) behavior);
        }
        throw new Error("behavior is neither Method nor Constructor!");
    }

    public static BehaviorEntry getBehaviorEntry(String className, String behaviorName, String behaviorSignature) {
        return getBehaviorEntry(new ClassEntry(className), behaviorName, new Signature(behaviorSignature));
    }

    public static BehaviorEntry getBehaviorEntry(String className) {
        return new ConstructorEntry(new ClassEntry(className));
    }

    public static BehaviorEntry getBehaviorEntry(ClassEntry classEntry, String behaviorName, Signature behaviorSignature) {
        switch (behaviorName) {
            case "<init>":
                return new ConstructorEntry(classEntry, behaviorSignature);
            case "<clinit>":
                return new ConstructorEntry(classEntry);
            default:
                return new MethodEntry(classEntry, behaviorName, behaviorSignature);
        }
    }

    public static BehaviorEntry getObfBehaviorEntry(ClassEntry classEntry, MethodMapping methodMapping) {
        return getBehaviorEntry(classEntry, methodMapping.getObfName(), methodMapping.getObfSignature());
    }
}