summaryrefslogtreecommitdiff
path: root/src/main/java/ftbsc/lll/proxies/AbstractProxy.java
blob: 8baf1124a548330a2843b22fcdd22dd84ba294ca (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
112
113
114
115
116
117
118
119
package ftbsc.lll.proxies;

/**
 * Abstract proxy class, implementing common aspects
 * of {@link MethodProxy} and {@link FieldProxy}.
 * @since 0.3.0
 */
public abstract class AbstractProxy {

   /**
    * The SRG name of the corresponding class member.
    */
   private final String srgName;

   /**
    * The fully qualified name (i.e. java.lang.String) of
    * the parent class.
    */
   private final String parent;

   /**
    * The modifiers of the member, as a packed int.
    * @see java.lang.reflect.Modifier
    */
   private final int modifiers;

   /**
    * @return the SRG name of the item
    */
   public String getSrgName() {
      return this.srgName;
   }

   /**
    * @return the modifiers of the member, as a packed int
    * @see java.lang.reflect.Modifier
    */
   public int getModifiers() {
      return this.modifiers;
   }

   /**
    * @return the fully qualified name of the parent class
    */
   public String getParent() {
      return this.parent;
   }

   /**
    * @return the descriptor of the member
    */
   public abstract String getDescriptor();

   /**
    * The private constructor, should be called by all classes extending this in theirs.
    * @param srgName the SRG name of the member
    * @param modifiers the modifiers, as a packed int
    * @param parent the FQN of the parent class
    */
   protected AbstractProxy(String srgName, int modifiers, String parent) {
      this.srgName = srgName;
      this.modifiers = modifiers;
      this.parent = parent;
   }

   /**
    * A Builder for the generic proxy.
    * @param <T> the type of proxy
    */
   public abstract static class Builder<T extends AbstractProxy> {

      /**
       * The SRG name of the member.
       */
      protected final String srgName;

      /**
       * The modifiers of the member, as a packed int.
       */
      protected int modifiers;

      /**
       * The fully qualified name of the parent.
       */
      protected String parent;

      /**
       * The constructor.
       * @param srgName the SRG name of the member
       */
      protected Builder(String srgName) {
         this.srgName = srgName;
         this.modifiers = 0;
      }

      /**
       * @param parentFQN the fully qualified name of the parent
       * @return the current state of the builder
       */
      public Builder<T> setParent(String parentFQN) {
         this.parent = parentFQN;
         return this;
      }

      /**
       * @param newModifier the modifier to add
       * @return the current state of the builder
       */
      public Builder<T> addModifier(int newModifier) {
         this.modifiers |= newModifier;
         return this;
      }

      /**
       * @return the built proxy object
       */
      public abstract T build();
   }
}