mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
ASM v3 (IDEADEV-10509)
This commit is contained in:
@@ -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('.', '/');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
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);
|
||||
|
||||
Reference in New Issue
Block a user