void (ClassNode root, ClassNode node) { // hide synthetic lambda content methods if (node.type == ClassNode.CLASS_LAMBDA && !node.lambdaInformation.is_method_reference) { ClassNode node_content = DecompilerContext.getClassProcessor().getMapRootClasses().get(node.classStruct.qualifiedName); if (node_content != null && node_content.getWrapper() != null) { node_content.getWrapper().getHiddenMembers().add(node.lambdaInformation.content_method_key); } } if (node.nested.isEmpty()) { return; } if (node.type != ClassNode.CLASS_LAMBDA) { computeLocalVarsAndDefinitions(node); // for each local or anonymous class ensure not empty enclosing method checkNotFoundClasses(root, node); } int nameless = 0, synthetics = 0; for (ClassNode child : node.nested) { StructClass cl = child.classStruct; // ensure not-empty class name if ((child.type == ClassNode.CLASS_LOCAL || child.type == ClassNode.CLASS_MEMBER) && child.simpleName == null) { if ((child.access & CodeConstants.ACC_SYNTHETIC) != 0 || cl.isSynthetic()) { child.simpleName = "SyntheticClass_" + (++synthetics); } else { String message = "Nameless local or member class " + cl.qualifiedName + "!"; DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN); child.simpleName = "NamelessClass_" + (++nameless); } } } for (ClassNode child : node.nested) { if (child.type == ClassNode.CLASS_LAMBDA) { setLambdaVars(node, child); } else if (child.type != ClassNode.CLASS_MEMBER || (child.access & CodeConstants.ACC_STATIC) == 0) { insertLocalVars(node, child); if (child.type == ClassNode.CLASS_LOCAL && child.enclosingMethod != null) { MethodWrapper enclosingMethodWrapper = node.getWrapper().getMethods().getWithKey(child.enclosingMethod); if(enclosingMethodWrapper != null) { // e.g. in case of switch-on-enum. FIXME: some proper handling of multiple enclosing classes setLocalClassDefinition(enclosingMethodWrapper, child); } } } } for (ClassNode child : node.nested) { processClass(root, child); } }