summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Gridin <dmitry.gridin@jetbrains.com>2022-06-08 14:09:50 +0200
committerOleg Baskakov <baskakov@google.com>2022-08-15 15:11:37 -0700
commitf04c8414110fdd70db125da87a37e5e953edf317 (patch)
tree794f6eec4b4bc9f8193543911d445f1f170041d3
parentf10b8434fcd4c7361de00a1c15cc62629a4439ee (diff)
downloadintellij-kotlin-f04c8414110fdd70db125da87a37e5e953edf317.tar.gz
[change signature] dialog: fix memory leak
^KTIJ-21873 Fixed (cherry picked from commit 4b91baecce0bf8ec21c40c80cc2b00c543a04b35) Fixes: 233666178 Change-Id: I4b91baecce0bf8ec21c40c80cc2b00c543a04b35
-rw-r--r--platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureDialogBase.java10
-rw-r--r--plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt60
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)
}