diff options
author | Dmitry Gridin <dmitry.gridin@jetbrains.com> | 2022-06-08 14:09:50 +0200 |
---|---|---|
committer | Oleg Baskakov <baskakov@google.com> | 2022-08-15 15:11:37 -0700 |
commit | f04c8414110fdd70db125da87a37e5e953edf317 (patch) | |
tree | 794f6eec4b4bc9f8193543911d445f1f170041d3 | |
parent | f10b8434fcd4c7361de00a1c15cc62629a4439ee (diff) | |
download | intellij-kotlin-f04c8414110fdd70db125da87a37e5e953edf317.tar.gz |
[change signature] dialog: fix memory leak
^KTIJ-21873 Fixed
(cherry picked from commit 4b91baecce0bf8ec21c40c80cc2b00c543a04b35)
Fixes: 233666178
Change-Id: I4b91baecce0bf8ec21c40c80cc2b00c543a04b35
2 files changed, 44 insertions, 26 deletions
diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureDialogBase.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureDialogBase.java index f8634b2a63b2..732e14eda5b9 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureDialogBase.java +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureDialogBase.java @@ -1,4 +1,4 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.refactoring.changeSignature; import com.intellij.icons.AllIcons; @@ -49,6 +49,7 @@ import javax.swing.event.ChangeListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableCellEditor; +import javax.swing.table.TableModel; import java.awt.*; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; @@ -221,6 +222,7 @@ public abstract class ChangeSignatureDialogBase<ParamInfo extends ParameterInfo, myNameField.setEnabled(myMethod.canChangeName()); if (myMethod.canChangeName()) { myNameField.addDocumentListener(mySignatureUpdater); + Disposer.register(myDisposable, () -> myNameField.removeDocumentListener(mySignatureUpdater)); myNameField.setPreferredWidth(200); } myNamePanel.add(nameLabel, BorderLayout.NORTH); @@ -250,6 +252,7 @@ public abstract class ChangeSignatureDialogBase<ParamInfo extends ParameterInfo, if (myMethod.canChangeReturnType() == MethodDescriptor.ReadWriteOption.ReadWrite) { myReturnTypeField.setPreferredWidth(200); myReturnTypeField.addDocumentListener(mySignatureUpdater); + Disposer.register(myDisposable, () -> myReturnTypeField.removeDocumentListener(mySignatureUpdater)); } else { myReturnTypeField.setEnabled(false); @@ -459,7 +462,9 @@ public abstract class ChangeSignatureDialogBase<ParamInfo extends ParameterInfo, final JPanel buttonsPanel = ToolbarDecorator.createDecorator(myParametersList.getTable()) .addExtraAction(myPropagateParamChangesButton) .createPanel(); - myParametersList.getTable().getModel().addTableModelListener(mySignatureUpdater); + TableModel tableModel = myParametersList.getTable().getModel(); + tableModel.addTableModelListener(mySignatureUpdater); + Disposer.register(myDisposable, () -> tableModel.removeTableModelListener(mySignatureUpdater)); return buttonsPanel; } else { @@ -472,6 +477,7 @@ public abstract class ChangeSignatureDialogBase<ParamInfo extends ParameterInfo, myPropagateParamChangesButton.setVisible(false); myParametersTableModel.addTableModelListener(mySignatureUpdater); + Disposer.register(myDisposable, () -> myParametersTableModel.removeTableModelListener(mySignatureUpdater)); customizeParametersTable(myParametersTable); return buttonsPanel; diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt index 6613663b39f2..5f136b96a0dd 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.refactoring.changeSignature.ui @@ -6,13 +6,13 @@ import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.colors.EditorColorsManager import com.intellij.openapi.editor.colors.EditorFontType -import com.intellij.openapi.editor.event.DocumentEvent -import com.intellij.openapi.editor.event.DocumentListener +import com.intellij.openapi.observable.util.addItemListener import com.intellij.openapi.options.ConfigurationException import com.intellij.openapi.project.Project import com.intellij.openapi.ui.ComboBox import com.intellij.openapi.ui.MessageDialogBuilder import com.intellij.openapi.ui.VerticalFlowLayout +import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.NlsContexts import com.intellij.openapi.util.text.StringUtil import com.intellij.psi.PsiCodeFragment @@ -59,6 +59,7 @@ import org.jetbrains.kotlin.types.isError import java.awt.Font import java.awt.Toolkit import java.awt.event.ItemEvent +import java.awt.event.ItemListener import javax.swing.* class KotlinChangeSignatureDialog( @@ -155,31 +156,43 @@ class KotlinChangeSignatureDialog( component = editor } else if (KotlinCallableParameterTableModel.isDefaultParameterColumn(columnInfo) && isDefaultColumnEnabled()) { defaultParameterCheckbox.isSelected = item.parameter.defaultValue != null - defaultParameterCheckbox.addItemListener { - parametersTableModel.setValueAtWithoutUpdate(it.stateChange == ItemEvent.SELECTED, row, columnFinal) - updateSignature() - } + defaultParameterCheckbox.addItemListener( + disposable, + ItemListener { + parametersTableModel.setValueAtWithoutUpdate(it.stateChange == ItemEvent.SELECTED, row, columnFinal) + updateSignature() + }, + ) + component = defaultParameterCheckbox editor = null notifyReceiverListeners() } else if (KotlinPrimaryConstructorParameterTableModel.isValVarColumn(columnInfo)) { val comboBox = ComboBox(KotlinValVar.values()) comboBox.selectedItem = item.parameter.valOrVar - comboBox.addItemListener { - parametersTableModel.setValueAtWithoutUpdate(it.item, row, columnFinal) - updateSignature() - } + comboBox.addItemListener( + disposable, + ItemListener { + parametersTableModel.setValueAtWithoutUpdate(it.item, row, columnFinal) + updateSignature() + }, + ) + component = comboBox editor = null } else if (KotlinFunctionParameterTableModel.isReceiverColumn(columnInfo)) { val checkBox = JCheckBox() checkBox.isSelected = parametersTableModel.receiver == item.parameter - checkBox.addItemListener { - val newReceiver = if (it.stateChange == ItemEvent.SELECTED) item.parameter else null - (parametersTableModel as KotlinFunctionParameterTableModel).receiver = newReceiver - updateSignature() - notifyReceiverListeners() - } + checkBox.addItemListener( + disposable, + ItemListener { + val newReceiver = if (it.stateChange == ItemEvent.SELECTED) item.parameter else null + (parametersTableModel as KotlinFunctionParameterTableModel).receiver = newReceiver + updateSignature() + notifyReceiverListeners() + }, + ) + component = checkBox editor = null } else @@ -189,13 +202,12 @@ class KotlinChangeSignatureDialog( panel.add(label) if (editor != null) { - editor.addDocumentListener( - object : DocumentListener { - override fun documentChanged(e: DocumentEvent) { - fireDocumentChanged(e, columnFinal) - } - } - ) + val listener = RowEditorChangeListener(columnFinal) + editor.addDocumentListener(listener) + Disposer.register(disposable) { + editor.removeDocumentListener(listener) + } + editor.setPreferredWidth(table.width / parametersTableModel.columnCount) } |