ASM v3 (IDEADEV-10509)

This commit is contained in:
Dmitry Jemerov
2007-08-17 20:06:41 +04:00
parent 705783e129
commit 401fd19426
16 changed files with 211 additions and 92 deletions
@@ -64,6 +64,7 @@ public class AsmCodeGenerator {
private NestedFormLoader myFormLoader;
private final boolean myIgnoreCustomCreation;
private final ClassWriter myClassWriter;
static {
myContainerLayoutCodeGenerators.put(UIFormXmlConstants.LAYOUT_INTELLIJ, new GridLayoutCodeGenerator());
@@ -92,7 +93,8 @@ public class AsmCodeGenerator {
public AsmCodeGenerator(LwRootContainer rootContainer,
ClassLoader loader,
NestedFormLoader formLoader,
final boolean ignoreCustomCreation) {
final boolean ignoreCustomCreation,
final ClassWriter classWriter) {
myFormLoader = formLoader;
myIgnoreCustomCreation = ignoreCustomCreation;
if (loader == null){
@@ -106,6 +108,7 @@ public class AsmCodeGenerator {
myErrors = new ArrayList();
myWarnings = new ArrayList();
myClassWriter = classWriter;
}
public void patchFile(final File classFile) {
@@ -173,11 +176,10 @@ public class AsmCodeGenerator {
}
FirstPassClassVisitor visitor = new FirstPassClassVisitor();
reader.accept(visitor, true);
reader.accept(visitor, 0);
ClassWriter cw = new ClassWriter(true);
reader.accept(new FormClassVisitor(cw, visitor.isExplicitSetupCall()), false);
myPatchedData = cw.toByteArray();
reader.accept(new FormClassVisitor(myClassWriter, visitor.isExplicitSetupCall()), 0);
myPatchedData = myClassWriter.toByteArray();
return myPatchedData;
}
@@ -0,0 +1,64 @@
package com.intellij.compiler;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiManager;
import com.intellij.psi.util.ClassUtil;
import org.jetbrains.annotations.NonNls;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
/**
* @author yole
*/
public class PsiClassWriter extends ClassWriter {
private Project myProject;
public PsiClassWriter(final Project project, int flags) {
super(flags);
myProject = project;
}
public PsiClassWriter(final Project project, ClassReader classReader, int flags) {
super(classReader, flags);
myProject = project;
}
protected String getCommonSuperClass(final String type1, final String type2) {
//PsiManager.getInstance(myProject).findClass(type1.replace('/', '.').replace('$', '.'), myProject.getAllScope());
return ApplicationManager.getApplication().runReadAction(new Computable<String>() {
@NonNls
public String compute() {
final PsiManager manager = PsiManager.getInstance(myProject);
PsiClass c = ClassUtil.findPsiClassByJVMName(manager, type1);
if (c == null) {
return "java/lang/Object";
}
PsiClass d = ClassUtil.findPsiClassByJVMName(manager, type2);
if (d == null) {
return "java/lang/Object";
}
if (c.isInheritor(d, true)) {
return ClassUtil.getJVMClassName(d).replace('.', '/');
}
if (d.isInheritor(c, true)) {
return ClassUtil.getJVMClassName(c).replace('.', '/');
}
if (c.isInterface() || d.isInterface()) {
return "java/lang/Object";
}
do {
c = c.getSuperClass();
}
while (c != null && !d.isInheritor(c, true));
if (c == null) {
return "java/lang/Object";
}
return ClassUtil.getJVMClassName(c).replace('.', '/');
}
});
}
}
+4 -3
View File
@@ -152,7 +152,8 @@ public class Javac2 extends Javac{
class2form.put(classToBind, formFile);
final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, loader,
new AntNestedFormLoader(loader), false);
new AntNestedFormLoader(loader), false,
new ClassWriter(ClassWriter.COMPUTE_FRAMES));
codeGenerator.patchFile(classFile);
final FormErrorInfo[] warnings = codeGenerator.getWarnings();
@@ -186,10 +187,10 @@ public class Javac2 extends Javac{
final FileInputStream inputStream = new FileInputStream(file);
try {
ClassReader reader = new ClassReader(inputStream);
ClassWriter writer = new ClassWriter(true);
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
final NotNullVerifyingInstrumenter instrumenter = new NotNullVerifyingInstrumenter(writer);
reader.accept(instrumenter, false);
reader.accept(instrumenter, 0);
if (instrumenter.isModification()) {
final FileOutputStream fileOutputStream = new FileOutputStream(path);
try {
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
@@ -105,7 +105,51 @@ public class ClassUtil {
return result[0];
}
public static PsiClass findNonQualifiedClassByIndex(final String indexName, @NotNull final PsiClass contaningClass) {
public static PsiClass findNonQualifiedClassByIndex(final String indexName, @NotNull final PsiClass containingClass) {
return findNonQualifiedClassByIndex(indexName, containingClass, false);
}
public static PsiClass findNonQualifiedClassByIndex(final String indexName, @NotNull final PsiClass containingClass,
final boolean jvmCompatible) {
String prefix = getDigitPrefix(indexName);
final int idx = prefix.length() > 0 ? Integer.parseInt(prefix) : -1;
final String name = prefix.length() < indexName.length() ? indexName.substring(prefix.length()) : null;
final PsiClass[] result = new PsiClass[1];
containingClass.accept(new PsiRecursiveElementVisitor() {
private int myCurrentIdx = 0;
public void visitElement(PsiElement element) {
if (result[0] == null) {
super.visitElement(element);
}
}
public void visitClass(PsiClass aClass) {
if (aClass == containingClass) {
super.visitClass(aClass);
return;
}
if (aClass.getQualifiedName() == null && Comparing.strEqual(name, aClass.getName())) {
myCurrentIdx++;
if (myCurrentIdx == idx || idx == -1) {
result[0] = aClass;
}
}
}
public void visitTypeParameter(final PsiTypeParameter classParameter) {
if (!jvmCompatible) {
super.visitTypeParameter(classParameter);
}
else {
visitElement(classParameter);
}
}
});
return result[0];
}
private static String getDigitPrefix(final String indexName) {
final StringBuilder builder = StringBuilderSpinAllocator.alloc();
try {
for (int i = 0; i < indexName.length(); i++) {
@@ -117,29 +161,7 @@ public class ClassUtil {
break;
}
}
final int idx = Integer.parseInt(builder.toString());
final String name = builder.length() < indexName.length() ? indexName.substring(builder.length()) : null;
final PsiClass[] result = new PsiClass[1];
contaningClass.accept(new PsiRecursiveElementVisitor() {
private int myCurrentIdx = 0;
public void visitElement(PsiElement element) {
if (result[0] == null) {
super.visitElement(element);
}
}
public void visitClass(PsiClass aClass) {
super.visitClass(aClass);
if (aClass.getQualifiedName() == null) {
myCurrentIdx++;
if (myCurrentIdx == idx && Comparing.strEqual(name, aClass.getName())) {
result[0] = aClass;
}
}
}
});
return result[0];
return builder.toString();
}
finally {
StringBuilderSpinAllocator.dispose(builder);
@@ -155,11 +177,11 @@ public class ClassUtil {
*/
@Nullable
public static PsiClass findPsiClass(final PsiManager psiManager, String externalName){
return findPsiClass(psiManager, externalName, null);
return findPsiClass(psiManager, externalName, null, false);
}
@Nullable
private static PsiClass findPsiClass(final PsiManager psiManager, String externalName, PsiClass psiClass) {
public static PsiClass findPsiClass(final PsiManager psiManager, String externalName, PsiClass psiClass, boolean jvmCompatible) {
final int topIdx = externalName.indexOf('$');
if (topIdx > -1) {
if (psiClass == null) {
@@ -167,14 +189,52 @@ public class ClassUtil {
}
if (psiClass == null) return null;
externalName = externalName.substring(topIdx + 1);
final int nextIdx = externalName.indexOf("$");
if (nextIdx > -1) {
return findPsiClass(psiManager, externalName.substring(nextIdx), findNonQualifiedClassByIndex(externalName.substring(0, nextIdx), psiClass));
} else {
return findNonQualifiedClassByIndex(externalName, psiClass);
}
return findSubclass(psiManager, externalName, psiClass, jvmCompatible);
} else {
return psiManager.findClass(externalName, GlobalSearchScope.allScope(psiManager.getProject()));
}
}
@Nullable
private static PsiClass findSubclass(final PsiManager psiManager,
final String externalName,
final PsiClass psiClass,
final boolean jvmCompatible) {
final int nextIdx = externalName.indexOf("$");
if (nextIdx > -1) {
final PsiClass anonymousClass = findNonQualifiedClassByIndex(externalName.substring(0, nextIdx), psiClass, jvmCompatible);
if (anonymousClass == null) return null;
return findPsiClass(psiManager, externalName.substring(nextIdx), anonymousClass, jvmCompatible);
}
else {
return findNonQualifiedClassByIndex(externalName, psiClass, jvmCompatible);
}
}
@Nullable
public static String getJVMClassName(PsiClass aClass) {
final String qName = aClass.getQualifiedName();
if (qName == null) return null;
return replaceDotsWithDollars(qName, aClass);
}
private static String replaceDotsWithDollars(final String qName, PsiClass aClass) {
StringBuilder qNameBuffer = new StringBuilder(qName);
int fromIndex = qNameBuffer.length();
PsiElement parent = aClass.getParent();
while (parent instanceof PsiClass) {
final int dotIndex = qNameBuffer.lastIndexOf(".", fromIndex);
if (dotIndex < 0) break;
qNameBuffer.replace(dotIndex, dotIndex + 1, "$");
fromIndex = dotIndex - 1;
parent = parent.getParent();
}
return qNameBuffer.toString();
}
@Nullable
public static PsiClass findPsiClassByJVMName(final PsiManager manager, final String jvmClassName) {
return findPsiClass(manager, jvmClassName.replace('/', '.'), null, true);
}
}
@@ -114,7 +114,7 @@ public class RenameUtil {
if (element instanceof PsiClass) {
final PsiClass aClass = (PsiClass)element;
if (aClass.getParent() instanceof PsiClass) {
final String dollaredStringToSearch = RefactoringUtil.getInnerClassNameForClassLoader(aClass);
final String dollaredStringToSearch = ClassUtil.getJVMClassName(aClass);
final String dollaredStringToReplace = dollaredStringToSearch == null ? null : RefactoringUtil.getNewInnerClassName(aClass, dollaredStringToSearch, newName);
if (dollaredStringToReplace != null) {
addTextOccurence(aClass, result, projectScope, dollaredStringToSearch, dollaredStringToReplace);
@@ -987,27 +987,6 @@ public class RefactoringUtil {
}
}
public static String getInnerClassNameForClassLoader(PsiClass aClass) {
final String qName = aClass.getQualifiedName();
if (qName == null) return null;
return replaceDotsWithDollars(qName, aClass);
}
private static String replaceDotsWithDollars(final String qName, PsiClass aClass) {
StringBuilder qNameBuffer = new StringBuilder(qName);
int fromIndex = qNameBuffer.length();
PsiElement parent = aClass.getParent();
while (parent instanceof PsiClass) {
final int dotIndex = qNameBuffer.lastIndexOf(".", fromIndex);
if (dotIndex < 0) break;
qNameBuffer.replace(dotIndex, dotIndex + 1, "$");
fromIndex = dotIndex - 1;
parent = parent.getParent();
}
return qNameBuffer.toString();
}
public static String getNewInnerClassName(PsiClass aClass, String oldInnerClassName, String newName) {
if (!oldInnerClassName.endsWith(aClass.getName())) return newName;
StringBuilder buffer = new StringBuilder(oldInnerClassName);
@@ -8,8 +8,8 @@ import com.intellij.psi.PsiType;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.ClassUtil;
import com.intellij.uiDesigner.lw.*;
import com.intellij.refactoring.util.RefactoringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -102,7 +102,7 @@ public final class PsiPropertiesProvider implements PropertiesProvider {
PsiClass propClass = psiManager.findClass(propertyClassName, scope);
if (propClass == null) continue;
if (propClass.isEnum()) {
final String enumClassName = RefactoringUtil.getInnerClassNameForClassLoader(propClass);
final String enumClassName = ClassUtil.getJVMClassName(propClass);
final ClassLoader loader = LoaderFactory.getInstance(myModule.getProject()).getLoader(myModule);
try {
property = new LwIntroEnumProperty(name, loader.loadClass(enumClassName));
@@ -1,6 +1,7 @@
package com.intellij.uiDesigner.actions;
import com.intellij.CommonBundle;
import com.intellij.compiler.PsiClassWriter;
import com.intellij.compiler.impl.FileSetCompileScope;
import com.intellij.execution.CantRunException;
import com.intellij.execution.ExecutionException;
@@ -17,6 +18,7 @@ import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataConstants;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.compiler.CompileContext;
import com.intellij.openapi.compiler.CompileStatusNotification;
import com.intellij.openapi.compiler.CompilerManager;
@@ -33,7 +35,6 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.uiDesigner.FormEditingUtil;
import com.intellij.uiDesigner.UIDesignerBundle;
import com.intellij.uiDesigner.compiler.AsmCodeGenerator;
@@ -49,6 +50,7 @@ import com.intellij.util.containers.HashSet;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.objectweb.asm.ClassWriter;
import javax.swing.*;
import java.io.File;
@@ -165,7 +167,8 @@ public final class PreviewFormAction extends AnAction{
CopyResourcesUtil.copyProperties(tempPath, RUNTIME_BUNDLE_PREFIX + "_" + locale.getLanguage() + RUNTIME_BUNDLE_EXTENSION);
CopyResourcesUtil.copyProperties(tempPath, RUNTIME_BUNDLE_PREFIX + RUNTIME_BUNDLE_EXTENSION);
final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, loader, nestedFormLoader, true);
final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, loader, nestedFormLoader, true,
new PsiClassWriter(module.getProject(), ClassWriter.COMPUTE_FRAMES));
codeGenerator.patchFile(tempFile);
final FormErrorInfo[] errors = codeGenerator.getErrors();
if(errors.length != 0){
@@ -1,32 +1,34 @@
package com.intellij.uiDesigner.make;
import com.intellij.compiler.PsiClassWriter;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.compiler.*;
import com.intellij.openapi.compiler.ex.CompilerPathsEx;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootsTraversing;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.roots.ProjectRootsTraversing;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.util.Computable;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.uiDesigner.GuiDesignerConfiguration;
import com.intellij.uiDesigner.UIDesignerBundle;
import com.intellij.uiDesigner.lw.LwRootContainer;
import com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider;
import com.intellij.uiDesigner.compiler.AlienFormFileException;
import com.intellij.uiDesigner.compiler.AsmCodeGenerator;
import com.intellij.uiDesigner.compiler.FormErrorInfo;
import com.intellij.uiDesigner.compiler.Utils;
import com.intellij.uiDesigner.compiler.AsmCodeGenerator;
import com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider;
import com.intellij.uiDesigner.lw.LwRootContainer;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.objectweb.asm.ClassWriter;
import java.io.DataInputStream;
import java.io.File;
@@ -295,7 +297,8 @@ public final class Form2ByteCodeCompiler implements ClassInstrumentingCompiler {
LOG.assertTrue(classFile.exists(), classFile.getPath());
final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, loader,
new PsiNestedFormLoader(module), false);
new PsiNestedFormLoader(module), false,
new PsiClassWriter(module.getProject(), ClassWriter.COMPUTE_FRAMES));
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
codeGenerator.patchFile(classFile);
@@ -4,6 +4,7 @@
package com.intellij.uiDesigner.make;
import com.intellij.compiler.PsiClassWriter;
import com.intellij.openapi.module.Module;
import com.intellij.uiDesigner.actions.PreviewFormAction;
import com.intellij.uiDesigner.compiler.AsmCodeGenerator;
@@ -14,8 +15,8 @@ import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.HashSet;
import org.jetbrains.annotations.NonNls;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import java.io.ByteArrayInputStream;
import java.io.File;
@@ -50,7 +51,7 @@ public class PreviewNestedFormLoader extends PsiNestedFormLoader {
private void generateStubClass(final LwRootContainer rootContainer, final String generatedClassName) throws IOException,
CodeGenerationException {
@NonNls ClassWriter cw = new ClassWriter(true);
@NonNls ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, generatedClassName, null, "java/lang/Object", ArrayUtil.EMPTY_STRING_ARRAY);
cw.visitField(Opcodes.ACC_PUBLIC, PreviewFormAction.PREVIEW_BINDING_FIELD, "Ljavax/swing/JComponent;", null, null);
@@ -69,7 +70,8 @@ public class PreviewNestedFormLoader extends PsiNestedFormLoader {
cw.visitEnd();
ByteArrayInputStream bais = new ByteArrayInputStream(cw.toByteArray());
AsmCodeGenerator acg = new AsmCodeGenerator(rootContainer, myLoader, this, true);
AsmCodeGenerator acg = new AsmCodeGenerator(rootContainer, myLoader, this, true,
new PsiClassWriter(myModule.getProject(), ClassWriter.COMPUTE_FRAMES));
byte[] data = acg.patchClass(bais);
FormErrorInfo[] errors = acg.getErrors();
if (errors.length > 0) {
@@ -13,7 +13,7 @@ import com.intellij.uiDesigner.compiler.Utils;
import com.intellij.uiDesigner.lw.LwRootContainer;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiManager;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.psi.util.ClassUtil;
import java.util.Map;
import java.util.HashMap;
@@ -22,7 +22,7 @@ import java.util.HashMap;
* @author yole
*/
public class PsiNestedFormLoader implements NestedFormLoader {
private Module myModule;
protected Module myModule;
private Map<String, LwRootContainer> myFormCache = new HashMap<String, LwRootContainer>();
public PsiNestedFormLoader(final Module module) {
@@ -46,7 +46,7 @@ public class PsiNestedFormLoader implements NestedFormLoader {
PsiClass psiClass = PsiManager.getInstance(myModule.getProject()).findClass(container.getClassToBind(),
myModule.getModuleWithDependenciesScope());
if (psiClass != null) {
return RefactoringUtil.getInnerClassNameForClassLoader(psiClass);
return ClassUtil.getJVMClassName(psiClass);
}
return container.getClassToBind();
@@ -12,10 +12,10 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.ClassUtil;
import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.refactoring.listeners.RefactoringElementListenerProvider;
import com.intellij.refactoring.listeners.RefactoringListenerManager;
import com.intellij.refactoring.util.RefactoringUtil;
import org.jetbrains.annotations.NonNls;
import java.beans.PropertyChangeListener;
@@ -83,7 +83,7 @@ public class UIDesignerPaletteProvider implements PaletteItemProvider, ProjectCo
public RefactoringElementListener getListener(PsiElement element) {
if (element instanceof PsiClass) {
PsiClass psiClass = (PsiClass) element;
final String oldName = RefactoringUtil.getInnerClassNameForClassLoader(psiClass);
final String oldName = ClassUtil.getJVMClassName(psiClass);
if (oldName != null) {
final ComponentItem item = myPalette.getItem(oldName);
if (item != null) {
@@ -107,7 +107,7 @@ public class UIDesignerPaletteProvider implements PaletteItemProvider, ProjectCo
public void elementRenamed(PsiElement newElement) {
PsiClass psiClass = (PsiClass) newElement;
final String qName = RefactoringUtil.getInnerClassNameForClassLoader(psiClass);
final String qName = ClassUtil.getJVMClassName(psiClass);
if (qName != null) {
myItem.setClassName(qName);
fireGroupsChanged();
@@ -1,24 +1,28 @@
package com.intellij.uiDesigner.core;
import com.intellij.uiDesigner.compiler.AsmCodeGenerator;
import com.intellij.uiDesigner.compiler.FormErrorInfo;
import com.intellij.uiDesigner.compiler.Utils;
import com.intellij.uiDesigner.compiler.NestedFormLoader;
import com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider;
import com.intellij.uiDesigner.lw.LwRootContainer;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.uiDesigner.compiler.AsmCodeGenerator;
import com.intellij.uiDesigner.compiler.FormErrorInfo;
import com.intellij.uiDesigner.compiler.NestedFormLoader;
import com.intellij.uiDesigner.compiler.Utils;
import com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider;
import com.intellij.uiDesigner.lw.LwRootContainer;
import junit.framework.TestCase;
import org.objectweb.asm.ClassWriter;
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.io.*;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.HashMap;
import java.util.Map;
/**
* @author yole
@@ -50,7 +54,8 @@ public class AsmCodeGeneratorTest extends TestCase {
com.sun.tools.javac.Main.compile(new String[] { javaPath } );
String classPath = testDataPath + className + ".class";
final LwRootContainer rootContainer = loadFormData(formPath);
final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, myClassLoader, myNestedFormLoader, false);
final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, myClassLoader, myNestedFormLoader, false,
new ClassWriter(ClassWriter.COMPUTE_FRAMES));
final FileInputStream classStream = new FileInputStream(classPath);
try {
codeGenerator.patchClass(classStream);