IDEA-230489 Plugin built with latest intellij master will not run in 2019.3

form GUI compiler: disable bytecode generation with dynamic bundles by default

GitOrigin-RevId: f8128c0f2ffbb5e92d0fcfed1df3dcb061c3c789
This commit is contained in:
Sergey Ignatov
2020-03-26 16:31:34 +00:00
committed by intellij-monorepo-bot
parent 8ae5daeca3
commit acb6bd75d5
10 changed files with 69 additions and 13 deletions
@@ -59,6 +59,7 @@ public class AsmCodeGenerator {
private final NestedFormLoader myFormLoader;
private final boolean myIgnoreCustomCreation;
private final boolean myUseDynamicBundles;
private final ClassWriter myClassWriter;
static {
@@ -89,9 +90,11 @@ public class AsmCodeGenerator {
InstrumentationClassFinder finder,
NestedFormLoader formLoader,
final boolean ignoreCustomCreation,
boolean useDynamicBundles,
final ClassWriter classWriter) {
myFormLoader = formLoader;
myIgnoreCustomCreation = ignoreCustomCreation;
myUseDynamicBundles = useDynamicBundles;
if (finder == null){
throw new IllegalArgumentException("loader cannot be null");
}
@@ -105,6 +108,14 @@ public class AsmCodeGenerator {
myWarnings = new ArrayList<FormErrorInfo>();
myClassWriter = classWriter;
}
public AsmCodeGenerator(LwRootContainer rootContainer,
InstrumentationClassFinder finder,
NestedFormLoader formLoader,
final boolean ignoreCustomCreation,
final ClassWriter classWriter) {
this(rootContainer, finder, formLoader, ignoreCustomCreation, false, classWriter);
}
public void patchFile(final File classFile) {
if (!classFile.exists()) {
@@ -175,7 +186,7 @@ public class AsmCodeGenerator {
FirstPassClassVisitor visitor = new FirstPassClassVisitor();
reader.accept(visitor, 0);
reader.accept(new FormClassVisitor(myClassWriter, visitor.isExplicitSetupCall()), 0);
reader.accept(new FormClassVisitor(myClassWriter, visitor.isExplicitSetupCall(), myUseDynamicBundles), 0);
myPatchedData = myClassWriter.toByteArray();
return myPatchedData;
}
@@ -227,10 +238,12 @@ public class AsmCodeGenerator {
private boolean myHaveCreateComponentsMethod = false;
private int myCreateComponentsAccess;
private final boolean myExplicitSetupCall;
final boolean useDynamicBundles;
FormClassVisitor(final ClassVisitor cv, final boolean explicitSetupCall) {
FormClassVisitor(final ClassVisitor cv, final boolean explicitSetupCall, boolean useDynamicBundles) {
super(ASM_API_VERSION, cv);
myExplicitSetupCall = explicitSetupCall;
this.useDynamicBundles = useDynamicBundles;
}
@Override
@@ -56,11 +56,13 @@ public final class StringPropertyCodeGenerator extends PropertyCodeGenerator imp
}
catch (Exception ignored) {}
try {
classFinder.loadClass("com.intellij.DynamicBundle");
dynamicBundleType = Type.getType("Lcom/intellij/DynamicBundle;");
if (visitor.useDynamicBundles) {
try {
classFinder.loadClass("com.intellij.DynamicBundle");
dynamicBundleType = Type.getType("Lcom/intellij/DynamicBundle;");
}
catch (Exception ignored) {}
}
catch (Exception ignored) {}
}
@Override
@@ -86,7 +86,7 @@ public class FormsInstrumenter extends FormsBuilder {
final InstrumentationClassFinder finder = ClassProcessingBuilder.createInstrumentationClassFinder(sdk, platformCp, classpath, outputConsumer);
try {
final Map<File, Collection<File>> processed = instrumentForms(context, chunk, chunkSourcePath, finder, formsToCompile, outputConsumer);
final Map<File, Collection<File>> processed = instrumentForms(context, chunk, chunkSourcePath, finder, formsToCompile, outputConsumer, config.isUseDynamicBundles());
final OneToManyPathsMapping sourceToFormMap = context.getProjectDescriptor().dataManager.getSourceToFormMap();
@@ -124,8 +124,13 @@ public class FormsInstrumenter extends FormsBuilder {
}
private Map<File, Collection<File>> instrumentForms(
CompileContext context, ModuleChunk chunk, final Map<File, String> chunkSourcePath, final InstrumentationClassFinder finder, Collection<File> forms, OutputConsumer outConsumer
) throws ProjectBuildException {
CompileContext context,
ModuleChunk chunk,
final Map<File, String> chunkSourcePath,
final InstrumentationClassFinder finder,
Collection<File> forms,
OutputConsumer outConsumer,
boolean useDynamicBundles) throws ProjectBuildException {
final Map<File, Collection<File>> instrumented = new THashMap<>(FileUtil.FILE_HASHING_STRATEGY);
final Map<String, File> class2form = new HashMap<>();
@@ -196,7 +201,7 @@ public class FormsInstrumenter extends FormsBuilder {
final int flags = InstrumenterClassWriter.getAsmClassWriterFlags(InstrumenterClassWriter.getClassFileVersion(classReader));
final InstrumenterClassWriter classWriter = new InstrumenterClassWriter(classReader, flags, finder);
final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, finder, nestedFormsLoader, false, classWriter);
final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, finder, nestedFormsLoader, false, useDynamicBundles, classWriter);
final byte[] patchedBytes = codeGenerator.patchClass(classReader);
if (patchedBytes != null) {
compiled.setContent(new BinaryContent(patchedBytes));
@@ -10,4 +10,8 @@ public interface JpsUiDesignerConfiguration extends JpsElement {
boolean isInstrumentClasses();
void setInstrumentClasses(boolean value);
void setUseDynamicBundles(boolean value);
boolean isUseDynamicBundles();
}
@@ -16,6 +16,7 @@ public class JpsUiDesignerConfigurationImpl extends JpsElementBase<JpsUiDesigner
public JpsUiDesignerConfigurationImpl(final UiDesignerConfigurationState state) {
myState.INSTRUMENT_CLASSES = state.INSTRUMENT_CLASSES;
myState.COPY_FORMS_RUNTIME_TO_OUTPUT = state.COPY_FORMS_RUNTIME_TO_OUTPUT;
myState.USE_DYNAMIC_BUNDLES = state.USE_DYNAMIC_BUNDLES;
}
public UiDesignerConfigurationState getState() {
@@ -54,14 +55,26 @@ public class JpsUiDesignerConfigurationImpl extends JpsElementBase<JpsUiDesigner
}
}
@Override
public void setUseDynamicBundles(boolean value) {
myState.USE_DYNAMIC_BUNDLES = value;
}
@Override
public boolean isUseDynamicBundles() {
return myState.USE_DYNAMIC_BUNDLES;
}
@Override
public void applyChanges(@NotNull JpsUiDesignerConfigurationImpl modified) {
setCopyFormsRuntimeToOutput(modified.isCopyFormsRuntimeToOutput());
setInstrumentClasses(modified.isInstrumentClasses());
setUseDynamicBundles(modified.isUseDynamicBundles());
}
public static class UiDesignerConfigurationState {
public boolean INSTRUMENT_CLASSES = true;
public boolean COPY_FORMS_RUNTIME_TO_OUTPUT = true;
public boolean USE_DYNAMIC_BUNDLES = false;
}
}
@@ -554,3 +554,4 @@ plugin.com.intellij.uiDesigner.description=Provides visual editing support for S
group.GuiDesigner.MainToolbarActions.text=UI Designer Toolbar Actions
group.GuiDesigner.NewActions.text=Swing UI Designer
ui.designer.general.settings.resize.column.and.row.headers=&Resize column and row headers with mouse
ui.designer.general.settings.use.dynamic.bundles=Allow changing locale at runtime (requires 2020.1)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.uiDesigner.GuiDesignerConfigurable.MyGeneralUI">
<grid id="4a770" binding="myPanel" layout-manager="GridLayoutManager" row-count="6" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="4a770" binding="myPanel" layout-manager="GridLayoutManager" row-count="7" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="62" y="47" width="493" height="278"/>
@@ -10,7 +10,7 @@
<children>
<vspacer id="d5f77">
<constraints>
<grid row="5" column="0" row-span="1" col-span="2" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
<grid row="6" column="0" row-span="1" col-span="2" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<grid id="b77c5" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="0">
@@ -108,6 +108,15 @@
<text resource-bundle="messages/UIDesignerBundle" key="ui.designer.general.settings.resize.column.and.row.headers"/>
</properties>
</component>
<component id="12840" class="javax.swing.JCheckBox" binding="myChkUseDynamicBundles">
<constraints>
<grid row="5" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<margin top="10" left="0" bottom="2" right="2"/>
<text resource-bundle="messages/UIDesignerBundle" key="ui.designer.general.settings.use.dynamic.bundles"/>
</properties>
</component>
</children>
</grid>
<buttonGroups>
@@ -74,6 +74,10 @@ public final class GuiDesignerConfigurable implements SearchableConfigurable, Co
if (myGeneralUI.myChkCopyFormsRuntime.isSelected() != configuration.COPY_FORMS_RUNTIME_TO_OUTPUT) {
return true;
}
if (myGeneralUI.myChkUseDynamicBundles.isSelected() != configuration.USE_DYNAMIC_BUNDLES) {
return true;
}
if (!Comparing.equal(configuration.DEFAULT_LAYOUT_MANAGER, myGeneralUI.myLayoutManagerCombo.getSelectedItem())) {
return true;
@@ -102,6 +106,7 @@ public final class GuiDesignerConfigurable implements SearchableConfigurable, Co
configuration.INSTRUMENT_CLASSES = myGeneralUI.myRbInstrumentClasses.isSelected();
configuration.DEFAULT_FIELD_ACCESSIBILITY = (String)myGeneralUI .myDefaultFieldAccessibilityCombo.getSelectedItem();
configuration.RESIZE_HEADERS = myGeneralUI.myResizeHeaders.isSelected();
configuration.USE_DYNAMIC_BUNDLES = myGeneralUI.myChkUseDynamicBundles.isSelected();
if (configuration.INSTRUMENT_CLASSES && !myProject.isDefault()) {
final DispatchThreadProgressWindow progressWindow = new DispatchThreadProgressWindow(false, myProject);
@@ -123,6 +128,7 @@ public final class GuiDesignerConfigurable implements SearchableConfigurable, Co
myGeneralUI.myRbInstrumentSources.setSelected(true);
}
myGeneralUI.myChkCopyFormsRuntime.setSelected(configuration.COPY_FORMS_RUNTIME_TO_OUTPUT);
myGeneralUI.myChkUseDynamicBundles.setSelected(configuration.USE_DYNAMIC_BUNDLES);
myGeneralUI.myLayoutManagerCombo.setModel(new DefaultComboBoxModel<>(LayoutManagerRegistry.getNonDeprecatedLayoutManagerNames()));
myGeneralUI.myLayoutManagerCombo.setRenderer(SimpleListCellRenderer.create("", LayoutManagerRegistry::getLayoutManagerDisplayName));
@@ -143,6 +149,7 @@ public final class GuiDesignerConfigurable implements SearchableConfigurable, Co
public JRadioButton myRbInstrumentClasses;
public JRadioButton myRbInstrumentSources;
public JCheckBox myChkCopyFormsRuntime;
public JCheckBox myChkUseDynamicBundles;
private JComboBox<String> myLayoutManagerCombo;
private JComboBox<String> myDefaultFieldAccessibilityCombo;
private JCheckBox myResizeHeaders;
@@ -32,6 +32,8 @@ public final class GuiDesignerConfiguration implements PersistentStateComponent<
public String DEFAULT_FIELD_ACCESSIBILITY = PsiModifier.PRIVATE;
public boolean RESIZE_HEADERS = true;
public boolean USE_DYNAMIC_BUNDLES = false;
@Override
public GuiDesignerConfiguration getState() {
@@ -136,7 +136,7 @@ public class AsmCodeGeneratorTest extends JpsBuildTestCase {
assertTrue(classFile.exists());
final LwRootContainer rootContainer = loadFormData(formPath);
final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, myClassFinder, myNestedFormLoader, false, new ClassWriter(ClassWriter.COMPUTE_FRAMES));
final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, myClassFinder, myNestedFormLoader, false, true, new ClassWriter(ClassWriter.COMPUTE_FRAMES));
final FileInputStream classStream = new FileInputStream(classFile);
try {
codeGenerator.patchClass(classStream);