■ ■ ■ ■ ■ ■
jadx-core/src/main/java/jadx/core/codegen/NameGen.java
| skipped 6 lines |
7 | 7 | | |
8 | 8 | | import jadx.core.Consts; |
9 | 9 | | import jadx.core.deobf.NameMapper; |
| 10 | + | import jadx.core.dex.attributes.AFlag; |
10 | 11 | | import jadx.core.dex.attributes.nodes.LoopLabelAttr; |
11 | 12 | | import jadx.core.dex.info.ClassInfo; |
12 | 13 | | import jadx.core.dex.info.MethodInfo; |
| skipped 160 lines |
173 | 174 | | |
174 | 175 | | private String makeNameForType(ArgType type) { |
175 | 176 | | if (type.isPrimitive()) { |
176 | | - | return makeNameForPrimitive(type); |
| 177 | + | return type.getPrimitiveType().getShortName().toLowerCase(); |
177 | 178 | | } |
178 | 179 | | if (type.isArray()) { |
179 | 180 | | return makeNameForType(type.getArrayRootElement()) + "Arr"; |
180 | 181 | | } |
181 | 182 | | return makeNameForObject(type); |
182 | | - | } |
183 | | - | |
184 | | - | private static String makeNameForPrimitive(ArgType type) { |
185 | | - | return type.getPrimitiveType().getShortName().toLowerCase(); |
186 | 183 | | } |
187 | 184 | | |
188 | 185 | | private String makeNameForObject(ArgType type) { |
| skipped 5 lines |
194 | 191 | | if (alias != null) { |
195 | 192 | | return alias; |
196 | 193 | | } |
197 | | - | ClassInfo extClsInfo = ClassInfo.fromType(mth.root(), type); |
198 | | - | String shortName = extClsInfo.getShortName(); |
199 | | - | String vName = fromName(shortName); |
200 | | - | if (vName != null) { |
201 | | - | return vName; |
202 | | - | } |
203 | | - | if (shortName != null) { |
204 | | - | String lower = StringUtils.escape(shortName.toLowerCase()); |
205 | | - | if (shortName.equals(lower)) { |
206 | | - | return lower + "Var"; |
207 | | - | } |
208 | | - | return lower; |
209 | | - | } |
| 194 | + | return makeNameForCheckedClass(ClassInfo.fromType(mth.root(), type)); |
210 | 195 | | } |
211 | 196 | | return StringUtils.escape(type.toString()); |
212 | 197 | | } |
213 | 198 | | |
| 199 | + | private String makeNameForCheckedClass(ClassInfo classInfo) { |
| 200 | + | String shortName = classInfo.getAliasShortName(); |
| 201 | + | String vName = fromName(shortName); |
| 202 | + | if (vName != null) { |
| 203 | + | return vName; |
| 204 | + | } |
| 205 | + | String lower = StringUtils.escape(shortName.toLowerCase()); |
| 206 | + | if (shortName.equals(lower)) { |
| 207 | + | return lower + "Var"; |
| 208 | + | } |
| 209 | + | return lower; |
| 210 | + | } |
| 211 | + | |
| 212 | + | private String makeNameForClass(ClassInfo classInfo) { |
| 213 | + | String alias = getAliasForObject(classInfo.getFullName()); |
| 214 | + | if (alias != null) { |
| 215 | + | return alias; |
| 216 | + | } |
| 217 | + | return makeNameForCheckedClass(classInfo); |
| 218 | + | } |
| 219 | + | |
214 | 220 | | private static String fromName(String name) { |
215 | 221 | | if (name == null || name.isEmpty()) { |
216 | 222 | | return null; |
| skipped 24 lines |
241 | 247 | | |
242 | 248 | | case CONSTRUCTOR: |
243 | 249 | | ConstructorInsn co = (ConstructorInsn) insn; |
244 | | - | return makeNameForObject(co.getClassType().getType()); |
| 250 | + | MethodNode callMth = mth.root().getMethodUtils().resolveMethod(co); |
| 251 | + | if (callMth != null && callMth.contains(AFlag.ANONYMOUS_CONSTRUCTOR)) { |
| 252 | + | // don't use name of anonymous class |
| 253 | + | return null; |
| 254 | + | } |
| 255 | + | return makeNameForClass(co.getClassType()); |
245 | 256 | | |
246 | 257 | | case ARRAY_LENGTH: |
247 | 258 | | return "length"; |
| skipped 19 lines |
267 | 278 | | } |
268 | 279 | | |
269 | 280 | | private String makeNameFromInvoke(MethodInfo callMth) { |
270 | | - | String name = callMth.getName(); |
271 | | - | ArgType declType = callMth.getDeclClass().getType(); |
| 281 | + | String name = callMth.getAlias(); |
| 282 | + | ClassInfo declClass = callMth.getDeclClass(); |
272 | 283 | | if ("getInstance".equals(name)) { |
273 | 284 | | // e.g. Cipher.getInstance |
274 | | - | return makeNameForType(declType); |
| 285 | + | return makeNameForClass(declClass); |
275 | 286 | | } |
276 | 287 | | if (name.startsWith("get") || name.startsWith("set")) { |
277 | 288 | | return fromName(name.substring(3)); |
| skipped 2 lines |
280 | 291 | | return "it"; |
281 | 292 | | } |
282 | 293 | | if ("toString".equals(name)) { |
283 | | - | return makeNameForType(declType); |
| 294 | + | return makeNameForClass(declClass); |
284 | 295 | | } |
285 | | - | if ("forName".equals(name) && declType.equals(ArgType.CLASS)) { |
| 296 | + | if ("forName".equals(name) && declClass.getType().equals(ArgType.CLASS)) { |
286 | 297 | | return OBJ_ALIAS.get(Consts.CLASS_CLASS); |
287 | 298 | | } |
288 | 299 | | if (name.startsWith("to")) { |
| skipped 6 lines |