diff --git a/build.gradle.kts b/build.gradle.kts index 55b9b9542..5fbc4478a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -108,7 +108,7 @@ dependencies { implementation(libs.jspecify) intellijPlatform { - intellijIdeaCommunity(libs.versions.intellij.ide) { + intellijIdea(libs.versions.intellij.ide) { useInstaller = false } @@ -116,9 +116,10 @@ dependencies { bundledPlugin("com.intellij.java") bundledPlugin("org.jetbrains.idea.maven") bundledPlugin("com.intellij.gradle") + bundledPlugin("org.jetbrains.idea.reposearch") bundledPlugin("org.intellij.groovy") bundledPlugin("ByteCodeViewer") - bundledPlugin("org.intellij.intelliLang") + bundledModule("intellij.platform.langInjection") bundledPlugin("com.intellij.properties") bundledPlugin("Git4Idea") bundledPlugin("com.intellij.modules.json") diff --git a/buildSrc/src/main/kotlin/mcdev-publishing.gradle.kts b/buildSrc/src/main/kotlin/mcdev-publishing.gradle.kts index 4eeef9327..4b08bb72f 100644 --- a/buildSrc/src/main/kotlin/mcdev-publishing.gradle.kts +++ b/buildSrc/src/main/kotlin/mcdev-publishing.gradle.kts @@ -63,7 +63,6 @@ tasks.publishPlugin { false -> PluginRepositoryFactory.create(host.get(), token.get()) } - @Suppress("DEPRECATION") val uploadBean = repositoryClient.uploader.uploadUpdateByXmlIdAndFamily( id = pluginId, family = ProductFamily.INTELLIJ, diff --git a/gradle.properties b/gradle.properties index 167aa7a9a..6e2c35bc1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -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 @@ -21,7 +21,7 @@ # suppress inspection "UnusedProperty" for whole file org.gradle.jvmargs=-Xmx1g -ideaVersionName = 2025.2 +ideaVersionName = 2026.1 coreVersion = 1.8.15 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5ad223a3d..3a9716b46 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] # https://github.com/JetBrains/intellij-community/blob//.idea/libraries/kotlin_stdlib.xml -kotlin = "2.2.0-RC2" +kotlin = "2.3.20-RC2" # https://github.com/JetBrains/intellij-community/blob//.idea/libraries/kotlinx_coroutines_core.xml coroutines = "1.10.2" junit = "6.0.3" @@ -14,7 +14,7 @@ intellij-plugin = "2.13.1" intellij-plugin-repository-rest-client = "2.0.50" # https://www.jetbrains.com/intellij-repository/snapshots or https://www.jetbrains.com/intellij-repository/releases/ # Search for com.jetbrains.intellij.idea -intellij-ide = "2025.2" +intellij-ide = "261.22158.277" # https://github.com/JetBrains/gradle-idea-ext-plugin idea-ext = "1.4.1" @@ -51,7 +51,7 @@ grammarKit = "org.jetbrains.idea:grammar-kit:1.5.1" # Gradle Tooling # https://www.jetbrains.com/intellij-repository/snapshots or https://www.jetbrains.com/intellij-repository/releases/ # Search for com.jetbrains.intellij.gradle -gradleToolingExtension = { module = "com.jetbrains.intellij.gradle:gradle-tooling-extension", version = "252.23892.409" } +gradleToolingExtension = { module = "com.jetbrains.intellij.gradle:gradle-tooling-extension", version = "253.29346.138" } annotations = "org.jetbrains:annotations:26.1.0" groovy = "org.codehaus.groovy:groovy:3.0.25" diff --git a/src/main/kotlin/creator/buildsystem/maven-steps.kt b/src/main/kotlin/creator/buildsystem/maven-steps.kt index ec67c07aa..abc4598fe 100644 --- a/src/main/kotlin/creator/buildsystem/maven-steps.kt +++ b/src/main/kotlin/creator/buildsystem/maven-steps.kt @@ -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 @@ -195,7 +195,7 @@ class MavenImportStep(parent: NewProjectWizardStep) : AbstractLongRunningStep(pa val templateConfig = mavenConfigFactory.createTemplateConfiguration(project) val runConfiguration = mavenConfigFactory.createConfiguration(runConfigName, templateConfig) as MavenRunConfiguration - runConfiguration.runnerParameters.goals.add(task) + runConfiguration.runnerParameters.goals = listOf(task) runConfiguration.runnerParameters.workingDirPath = context.projectDirectory.toString() runConfiguration.isAllowRunningInParallel = false diff --git a/src/main/kotlin/creator/custom/types/GradlePluginSelectorCreatorProperty.kt b/src/main/kotlin/creator/custom/types/GradlePluginSelectorCreatorProperty.kt index e0c81576c..6e84f395e 100644 --- a/src/main/kotlin/creator/custom/types/GradlePluginSelectorCreatorProperty.kt +++ b/src/main/kotlin/creator/custom/types/GradlePluginSelectorCreatorProperty.kt @@ -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 @@ -43,7 +43,7 @@ import com.intellij.ui.dsl.builder.bindItem import com.intellij.ui.dsl.builder.bindSelected import com.intellij.ui.dsl.builder.bindText import com.intellij.util.ui.AsyncProcessIcon -import fleet.multiplatform.shims.ConcurrentHashMap +import java.util.concurrent.ConcurrentHashMap import java.util.function.Function import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/src/main/kotlin/creator/step/AbstractReformatFilesStep.kt b/src/main/kotlin/creator/step/AbstractReformatFilesStep.kt index 276f43062..f983da0ce 100644 --- a/src/main/kotlin/creator/step/AbstractReformatFilesStep.kt +++ b/src/main/kotlin/creator/step/AbstractReformatFilesStep.kt @@ -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 @@ -50,7 +50,7 @@ abstract class AbstractReformatFilesStep(parent: NewProjectWizardStep) : Abstrac val rootDir = VfsUtil.findFile(Path.of(context.projectFileDirectory), true) ?: return val psiManager = PsiManager.getInstance(project) - val files = ReadAction.compute, Throwable> { + val files = ReadAction.computeBlocking, Throwable> { filesToReformat.mapNotNull { path -> VfsUtil.findRelativeFile(rootDir, *path.split('/').toTypedArray())?.let(psiManager::findFile) }.toTypedArray() diff --git a/src/main/kotlin/facet/MinecraftFacet.kt b/src/main/kotlin/facet/MinecraftFacet.kt index 349136246..3a64e1a39 100644 --- a/src/main/kotlin/facet/MinecraftFacet.kt +++ b/src/main/kotlin/facet/MinecraftFacet.kt @@ -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 @@ -36,11 +36,8 @@ import com.intellij.facet.FacetTypeId import com.intellij.facet.FacetTypeRegistry import com.intellij.ide.projectView.ProjectView import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.application.runReadAction import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.module.Module -import com.intellij.openapi.module.ModuleGrouper -import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiClass @@ -227,14 +224,14 @@ class MinecraftFacet( fun findFile(path: String, type: SourceType): VirtualFile? { try { return findFile0(path, type) - } catch (ignored: RefreshRootsException) { + } catch (_: RefreshRootsException) { } updateRoots() return try { findFile0(path, type) - } catch (ignored: RefreshRootsException) { + } catch (_: RefreshRootsException) { // Well we tried our best null } @@ -268,32 +265,6 @@ class MinecraftFacet( fun getInstance(module: Module) = FacetManager.getInstance(module).getFacetByType(ID) - fun getChildInstances(module: Module) = runReadAction run@{ - val instance = getInstance(module) - if (instance != null) { - return@run setOf(instance) - } - - val project = module.project - val manager = ModuleManager.getInstance(project) - val grouper = ModuleGrouper.instanceFor(project) - - val result = mutableSetOf() - - val modulePath = grouper.getModuleAsGroupPath(module) ?: return@run result - - for (m in manager.modules) { - val path = grouper.getGroupPath(m) - if (modulePath != path) { - continue - } - - val facet = getInstance(m) ?: continue - result.add(facet) - } - return@run result - } - fun getInstance(module: Module, type: AbstractModuleType) = getInstance(module)?.getModuleOfType(type) diff --git a/src/main/kotlin/insight/ColorLineMarkerProvider.kt b/src/main/kotlin/insight/ColorLineMarkerProvider.kt index 70c272350..2689eeef0 100644 --- a/src/main/kotlin/insight/ColorLineMarkerProvider.kt +++ b/src/main/kotlin/insight/ColorLineMarkerProvider.kt @@ -149,7 +149,7 @@ class ColorLineMarkerProvider : LineMarkerProvider { } val actionText = MCDevBundle("generate.color.choose_action") - val c = ColorChooserService.instance.showDialog(psiElement.project, editor.component, actionText, color) + val c = ColorChooserService.getInstance().showDialog(psiElement.project, editor.component, actionText, color) ?: return@handler when (workElement) { is ULiteralExpression -> { diff --git a/src/main/kotlin/insight/generation/EventGenHelper.kt b/src/main/kotlin/insight/generation/EventGenHelper.kt index 7a07f3d09..951bc143e 100644 --- a/src/main/kotlin/insight/generation/EventGenHelper.kt +++ b/src/main/kotlin/insight/generation/EventGenHelper.kt @@ -33,6 +33,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.psi.util.parentOfType +import org.jetbrains.kotlin.K1Deprecation import org.jetbrains.kotlin.analysis.api.KaIdeApi import org.jetbrains.kotlin.idea.base.analysis.api.utils.shortenReferences import org.jetbrains.kotlin.idea.base.analysis.api.utils.shortenReferencesInRange @@ -114,7 +115,7 @@ class KotlinEventGenHelper : EventGenHelper { val entry = factory.createSuperTypeEntry(fqn) val insertedEntry = ktClass.addSuperTypeListEntry(entry) when (KotlinPluginModeProvider.currentPluginMode) { - KotlinPluginMode.K1 -> ShortenReferences.DEFAULT.process(insertedEntry) + KotlinPluginMode.K1 -> @OptIn(K1Deprecation::class) ShortenReferences.DEFAULT.process(insertedEntry) // TODO find a non-internal alternative to this... KotlinPluginMode.K2 -> @OptIn(KaIdeApi::class) shortenReferences(insertedEntry) } @@ -128,7 +129,7 @@ class KotlinEventGenHelper : EventGenHelper { val marker = JvmEventGenHelper.doReformat(project, file, startOffset, endOffset) ?: return when (KotlinPluginModeProvider.currentPluginMode) { - KotlinPluginMode.K1 -> ShortenReferences.DEFAULT.process(file, marker.startOffset, marker.endOffset) + KotlinPluginMode.K1 -> @OptIn(K1Deprecation::class) ShortenReferences.DEFAULT.process(file, marker.startOffset, marker.endOffset) // TODO find a non-internal alternative to this... KotlinPluginMode.K2 -> @OptIn(KaIdeApi::class) shortenReferencesInRange(file, marker.textRange) } diff --git a/src/main/kotlin/platform/fabric/reference/ResourceFileReference.kt b/src/main/kotlin/platform/fabric/reference/ResourceFileReference.kt index c6e243c53..0429b7c7e 100644 --- a/src/main/kotlin/platform/fabric/reference/ResourceFileReference.kt +++ b/src/main/kotlin/platform/fabric/reference/ResourceFileReference.kt @@ -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 @@ -27,7 +27,7 @@ import com.demonwav.mcdev.util.manipulator import com.demonwav.mcdev.util.mapFirstNotNull import com.demonwav.mcdev.util.reference.InspectionReference import com.intellij.json.psi.JsonStringLiteral -import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.runReadActionBlocking import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.module.ModuleUtilCore @@ -98,7 +98,7 @@ class ResourceFileReference( } val variants = mutableListOf() - runReadAction { + runReadActionBlocking { val relevantModules = getRelevantModules() val relevantRootTypes = mutableSetOf(JavaResourceRootType.RESOURCE) diff --git a/src/main/kotlin/platform/mcp/ct/CtCompletionContributor.kt b/src/main/kotlin/platform/mcp/ct/CtCompletionContributor.kt index e593aa6bc..9f438eea3 100644 --- a/src/main/kotlin/platform/mcp/ct/CtCompletionContributor.kt +++ b/src/main/kotlin/platform/mcp/ct/CtCompletionContributor.kt @@ -34,7 +34,7 @@ import com.intellij.codeInsight.completion.CompletionType import com.intellij.codeInsight.completion.InsertionContext import com.intellij.codeInsight.completion.PrioritizedLookupElement import com.intellij.codeInsight.lookup.LookupElementBuilder -import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.runReadActionBlocking import com.intellij.patterns.PlatformPatterns import com.intellij.psi.PsiDocumentManager import com.intellij.psi.TokenType @@ -63,7 +63,7 @@ private fun insertWhitespace(context: InsertionContext) { context.document.insertString(context.editor.caretModel.offset, " ") context.editor.caretModel.moveCaretRelatively(1, 0, false, false, false) context.setLaterRunnable { - runReadAction { + runReadActionBlocking { CodeCompletionHandlerBase.createHandler(CompletionType.BASIC) .invokeCompletion(context.project, context.editor) } diff --git a/src/main/kotlin/platform/mcp/vanillagradle/VanillaGradleProjectResolverExtension.kt b/src/main/kotlin/platform/mcp/vanillagradle/VanillaGradleProjectResolverExtension.kt index cd2d4c057..9f13bfbb5 100644 --- a/src/main/kotlin/platform/mcp/vanillagradle/VanillaGradleProjectResolverExtension.kt +++ b/src/main/kotlin/platform/mcp/vanillagradle/VanillaGradleProjectResolverExtension.kt @@ -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 @@ -21,7 +21,7 @@ package com.demonwav.mcdev.platform.mcp.vanillagradle import com.demonwav.mcdev.platform.mcp.gradle.tooling.vanillagradle.VanillaGradleModel -import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.runReadActionBlocking import com.intellij.openapi.externalSystem.model.DataNode import com.intellij.openapi.externalSystem.model.project.ModuleData import org.gradle.tooling.model.idea.IdeaModule @@ -35,7 +35,7 @@ class VanillaGradleProjectResolverExtension : AbstractProjectResolverExtension() override fun getToolingExtensionsClasses() = extraProjectModelClasses override fun populateModuleExtraModels(gradleModule: IdeaModule, ideModule: DataNode) { - val vgData = runReadAction { + val vgData = runReadActionBlocking { resolverCtx.getExtraProject(gradleModule, VanillaGradleModel::class.java) } if (vgData != null && vgData.hasVanillaGradle()) { diff --git a/src/main/kotlin/platform/mixin/action/FindMixinsAction.kt b/src/main/kotlin/platform/mixin/action/FindMixinsAction.kt index 27ddfb92f..25183c92e 100644 --- a/src/main/kotlin/platform/mixin/action/FindMixinsAction.kt +++ b/src/main/kotlin/platform/mixin/action/FindMixinsAction.kt @@ -33,7 +33,7 @@ import com.intellij.openapi.actionSystem.CommonDataKeys.CARET import com.intellij.openapi.actionSystem.CommonDataKeys.PROJECT import com.intellij.openapi.actionSystem.CommonDataKeys.PSI_FILE import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.runReadActionBlocking import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.runBackgroundableTask import com.intellij.openapi.project.Project @@ -89,13 +89,13 @@ class FindMixinsAction : AnAction() { runBackgroundableTask("Searching for Mixins", project, true) run@{ indicator -> indicator.isIndeterminate = true - val classes = runReadAction { + val classes = runReadActionBlocking { if (!targetClass.isValid) { - return@runReadAction null + return@runReadActionBlocking null } val classes = findMixins(targetClass, project, indicator)?.filter(filter) - ?: return@runReadAction null + ?: return@runReadActionBlocking null when (classes.size) { 0 -> null diff --git a/src/main/kotlin/platform/mixin/completion/InjectionPointTypedHandlerDelegate.kt b/src/main/kotlin/platform/mixin/completion/InjectionPointTypedHandlerDelegate.kt index 0a93cc2b5..4a122951a 100644 --- a/src/main/kotlin/platform/mixin/completion/InjectionPointTypedHandlerDelegate.kt +++ b/src/main/kotlin/platform/mixin/completion/InjectionPointTypedHandlerDelegate.kt @@ -34,7 +34,7 @@ class InjectionPointTypedHandlerDelegate : TypedHandlerDelegate() { if (charTyped != ':' || !file.language.isKindOf(JavaLanguage.INSTANCE)) { return Result.CONTINUE } - AutoPopupController.getInstance(project).autoPopupMemberLookup(editor) { + AutoPopupController.getInstance(project).scheduleAutoPopup(editor) { val offset = editor.caretModel.offset val element = it.findElementAt(offset)?.findContextElement() InjectionPointReference.ELEMENT_PATTERN.accepts(element) diff --git a/src/main/kotlin/platform/mixin/debug/MixinPositionManager.kt b/src/main/kotlin/platform/mixin/debug/MixinPositionManager.kt index 20d14e910..e870e38e6 100644 --- a/src/main/kotlin/platform/mixin/debug/MixinPositionManager.kt +++ b/src/main/kotlin/platform/mixin/debug/MixinPositionManager.kt @@ -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 @@ -33,7 +33,7 @@ import com.intellij.debugger.engine.PositionManagerImpl.ClsSourcePosition import com.intellij.debugger.impl.DebuggerUtilsEx import com.intellij.debugger.requests.ClassPrepareRequestor import com.intellij.ide.highlighter.JavaFileType -import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.runReadActionBlocking import com.intellij.openapi.fileTypes.FileType import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFileManager @@ -47,6 +47,7 @@ import com.sun.jdi.request.ClassPrepareRequest class MixinPositionManager(private val debugProcess: DebugProcess) : MultiRequestPositionManager { + @Deprecated("Deprecated in Java") override fun getAcceptedFileTypes(): Set = setOf(JavaFileType.INSTANCE) @Throws(NoDataException::class) @@ -106,7 +107,7 @@ class MixinPositionManager(private val debugProcess: DebugProcess) : MultiReques } override fun getAllClasses(classPosition: SourcePosition): List { - return runReadAction { + return runReadActionBlocking { findMatchingClasses(classPosition) .flatMap { name -> debugProcess.virtualMachineProxy.classesByName(name).asSequence() } .toList() @@ -137,7 +138,7 @@ class MixinPositionManager(private val debugProcess: DebugProcess) : MultiReques requestor: ClassPrepareRequestor, position: SourcePosition, ): List { - return runReadAction { + return runReadActionBlocking { findMatchingClasses(position) .mapNotNull { name -> debugProcess.requestsManager.createClassPrepareRequest(requestor, name) } .toList() diff --git a/src/main/kotlin/platform/mixin/expression/MEExpressionAnnotator.kt b/src/main/kotlin/platform/mixin/expression/MEExpressionAnnotator.kt index 547077983..bbb0e5667 100644 --- a/src/main/kotlin/platform/mixin/expression/MEExpressionAnnotator.kt +++ b/src/main/kotlin/platform/mixin/expression/MEExpressionAnnotator.kt @@ -362,7 +362,7 @@ class MEExpressionAnnotator : Annotator { hostEditor.caretModel.moveToOffset(dummy.textOffset) PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(hostEditor.document) hostEditor.document.replaceString(dummy.textRange.startOffset, dummy.textRange.endOffset, "") - AutoPopupController.getInstance(project).autoPopupMemberLookup(hostEditor, null) + AutoPopupController.getInstance(project).scheduleAutoPopup(hostEditor, null) } } } diff --git a/src/main/kotlin/platform/mixin/expression/MEExpressionCompletionContributor.kt b/src/main/kotlin/platform/mixin/expression/MEExpressionCompletionContributor.kt index 12b810172..633dc5688 100644 --- a/src/main/kotlin/platform/mixin/expression/MEExpressionCompletionContributor.kt +++ b/src/main/kotlin/platform/mixin/expression/MEExpressionCompletionContributor.kt @@ -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 @@ -126,7 +126,7 @@ class MEExpressionCompletionContributor : CompletionContributor() { BasicExpressionCompletionContributor.createKeywordLookupItem(parameters.position, keyword.name) if (keyword.tailType != TailTypes.noneType()) { lookupItem = object : TailTypeDecorator(lookupItem) { - override fun computeTailType(context: InsertionContext?) = keyword.tailType + override fun computeTailType(context: InsertionContext) = keyword.tailType } } lookupItem diff --git a/src/main/kotlin/platform/mixin/expression/MEExpressionCompletionUtil.kt b/src/main/kotlin/platform/mixin/expression/MEExpressionCompletionUtil.kt index c85d14ac4..4d20d1990 100644 --- a/src/main/kotlin/platform/mixin/expression/MEExpressionCompletionUtil.kt +++ b/src/main/kotlin/platform/mixin/expression/MEExpressionCompletionUtil.kt @@ -1063,7 +1063,7 @@ object MEExpressionCompletionUtil { ) private fun LookupElement.withTail(tailType: TailType?) = object : TailTypeDecorator(this) { - override fun computeTailType(context: InsertionContext?) = tailType + override fun computeTailType(context: InsertionContext) = tailType } private fun LookupElementBuilder.withDefinition(id: String, definitionValue: String) = diff --git a/src/main/kotlin/platform/mixin/expression/MEExpressionTypedHandlerDelegate.kt b/src/main/kotlin/platform/mixin/expression/MEExpressionTypedHandlerDelegate.kt index fd6052b98..254936bf2 100644 --- a/src/main/kotlin/platform/mixin/expression/MEExpressionTypedHandlerDelegate.kt +++ b/src/main/kotlin/platform/mixin/expression/MEExpressionTypedHandlerDelegate.kt @@ -31,7 +31,7 @@ import com.intellij.psi.util.elementType class MEExpressionTypedHandlerDelegate : TypedHandlerDelegate() { override fun checkAutoPopup(charTyped: Char, project: Project, editor: Editor, file: PsiFile): Result { if (charTyped == ':' && file.language == MEExpressionLanguage) { - AutoPopupController.getInstance(project).autoPopupMemberLookup(editor) { + AutoPopupController.getInstance(project).scheduleAutoPopup(editor) { val offset = editor.caretModel.offset it.findElementAt(offset - 1).elementType == MEExpressionTypes.TOKEN_METHOD_REF } diff --git a/src/main/kotlin/platform/mixin/expression/gui/FlowStrings.kt b/src/main/kotlin/platform/mixin/expression/gui/FlowStrings.kt index 2dec83ba6..77fbaca91 100644 --- a/src/main/kotlin/platform/mixin/expression/gui/FlowStrings.kt +++ b/src/main/kotlin/platform/mixin/expression/gui/FlowStrings.kt @@ -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 @@ -128,7 +128,7 @@ private fun varString(flow: FlowValue, index: Int, project: Project, clazz: Clas if (location.opcode in Opcodes.ISTORE..Opcodes.ASTORE) { location = location.next } - val localName = ReadAction.compute<_, Nothing> { + val localName = ReadAction.computeBlocking<_, Nothing> { runCatching { LocalVariables.getLocalVariableAt(project, clazz, method, location, index) }.getOrNull() diff --git a/src/main/kotlin/platform/mixin/search/MixinSoftImplementMethodSuperSearcher.kt b/src/main/kotlin/platform/mixin/search/MixinSoftImplementMethodSuperSearcher.kt index 8f4879a8d..a6f1a06e9 100644 --- a/src/main/kotlin/platform/mixin/search/MixinSoftImplementMethodSuperSearcher.kt +++ b/src/main/kotlin/platform/mixin/search/MixinSoftImplementMethodSuperSearcher.kt @@ -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 @@ -21,7 +21,7 @@ package com.demonwav.mcdev.platform.mixin.search import com.demonwav.mcdev.platform.mixin.util.forEachSoftImplementedMethods -import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.runReadActionBlocking import com.intellij.psi.CommonClassNames import com.intellij.psi.PsiModifier import com.intellij.psi.search.searches.SuperMethodsSearch @@ -46,7 +46,7 @@ class MixinSoftImplementMethodSuperSearcher : // This is very simple and probably doesn't handle all cases // Right now we simply check for @Implements annotation on the class and look // for a similar method in the interface - runReadAction run@{ + runReadActionBlocking run@{ if (!method.name.contains('$') || method.hasModifierProperty(PsiModifier.STATIC)) { return@run true } diff --git a/src/main/kotlin/platform/mixin/util/AsmUtil.kt b/src/main/kotlin/platform/mixin/util/AsmUtil.kt index 8bd68dcb2..a1da87ed3 100644 --- a/src/main/kotlin/platform/mixin/util/AsmUtil.kt +++ b/src/main/kotlin/platform/mixin/util/AsmUtil.kt @@ -224,7 +224,7 @@ private val NODE_BY_PSI_CLASS_KEY = Key.create>("mcdev.n fun findClassNodeByPsiClass(psiClass: PsiClass, module: Module? = psiClass.findModule()): ClassNode? { return psiClass.lockedCached(NODE_BY_PSI_CLASS_KEY) { try { - val bytes = ByteCodeViewerManager.loadClassFileBytes(psiClass) + val bytes = ByteCodeViewerManager.findClassFile(psiClass)?.contentsToByteArray(false) if (bytes == null) { // find compiler output if (module == null) return@lockedCached null diff --git a/src/main/kotlin/platform/sponge/inspection/SpongeInjectionInspection.kt b/src/main/kotlin/platform/sponge/inspection/SpongeInjectionInspection.kt index 251eda05f..1e8d883e2 100644 --- a/src/main/kotlin/platform/sponge/inspection/SpongeInjectionInspection.kt +++ b/src/main/kotlin/platform/sponge/inspection/SpongeInjectionInspection.kt @@ -38,6 +38,7 @@ import com.intellij.codeInspection.LocalQuickFixOnPsiElement import com.intellij.codeInspection.ProblemDescriptor import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemsHolder +import com.intellij.codeInspection.options.OptPane import com.intellij.ide.util.PackageUtil import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.module.Module @@ -59,17 +60,12 @@ import com.intellij.psi.PsiVariable import com.intellij.psi.createSmartPointer import com.intellij.psi.impl.source.PsiClassReferenceType import com.siyeh.ig.BaseInspection -import com.siyeh.ig.BaseInspection.formatString -import com.siyeh.ig.ui.UiUtils -import javax.swing.JComponent import org.jdom.Element class SpongeInjectionInspection : AbstractBaseJavaLocalInspectionTool() { - private val injectableTypesList = Const.defaultInjectableTypes.toMutableList() - @JvmField - var injectableTypes: String = Const.serializedDefaultInjectableTypes + var injectableTypesList = Const.defaultInjectableTypes.toMutableList() override fun getStaticDescription() = "Invalid @Inject usage in Sponge plugin class." @@ -358,8 +354,6 @@ class SpongeInjectionInspection : AbstractBaseJavaLocalInspectionTool() { "org.bstats.sponge.MetricsLite2.Factory", "org.bstats.sponge.Metrics2.Factory", ) - - val serializedDefaultInjectableTypes: String = formatString(defaultInjectableTypes) } class RemoveAnnotationParameters(annotation: PsiAnnotation, val txt: String) : @@ -468,28 +462,23 @@ class SpongeInjectionInspection : AbstractBaseJavaLocalInspectionTool() { } } - override fun createOptionsPanel(): JComponent? { - val chooserList = UiUtils.createTreeClassChooserList( - injectableTypesList, - "Injectable types", - "Choose Injectable Type", - ) - UiUtils.setComponentSize(chooserList, 7, 25) - return chooserList - } + override fun getOptionsPane(): OptPane = OptPane.pane( + OptPane.stringList("injectableTypesList", "Injectable types") + ) override fun readSettings(node: Element) { + val hasNewFormat = node.getChildren("option").any { it.getAttributeValue("name") == "injectableTypesList" } super.readSettings(node) - BaseInspection.parseString(injectableTypes, injectableTypesList) - } - - override fun writeSettings(node: Element) { - injectableTypes = if (injectableTypesList.isEmpty()) { - Const.serializedDefaultInjectableTypes - } else { - formatString(injectableTypesList) + if (!hasNewFormat) { + for (child in node.getChildren("option")) { + if (child.getAttributeValue("name") == "injectableTypes") { + val value = child.getAttributeValue("value") + if (!value.isNullOrEmpty()) { + injectableTypesList.clear() + BaseInspection.parseString(value, injectableTypesList) + } + } + } } - - super.writeSettings(node) } } diff --git a/src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt b/src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt index e0920176c..4f72d2ea2 100644 --- a/src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt +++ b/src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt @@ -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 @@ -26,7 +26,7 @@ import com.intellij.codeInsight.ExternalAnnotationsArtifactsResolver import com.intellij.codeInsight.externalAnnotation.location.AnnotationsLocation import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.PathManager -import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.runReadActionBlocking import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project @@ -119,7 +119,7 @@ class TranslationExternalAnnotationsArtifactsResolver : ExternalAnnotationsArtif return false } - val annotationsPath = runReadAction { findAnnotationsPath(false) ?: findAnnotationsPath(true) } + val annotationsPath = runReadActionBlocking { findAnnotationsPath(false) ?: findAnnotationsPath(true) } ?: return false val editor = ExistingLibraryEditor(library, null) diff --git a/src/main/kotlin/translations/reference/TranslationReferenceSearch.kt b/src/main/kotlin/translations/reference/TranslationReferenceSearch.kt index b376c2761..e3f506016 100644 --- a/src/main/kotlin/translations/reference/TranslationReferenceSearch.kt +++ b/src/main/kotlin/translations/reference/TranslationReferenceSearch.kt @@ -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 @@ -23,7 +23,7 @@ package com.demonwav.mcdev.translations.reference import com.demonwav.mcdev.translations.TranslationFiles import com.intellij.find.FindModel import com.intellij.find.impl.FindInProjectUtil -import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.runReadActionBlocking import com.intellij.psi.PsiElement import com.intellij.psi.PsiReference import com.intellij.psi.search.searches.ReferencesSearch @@ -41,7 +41,7 @@ class TranslationReferenceSearch : QueryExecutor + 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) } diff --git a/src/main/kotlin/util/utils.kt b/src/main/kotlin/util/utils.kt index 73bc53915..03b15218f 100644 --- a/src/main/kotlin/util/utils.kt +++ b/src/main/kotlin/util/utils.kt @@ -26,7 +26,7 @@ import com.intellij.codeInspection.InspectionProfileEntry import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ModalityState import com.intellij.openapi.application.WriteAction -import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.runReadActionBlocking import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.progress.ProcessCanceledException @@ -120,7 +120,7 @@ inline fun PsiFile.applyWriteAction(crossinline func: PsiFile.() -> T): T { fun runReadActionAsync(runnable: () -> T): Promise { return runAsync { - runReadAction(runnable) + runReadActionBlocking(runnable) } }