/******************************************************************************* * Copyright (c) 2010 Eric Bodden. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eric Bodden - initial API and implementation ******************************************************************************/ /** * */ package de.bodden.tamiflex.normalizer; import static de.bodden.tamiflex.normalizer.Hasher.containsGeneratedClassName; import static de.bodden.tamiflex.normalizer.Hasher.slashed; import java.util.Set; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.commons.Remapper; import org.objectweb.asm.commons.RemappingClassAdapter; import de.bodden.tamiflex.normalizer.RemappingStringConstantAdapter; import de.bodden.tamiflex.normalizer.StringRemapper; public final class ReferencedClassesExtracter extends RemappingClassAdapter { private final Set<String> res; public ReferencedClassesExtracter(ClassVisitor cv, final Set<String> res) { super(cv, new Remapper() { @Override public String map(String typeName) { if(containsGeneratedClassName(typeName)) res.add(typeName); return super.map(typeName); } }); this.res = res; } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); mv = new RemappingStringConstantAdapter(mv, new StringRemapper() { @Override public String remapStringConstant(String constant) { String slashed = slashed(constant); if(containsGeneratedClassName(slashed)) res.add(slashed); return super.remapStringConstant(constant); } }); return mv; } public String getClassName () { return className; } }