Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 16 additions & 11 deletions src/main/kotlin/util/files.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* https://mcdev.io/
*
* Copyright (C) 2025 minecraft-dev
* Copyright (C) 2026 minecraft-dev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
Expand Down Expand Up @@ -33,6 +33,8 @@ import java.nio.file.Path
import java.util.jar.Attributes
import java.util.jar.JarFile
import java.util.jar.Manifest
import kotlin.coroutines.resume
import kotlinx.coroutines.suspendCancellableCoroutine

val VirtualFile.localFile: File
get() = VfsUtilCore.virtualToIoFile(this)
Expand Down Expand Up @@ -80,17 +82,20 @@ operator fun Manifest.get(attribute: String): String? = mainAttributes.getValue(
operator fun Manifest.get(attribute: Attributes.Name): String? = mainAttributes.getValue(attribute)

suspend fun VirtualFile.refreshSync(modalityState: ModalityState): VirtualFile? {
fun refresh() {
RefreshQueue.getInstance().refresh(false, this.isDirectory, null, modalityState, this)
// RefreshSessionImpl asserts a write-safe context in its constructor, which fails when called
// from a modal dialog's dispatched coroutine. We schedule the refresh via invokeLater with
// the correct ModalityState so TransactionGuard sees a write-safe context.
suspendCancellableCoroutine { cont ->
ApplicationManager.getApplication().invokeLater(
{
RefreshQueue.getInstance().refresh(false, this.isDirectory, null, modalityState, this)
cont.resume(Unit)
},
modalityState,
)
}

if (ApplicationManager.getApplication().isWriteAccessAllowed) {
refresh()
} else {
writeAction {
refresh()
}
return writeAction {
this@refreshSync.parent?.findOrCreateChildData(this@refreshSync, this@refreshSync.name)
}

return this.parent?.findOrCreateChildData(this, this.name)
}
Loading