public EnumNameCallChecker(JProgram jprogram, TreeLogger logger) { this.logger = logger; this.enumNameMethod = jprogram.getIndexedMethod("Enum.name"); this.enumToStringMethod = jprogram.getIndexedMethod("Enum.toString"); this.classType = jprogram.getIndexedType("Class"); this.enumType = jprogram.getIndexedType("Enum"); this.stringType = jprogram.getIndexedType("String"); /* * Find the correct version of enumValueOfMethod. * * Note: it doesn't work to check against a ref returned by * jprogram.getIndexedMethod("Enum.valueOf"), since there are 2 different * versions of Enum.valueOf in our jre emulation library, and the indexed * ref won't reliably flag the public instance, which is the one we want * here (i.e. Enum.valueOf(Class<T>,String)). The other version is * protected, but is called by the generated constructors for sub-classes * of Enum, and we don't want to warn for those cases. */ JMethod foundMethod = null; List<JMethod> enumMethods = enumType.getMethods(); for (JMethod enumMethod : enumMethods) { if ("valueOf".equals(enumMethod.getName())) { List<JParameter> jParameters = enumMethod.getParams(); if (jParameters.size() == 2 && jParameters.get(0).getType() == classType && jParameters.get(1).getType() == stringType) { foundMethod = enumMethod; break; } } } this.enumValueOfMethod = foundMethod; }
public void exec() { accept(jprogram.getIndexedMethod("Enum.name")); }
public EnumNameReplacer(JProgram jprogram, TreeLogger logger) { this.logger = logger; this.jprogram = jprogram; this.enumType = (JClassType) jprogram.getIndexedType("Enum"); this.enumObfuscatedName = jprogram.getIndexedMethod("Enum.obfuscatedName"); }