DexAccessFlags.java revision 4a088921558b4e4bd4b27222e974fa72c76412cd
1// Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4package com.android.tools.r8.graph;
5
6import com.android.tools.r8.dex.Constants;
7
8public class DexAccessFlags {
9
10  private static final String[] ACC_NAMES = {
11      "public",
12      "private",
13      "protected",
14      "static",
15      "final",
16      "synchronized",
17      "volatile(bridge)",
18      "transient(varargs)",
19      "native",
20      "interface",
21      "abstract",
22      "strictfp",
23      "synthetic",
24      "annotation",
25      "enum",
26      "<unused>",
27      "<init>",
28      "synchronized",
29  };
30
31  private int flags;
32
33  public DexAccessFlags(int flags) {
34    this.flags = flags;
35  }
36
37  public DexAccessFlags(int... flags) {
38    this(combineFlags(flags));
39  }
40
41  private static int combineFlags(int[] flags) {
42    int combined = 0;
43    for (int flag : flags) {
44      combined |= flag;
45    }
46    return combined;
47  }
48
49  @Override
50  public boolean equals(Object other) {
51    if (other instanceof DexAccessFlags) {
52      return flags == ((DexAccessFlags) other).flags;
53    }
54    return false;
55  }
56
57  @Override
58  public int hashCode() {
59    return get();
60  }
61
62  public int get() {
63    return flags;
64  }
65
66  public boolean containsAllOf(DexAccessFlags other) {
67    return (flags & other.get()) == other.get();
68  }
69
70  public boolean containsNoneOf(DexAccessFlags other) {
71    return (flags & other.get()) == 0;
72  }
73
74  public boolean isPublic() {
75    return isSet(Constants.ACC_PUBLIC);
76  }
77
78  public void setPublic() {
79    set(Constants.ACC_PUBLIC);
80  }
81
82  public void unsetPublic() {
83    unset(Constants.ACC_PUBLIC);
84  }
85
86  public boolean isPrivate() {
87    return isSet(Constants.ACC_PRIVATE);
88  }
89
90  public void setPrivate() {
91    set(Constants.ACC_PRIVATE);
92  }
93
94  public void unsetPrivate() {
95    unset(Constants.ACC_PRIVATE);
96  }
97
98  public boolean isProtected() {
99    return isSet(Constants.ACC_PROTECTED);
100  }
101
102  public void setProtected() {
103    set(Constants.ACC_PROTECTED);
104  }
105
106  public void unsetProtected() {
107    unset(Constants.ACC_PROTECTED);
108  }
109
110  public boolean isStatic() {
111    return isSet(Constants.ACC_STATIC);
112  }
113
114  public void setStatic() {
115    set(Constants.ACC_STATIC);
116  }
117
118  public boolean isFinal() {
119    return isSet(Constants.ACC_FINAL);
120  }
121
122  public void setFinal() {
123    set(Constants.ACC_FINAL);
124  }
125
126  public void unsetFinal() {
127    unset(Constants.ACC_FINAL);
128  }
129
130  public boolean isSynchronized() {
131    return isSet(Constants.ACC_SYNCHRONIZED);
132  }
133
134  public void setSynchronized() {
135    set(Constants.ACC_SYNCHRONIZED);
136  }
137
138  public void unsetSynchronized() {
139    unset(Constants.ACC_SYNCHRONIZED);
140  }
141
142  public boolean isVolatile() {
143    return isSet(Constants.ACC_VOLATILE);
144  }
145
146  public void setVolatile() {
147    set(Constants.ACC_VOLATILE);
148  }
149
150  public boolean isBridge() {
151    return isSet(Constants.ACC_BRIDGE);
152  }
153
154  public void setBridge() {
155    set(Constants.ACC_BRIDGE);
156  }
157
158  public void unsetBridge() {
159    unset(Constants.ACC_BRIDGE);
160  }
161
162  public boolean isTransient() {
163    return isSet(Constants.ACC_TRANSIENT);
164  }
165
166  public void setTransient() {
167    set(Constants.ACC_TRANSIENT);
168  }
169
170  public boolean isVarargs() {
171    return isSet(Constants.ACC_VARARGS);
172  }
173
174  public void setVarargs() {
175    set(Constants.ACC_VARARGS);
176  }
177
178  public boolean isNative() {
179    return isSet(Constants.ACC_NATIVE);
180  }
181
182  public void setNative() {
183    set(Constants.ACC_NATIVE);
184  }
185
186  public boolean isInterface() {
187    return isSet(Constants.ACC_INTERFACE);
188  }
189
190  public void setInterface() {
191    set(Constants.ACC_INTERFACE);
192  }
193
194  public void unsetInterface() {
195    unset(Constants.ACC_INTERFACE);
196  }
197
198  public boolean isAbstract() {
199    return isSet(Constants.ACC_ABSTRACT);
200  }
201
202  public void setAbstract() {
203    set(Constants.ACC_ABSTRACT);
204  }
205
206  public void unsetAbstract() {
207    unset(Constants.ACC_ABSTRACT);
208  }
209
210  public boolean isStrict() {
211    return isSet(Constants.ACC_STRICT);
212  }
213
214  public void setStrict() {
215    set(Constants.ACC_STRICT);
216  }
217
218  public boolean isSynthetic() {
219    return isSet(Constants.ACC_SYNTHETIC);
220  }
221
222  public void setSynthetic() {
223    set(Constants.ACC_SYNTHETIC);
224  }
225
226  public void unsetSynthetic() {
227    unset(Constants.ACC_SYNTHETIC);
228  }
229
230  public boolean isAnnotation() {
231    return isSet(Constants.ACC_ANNOTATION);
232  }
233
234  public void setAnnotation() {
235    set(Constants.ACC_ANNOTATION);
236  }
237
238  public boolean isEnum() {
239    return isSet(Constants.ACC_ENUM);
240  }
241
242  public void setEnum() {
243    set(Constants.ACC_ENUM);
244  }
245
246  public boolean isConstructor() {
247    return isSet(Constants.ACC_CONSTRUCTOR);
248  }
249
250  public void setConstructor() {
251    set(Constants.ACC_CONSTRUCTOR);
252  }
253
254  public void unsetConstructor() {
255    unset(Constants.ACC_CONSTRUCTOR);
256  }
257
258  public boolean isDeclaredSynchronized() {
259    return isSet(Constants.ACC_DECLARED_SYNCHRONIZED);
260  }
261
262  public void setDeclaredSynchronized() {
263    set(Constants.ACC_DECLARED_SYNCHRONIZED);
264  }
265
266  public void promoteNonPrivateToPublic() {
267    if (!isPrivate()) {
268      flags &= ~Constants.ACC_PROTECTED;
269      flags |= Constants.ACC_PUBLIC;
270    }
271  }
272
273  public void promoteToPublic() {
274    flags &= ~Constants.ACC_PROTECTED & ~Constants.ACC_PRIVATE;
275    flags |= Constants.ACC_PUBLIC;
276  }
277
278  private boolean isSet(int flag) {
279    return (flags & flag) != 0;
280  }
281
282  private void set(int flag) {
283    flags |= flag;
284  }
285
286  private void unset(int flag) {
287    flags &= ~flag;
288  }
289
290  @Override
291  public String toString() {
292    StringBuilder builder = new StringBuilder();
293    int flags = this.flags;
294    flags &= ~Constants.ACC_CONSTRUCTOR;  // Don't include the constructor flag in the string.
295    for (int i = 0; i < ACC_NAMES.length && flags != 0; i++, flags >>= 1) {
296      if ((flags & 0x1) != 0) {
297        if (builder.length() > 0) {
298          builder.append(' ');
299        }
300        builder.append(ACC_NAMES[i]);
301      }
302    }
303    assert flags == 0;
304    return builder.toString();
305  }
306
307  public String toSmaliString() {
308    return toString();
309  }
310}
311