Given a class, map of other classes, and a naming convention tries to link classes together. Classes that aren't renamed that aren't inner classes are renamed according to the given naming convention. @param mappedClass @param mappedClasses @param mode @return
(MappedClass mappedClass, Map<String, MappedClass> mappedClasses, MappingMode mode)
| 203 | * @return |
| 204 | */ |
| 205 | private static Map<String, MappedClass> fillGap(MappedClass mappedClass, Map<String, MappedClass> mappedClasses, MappingMode mode) { |
| 206 | // If already renamed, pass |
| 207 | if (mappedClass.isTruelyRenamed()) { |
| 208 | return mappedClasses; |
| 209 | } |
| 210 | // Map interfaces |
| 211 | for (MappedClass interfaceClass : mappedClass.getInterfaces()) { |
| 212 | mappedClasses = fillGap(interfaceClass, mappedClasses, mode); |
| 213 | } |
| 214 | // Map the parents |
| 215 | MappedClass parent = mappedClass.getParent(); |
| 216 | if (parent != null && !parent.isRenamed()) { |
| 217 | mappedClasses = fillGap(parent, mappedClasses, mode); |
| 218 | // Update parent |
| 219 | parent = mappedClasses.get(parent.getOriginalName()); |
| 220 | } |
| 221 | // Map name for inner class |
| 222 | if (mappedClass.isInnerClass()) { |
| 223 | MappedClass outerClass = mappedClass.getOuterClass(); |
| 224 | mappedClasses = fillGap(outerClass, mappedClasses, mode); |
| 225 | if (mappedClass.getOriginalName().contains("$")) { |
| 226 | String post = mappedClass.getOriginalName().substring(mappedClass.getOriginalName().indexOf("$") + 1); |
| 227 | mappedClass.setNewName(mappedClass.getOuterClass().getNewName() + "$" + post); |
| 228 | } else { |
| 229 | int index = 0; |
| 230 | for (String name : mappedClass.getOuterClass().getInnerClassMap().keySet()) { |
| 231 | index += 1; |
| 232 | if (name.equals(mappedClass.getOriginalName())) { |
| 233 | break; |
| 234 | } |
| 235 | } |
| 236 | mappedClass.setNewName(mappedClass.getOuterClass().getNewName() + "$" + index); |
| 237 | } |
| 238 | } else { |
| 239 | // Normal class |
| 240 | String newNameClass = mode.getClassName(mappedClass); |
| 241 | if (parent != null) { |
| 242 | // Move next to parent. Organizes packages and is less likely to |
| 243 | // cass AccessErrors for non-public methods. |
| 244 | String newNamePackage = parent.getNewName().substring(0, parent.getNewName().lastIndexOf("/") + 1); |
| 245 | if (newNameClass.contains("/")) { |
| 246 | newNameClass = newNameClass.substring(newNameClass.lastIndexOf("/") + 1); |
| 247 | } |
| 248 | mappedClass.setNewName(newNamePackage + newNameClass); |
| 249 | } else { |
| 250 | // Check for interfaces. Put them in that package if there is |
| 251 | // one or they all are in the same package. |
| 252 | if (mappedClass.getInterfaces().size() > 0) { |
| 253 | String s = null; |
| 254 | boolean failed = false; |
| 255 | for (MappedClass interfaceClass : mappedClass.getInterfaces()) { |
| 256 | int index = interfaceClass.getNewName().lastIndexOf("/"); |
| 257 | if (index == -1) { |
| 258 | continue; |
| 259 | } |
| 260 | if (s == null) { |
| 261 | s = interfaceClass.getNewName().substring(0, index); |
| 262 | } else { |
no test coverage detected