public static void renameClassNode(final String oldName, final String newName) { for (ClassNode c : BytecodeViewer.getLoadedClasses()) { for (Object oo : c.innerClasses) { InnerClassNode innerClassNode = (InnerClassNode) oo; if (innerClassNode.innerName != null && innerClassNode.innerName.equals(oldName)) { innerClassNode.innerName = newName; } if (innerClassNode.name.equals(oldName)) { innerClassNode.name = newName; } if (innerClassNode.outerName != null && innerClassNode.outerName.equals(oldName)) { innerClassNode.outerName = newName; } } if (c.signature != null) c.signature = c.signature.replace(oldName, newName); if (c.superName.equals(oldName)) { c.superName = newName; } for (Object o : c.fields.toArray()) { FieldNode f = (FieldNode) o; f.desc = f.desc.replace(oldName, newName); } for (Object o : c.interfaces.toArray()) { String truxerLipton = (String) o; truxerLipton = truxerLipton.replace(oldName, newName); } for (Object o : c.methods.toArray()) { MethodNode m = (MethodNode) o; if (m.localVariables != null) { for (LocalVariableNode node : (List<LocalVariableNode>) m.localVariables) { node.desc = node.desc.replace(oldName, newName); } } if (m.signature != null) m.signature = m.signature.replace(oldName, newName); for (int i = 0; i < m.exceptions.size(); i++) { if (m.exceptions.get(i).equals(oldName)) m.exceptions.set(i, newName); } for (AbstractInsnNode i : m.instructions.toArray()) { if (i instanceof TypeInsnNode) { TypeInsnNode t = (TypeInsnNode) i; if (t.desc.equals(oldName)) { t.desc = newName; } } if (i instanceof MethodInsnNode) { MethodInsnNode mi = (MethodInsnNode) i; if (mi.owner.equals(oldName)) mi.owner = newName; mi.desc = mi.desc.replace(oldName, newName); } if (i instanceof FieldInsnNode) { FieldInsnNode fi = (FieldInsnNode) i; if (fi.owner.equals(oldName)) fi.owner = newName; fi.desc = fi.desc.replace(oldName, newName); } } } } }
public void visitConstructorCallExpression(ConstructorCallExpression call) { isSpecialConstructorCall = call.isSpecialCall(); super.visitConstructorCallExpression(call); isSpecialConstructorCall = false; if (!call.isUsingAnonymousInnerClass()) return; pushState(); InnerClassNode innerClass = (InnerClassNode) call.getType(); innerClass.setVariableScope(currentScope); for (MethodNode method : innerClass.getMethods()) { Parameter[] parameters = method.getParameters(); if (parameters.length == 0) parameters = null; // null means no implicit "it" ClosureExpression cl = new ClosureExpression(parameters, method.getCode()); visitClosureExpression(cl); } for (FieldNode field : innerClass.getFields()) { final Expression expression = field.getInitialExpression(); if (expression != null) { expression.visit(this); } } for (Statement statement : innerClass.getObjectInitializerStatements()) { statement.visit(this); } markClosureSharedVariables(); popState(); }
public void visitClass(ClassNode node) { // AIC are already done, doing them here again will lead // to wrong scopes if (node instanceof InnerClassNode) { InnerClassNode in = (InnerClassNode) node; if (in.isAnonymous()) return; } pushState(); prepareVisit(node); super.visitClass(node); popState(); }
@Override public void visitClass(final ClassNode node) { boolean skip = shouldSkipClassNode(node); if (!skip && !anyMethodSkip(node)) { node.putNodeMetaData(MopWriter.Factory.class, StaticCompilationMopWriter.FACTORY); } ClassNode oldCN = classNode; classNode = node; Iterator<InnerClassNode> innerClasses = classNode.getInnerClasses(); while (innerClasses.hasNext()) { InnerClassNode innerClassNode = innerClasses.next(); boolean innerStaticCompile = !(skip || isSkippedInnerClass(innerClassNode)); innerClassNode.putNodeMetaData(STATIC_COMPILE_NODE, innerStaticCompile); innerClassNode.putNodeMetaData( WriterControllerFactory.class, node.getNodeMetaData(WriterControllerFactory.class)); if (innerStaticCompile && !anyMethodSkip(innerClassNode)) { innerClassNode.putNodeMetaData(MopWriter.Factory.class, StaticCompilationMopWriter.FACTORY); } } super.visitClass(node); addPrivateFieldAndMethodAccessors(node); classNode = oldCN; }
private boolean isAnonymousInnerClass(ClassNode enumClass) { if (!(enumClass instanceof EnumConstantClassNode)) return false; InnerClassNode ic = (InnerClassNode) enumClass; return ic.getVariableScope() == null; }