| package com.intellij.compiler.instrumentation; |
| |
| import org.jetbrains.org.objectweb.asm.ClassWriter; |
| |
| /** |
| * @author Eugene Zhuravlev |
| * Date: 3/27/12 |
| */ |
| public class InstrumenterClassWriter extends ClassWriter { |
| private final InstrumentationClassFinder myFinder; |
| |
| public InstrumenterClassWriter(int flags, final InstrumentationClassFinder finder) { |
| super(flags); |
| myFinder = finder; |
| } |
| |
| protected String getCommonSuperClass(final String type1, final String type2) { |
| try { |
| final InstrumentationClassFinder.PseudoClass cls1 = myFinder.loadClass(type1); |
| final InstrumentationClassFinder.PseudoClass cls2 = myFinder.loadClass(type2); |
| if (cls1.isAssignableFrom(cls2)) { |
| return cls1.getName(); |
| } |
| if (cls2.isAssignableFrom(cls1)) { |
| return cls2.getName(); |
| } |
| if (cls1.isInterface() || cls2.isInterface()) { |
| return "java/lang/Object"; |
| } |
| else { |
| InstrumentationClassFinder.PseudoClass c = cls1; |
| do { |
| c = c.getSuperClass(); |
| } |
| while (!c.isAssignableFrom(cls2)); |
| return c.getName(); |
| } |
| } |
| catch (Exception e) { |
| throw new RuntimeException(e.toString(), e); |
| } |
| } |
| } |