mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
committed by
intellij-monorepo-bot
parent
8ae5daeca3
commit
acb6bd75d5
+15
-2
@@ -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
|
||||
|
||||
+6
-4
@@ -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
|
||||
|
||||
+9
-4
@@ -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));
|
||||
|
||||
+4
@@ -10,4 +10,8 @@ public interface JpsUiDesignerConfiguration extends JpsElement {
|
||||
boolean isInstrumentClasses();
|
||||
|
||||
void setInstrumentClasses(boolean value);
|
||||
|
||||
void setUseDynamicBundles(boolean value);
|
||||
|
||||
boolean isUseDynamicBundles();
|
||||
}
|
||||
|
||||
+13
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user