/** * Get a method's signature for dead code elimination purposes. * * <p>Since DeadCodeEliminator runs before InnerClassExtractor, inner class constructors do not * yet have the parameter for capturing outer class, and therefore we need this special case. */ public static String getProGuardSignature(IMethodBinding binding) { StringBuilder sb = new StringBuilder("("); // If the method is an inner class constructor, prepend the outer class type. if (binding.isConstructor()) { ITypeBinding declClass = binding.getDeclaringClass(); ITypeBinding outerClass = declClass.getDeclaringClass(); if (outerClass != null && !declClass.isInterface() && !declClass.isAnnotation() && !Modifier.isStatic(declClass.getModifiers())) { appendParameterSignature(outerClass.getErasure(), sb); } } appendParametersSignature(binding, sb); sb.append(')'); appendReturnTypeSignature(binding, sb); return sb.toString(); }
@Override public boolean visit(ClassInstanceCreation node) { ITypeBinding newType = node.getTypeBinding().getTypeDeclaration(); ITypeBinding declaringClass = newType.getDeclaringClass(); if (Modifier.isStatic(newType.getModifiers()) || declaringClass == null) { return true; } GeneratedMethodBinding binding = new GeneratedMethodBinding(node.getMethodBinding().getMethodDeclaration()); node.setMethodBinding(binding); addOuterArg(node, binding, declaringClass); for (IVariableBinding capturedVar : getCapturedVariables(node)) { node.getArguments().add(new SimpleName(capturedVar)); binding.addParameter(capturedVar.getType()); } assert binding.isVarargs() || node.getArguments().size() == binding.getParameterTypes().length; return true; }