Skip to content

Commit 914d0fc

Browse files
authored
Fix memory leak (#125)
* Fix tool window memory leak and initialisation, fix another process unavailable error on shutdown * changelog * get ready for release:
1 parent fc2f5f1 commit 914d0fc

4 files changed

Lines changed: 36 additions & 23 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- Fix issue where multiple process shutdowns occurring when closing a project can throw an error,
88
fixes https://github.com/dprint/dprint-intellij/issues/121
99
- Downgrade kotlin version to 2.2.21, fixes https://github.com/dprint/dprint-intellij/issues/122
10+
- Fix memory leak with tool window console
1011

1112
## 0.9.0 - 2025-12-23
1213

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# -> https://plugins.jetbrains.com/docs/intellij/intellij-artifacts.html
33
pluginGroup=com.dprint.intellij.plugin
44
pluginName=dprint
5-
pluginVersion=0.9.1.beta
5+
pluginVersion=0.9.1
66
# See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
77
# for insight into build numbers and IntelliJ Platform versions.
88
pluginSinceBuild=251

src/main/kotlin/com/dprint/services/editorservice/v5/EditorServiceV5.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.dprint.config.ProjectConfiguration
44
import com.dprint.i18n.DprintBundle
55
import com.dprint.services.editorservice.FormatResult
66
import com.dprint.services.editorservice.IEditorService
7+
import com.dprint.services.editorservice.exceptions.ProcessUnavailableException
78
import com.dprint.services.editorservice.process.EditorProcess
89
import com.dprint.utils.errorLogWithConsole
910
import com.dprint.utils.infoLogWithConsole
@@ -70,6 +71,8 @@ class EditorServiceV5(
7071
}
7172
} catch (e: TimeoutCancellationException) {
7273
errorLogWithConsole(DprintBundle.message("editor.service.shutting.down.timed.out"), e, project, LOGGER)
74+
} catch (e: ProcessUnavailableException) {
75+
infoLogWithConsole("Process already terminated, skipping shutdown message", project, LOGGER)
7376
} finally {
7477
stdoutListener?.dispose()
7578
dropMessages()

src/main/kotlin/com/dprint/toolwindow/Console.kt

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,48 @@
11
package com.dprint.toolwindow
22

33
import com.dprint.messages.DprintMessage
4-
import com.intellij.execution.impl.ConsoleViewImpl
4+
import com.intellij.execution.filters.TextConsoleBuilderFactory
5+
import com.intellij.execution.ui.ConsoleView
56
import com.intellij.execution.ui.ConsoleViewContentType
7+
import com.intellij.openapi.Disposable
68
import com.intellij.openapi.components.Service
79
import com.intellij.openapi.project.Project
8-
import com.intellij.psi.search.GlobalSearchScope
10+
import com.intellij.openapi.util.Disposer
911
import java.time.LocalDateTime
1012
import java.time.format.DateTimeFormatter
1113

1214
@Service(Service.Level.PROJECT)
1315
class Console(
1416
val project: Project,
15-
) {
16-
val consoleView = ConsoleViewImpl(project, GlobalSearchScope.allScope(project), false, false)
17+
) : Disposable {
18+
val consoleView: ConsoleView = TextConsoleBuilderFactory.getInstance().createBuilder(project).console
19+
private val connection = project.messageBus.connect(this)
1720

1821
init {
19-
with(project.messageBus.connect()) {
20-
subscribe(
21-
DprintMessage.DPRINT_MESSAGE_TOPIC,
22-
object : DprintMessage.Listener {
23-
override fun info(message: String) {
24-
consoleView.print(decorateText(message), ConsoleViewContentType.LOG_INFO_OUTPUT)
25-
}
26-
27-
override fun warn(message: String) {
28-
consoleView.print(decorateText(message), ConsoleViewContentType.LOG_WARNING_OUTPUT)
29-
}
30-
31-
override fun error(message: String) {
32-
consoleView.print(decorateText(message), ConsoleViewContentType.LOG_ERROR_OUTPUT)
33-
}
34-
},
35-
)
36-
}
22+
subscribe()
23+
}
24+
25+
private fun subscribe() {
26+
connection.subscribe(
27+
DprintMessage.DPRINT_MESSAGE_TOPIC,
28+
object : DprintMessage.Listener {
29+
override fun info(message: String) {
30+
consoleView.print(decorateText(message), ConsoleViewContentType.LOG_INFO_OUTPUT)
31+
}
32+
33+
override fun warn(message: String) {
34+
consoleView.print(decorateText(message), ConsoleViewContentType.LOG_WARNING_OUTPUT)
35+
}
36+
37+
override fun error(message: String) {
38+
consoleView.print(decorateText(message), ConsoleViewContentType.LOG_ERROR_OUTPUT)
39+
}
40+
},
41+
)
42+
}
43+
44+
override fun dispose() {
45+
Disposer.dispose(consoleView)
3746
}
3847

3948
private fun decorateText(text: String): String =

0 commit comments

Comments
 (0)