Skip to content

Commit 27ac5d9

Browse files
committed
Merge branch '2026.1' into 2026.2
2 parents f88bdf4 + c970c61 commit 27ac5d9

9 files changed

Lines changed: 62 additions & 15 deletions

File tree

changelog.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Minecraft Development for IntelliJ
22

3+
## [1.8.21]
4+
5+
### Fixed
6+
7+
- Fixed decompile button not working for Fabric and VanillaGradle projects
8+
- Support debugging interpolated MixinExtras expression strings
9+
- Fixed shadow warning on abstract enum constructors
10+
311
## [1.8.20]
412

513
### Added

create_release.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import sys
1818
from typing import List, Tuple
1919

20-
BRANCHES=["2025.2", "2025.3", "2026.1", "2026.2"]
20+
BRANCHES=["2025.3", "2026.1", "2026.2"]
2121

2222
def check_file_contains_version(path: str, version: str) -> bool:
2323
try:

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ org.gradle.jvmargs=-Xmx1g
2323

2424
ideaVersionName = 2026.2
2525

26-
coreVersion = 1.8.20
26+
coreVersion = 1.8.21
2727

2828
# Silences a build-time warning because we are bundling our own kotlin library
2929
kotlin.stdlib.default.dependency = false

readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Minecraft Development for IntelliJ
3131
</tr>
3232
</table>
3333

34-
Info and Documentation [![Current Release](https://img.shields.io/badge/release-1.8.19-orange.svg?style=flat-square)](https://plugins.jetbrains.com/plugin/8327)
34+
Info and Documentation [![Current Release](https://img.shields.io/badge/release-1.8.21-orange.svg?style=flat-square)](https://plugins.jetbrains.com/plugin/8327)
3535
----------------------
3636

3737
<a href="https://discord.gg/j6UNcfr"><img src="https://i.imgur.com/JXu9C1G.png" height="48px"></img></a>

src/main/kotlin/platform/mixin/expression/gui/FlowDiagram.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import com.intellij.openapi.progress.checkCanceled
2929
import com.intellij.openapi.project.Project
3030
import com.intellij.openapi.util.text.StringUtil
3131
import com.intellij.pom.Navigatable
32-
import com.intellij.psi.PsiLiteralExpression
32+
import com.intellij.psi.PsiElement
3333
import com.intellij.psi.PsiModifierList
3434
import com.intellij.psi.SmartPointerManager
3535
import com.llamalad7.mixinextras.expression.impl.point.ExpressionContext
@@ -106,7 +106,7 @@ class FlowDiagram(
106106

107107
fun populateMatchStatuses(
108108
module: Module,
109-
currentStringLit: PsiLiteralExpression,
109+
currentStringLit: PsiElement,
110110
currentModifierList: PsiModifierList
111111
) {
112112
val stringRef = SmartPointerManager.getInstance(module.project).createSmartPsiElementPointer(currentStringLit)

src/main/kotlin/platform/mixin/expression/gui/MEShowFlowAction.kt

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,18 @@
2020

2121
package com.demonwav.mcdev.platform.mixin.expression.gui
2222

23-
import com.demonwav.mcdev.platform.mixin.expression.psi.MEExpressionFile
2423
import com.demonwav.mcdev.platform.mixin.handlers.InjectorAnnotationHandler
2524
import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler
2625
import com.demonwav.mcdev.platform.mixin.reference.MethodReference
2726
import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember
27+
import com.demonwav.mcdev.platform.mixin.util.MixinConstants
2828
import com.demonwav.mcdev.platform.mixin.util.findClassNodeByPsiClass
2929
import com.demonwav.mcdev.platform.mixin.util.isMixin
3030
import com.demonwav.mcdev.platform.mixin.util.mixinTargets
3131
import com.demonwav.mcdev.platform.mixin.util.shortDescString
3232
import com.demonwav.mcdev.platform.mixin.util.shortName
3333
import com.demonwav.mcdev.util.descriptor
3434
import com.demonwav.mcdev.util.ifEmpty
35-
import com.intellij.lang.injection.InjectedLanguageManager
3635
import com.intellij.lang.java.JavaLanguage
3736
import com.intellij.openapi.actionSystem.ActionUpdateThread
3837
import com.intellij.openapi.actionSystem.AnAction
@@ -43,11 +42,16 @@ import com.intellij.openapi.components.service
4342
import com.intellij.openapi.ui.popup.JBPopupFactory
4443
import com.intellij.openapi.ui.popup.PopupStep
4544
import com.intellij.openapi.ui.popup.util.BaseListPopupStep
45+
import com.intellij.psi.PsiArrayInitializerMemberValue
4646
import com.intellij.psi.PsiClass
47+
import com.intellij.psi.PsiElement
4748
import com.intellij.psi.PsiIdentifier
4849
import com.intellij.psi.PsiLiteralExpression
4950
import com.intellij.psi.PsiMethod
51+
import com.intellij.psi.PsiNameValuePair
52+
import com.intellij.psi.util.isAncestor
5053
import com.intellij.psi.util.parentOfType
54+
import com.intellij.psi.util.parents
5155
import org.objectweb.asm.tree.ClassNode
5256
import org.objectweb.asm.tree.LineNumberNode
5357
import org.objectweb.asm.tree.MethodNode
@@ -125,13 +129,8 @@ class MEShowFlowAction : AnAction() {
125129

126130
fun resolveExpressionTarget(): Sequence<Resolved> {
127131
val module = e.getData(LangDataKeys.MODULE) ?: return emptySequence()
128-
val string = element.parentOfType<PsiLiteralExpression>() ?: return emptySequence()
132+
val string = findExpressionString(element) ?: return emptySequence()
129133
val modifierList = string.parentOfType<PsiMethod>()?.modifierList ?: return emptySequence()
130-
if (InjectedLanguageManager.getInstance(project).getInjectedPsiFiles(string).orEmpty()
131-
.none { it.first is MEExpressionFile }
132-
) {
133-
return emptySequence()
134-
}
135134
val (injectorAnnotation, injector) =
136135
modifierList.annotations.firstNotNullOfOrNull { ann ->
137136
(MixinAnnotationHandler.forMixinAnnotation(ann, project) as? InjectorAnnotationHandler)
@@ -158,6 +157,23 @@ class MEShowFlowAction : AnAction() {
158157
}
159158
}
160159

160+
private fun findExpressionString(anchor: PsiElement): PsiElement? {
161+
val nameValue = anchor.parentOfType<PsiNameValuePair>() ?: return null
162+
if (nameValue.name != "value" && nameValue.name != null) {
163+
// Wrong attribute
164+
return null
165+
}
166+
if (anchor.parentOfType<PsiMethod>()?.modifierList?.hasAnnotation(MixinConstants.MixinExtras.EXPRESSION) != true) {
167+
// Not an Expression
168+
return null
169+
}
170+
return when (val value = nameValue.value) {
171+
null -> null
172+
is PsiArrayInitializerMemberValue -> value.initializers.firstOrNull { it.isAncestor(anchor) }
173+
else -> value.takeIf { it.isAncestor(anchor) }
174+
}
175+
}
176+
161177
private data class Resolved(val clazz: ClassNode, val method: MethodNode, val action: (FlowDiagram) -> Unit = {}) {
162178
override fun toString() = "${clazz.shortName}::${method.name}${shortDescString(method.desc)}"
163179
}

src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler
2424
import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember
2525
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.OVERWRITE
2626
import com.demonwav.mcdev.platform.mixin.util.accessLevel
27+
import com.demonwav.mcdev.platform.mixin.util.bytecodeFriendlyAccessLevel
2728
import com.demonwav.mcdev.platform.mixin.util.findStubMethod
2829
import com.demonwav.mcdev.platform.mixin.util.hasModifier
2930
import com.demonwav.mcdev.platform.mixin.util.internalNameToShortName
@@ -55,7 +56,7 @@ class OverwriteModifiersInspection : OverwriteInspection() {
5556

5657
// Check access modifiers
5758
val targetAccessLevel = target.method.accessLevel
58-
val currentAccessLevel = PsiUtil.getAccessLevel(modifierList)
59+
val currentAccessLevel = modifierList.bytecodeFriendlyAccessLevel()
5960
if (currentAccessLevel < targetAccessLevel) {
6061
val targetModifier = PsiUtil.getAccessModifier(targetAccessLevel)
6162
val currentModifier = PsiUtil.getAccessModifier(currentAccessLevel)

src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.demonwav.mcdev.platform.mixin.util.MixinConstants
2828
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.FINAL
2929
import com.demonwav.mcdev.platform.mixin.util.MixinTargetMember
3030
import com.demonwav.mcdev.platform.mixin.util.accessLevel
31+
import com.demonwav.mcdev.platform.mixin.util.bytecodeFriendlyAccessLevel
3132
import com.demonwav.mcdev.util.findKeyword
3233
import com.intellij.codeInsight.intention.AddAnnotationModCommandAction
3334
import com.intellij.codeInsight.intention.QuickFixFactory
@@ -88,7 +89,7 @@ class ShadowModifiersInspection : MixinInspection() {
8889

8990
// Check access level
9091
val targetAccessLevel = getTargetAccessLevel(target, shadowModifierList)
91-
val shadowAccessLevel = PsiUtil.getAccessLevel(shadowModifierList)
92+
val shadowAccessLevel = shadowModifierList.bytecodeFriendlyAccessLevel()
9293
if (targetAccessLevel != shadowAccessLevel) {
9394
val targetModifier = PsiUtil.getAccessModifier(targetAccessLevel)
9495
val shadowModifier = PsiUtil.getAccessModifier(shadowAccessLevel)

src/main/kotlin/platform/mixin/util/Mixin.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ import com.intellij.psi.PsiDisjunctionType
4545
import com.intellij.psi.PsiElement
4646
import com.intellij.psi.PsiIntersectionType
4747
import com.intellij.psi.PsiLiteralExpression
48+
import com.intellij.psi.PsiMethod
49+
import com.intellij.psi.PsiModifier
50+
import com.intellij.psi.PsiModifierList
4851
import com.intellij.psi.PsiParameter
4952
import com.intellij.psi.PsiPrimitiveType
5053
import com.intellij.psi.PsiType
@@ -53,6 +56,7 @@ import com.intellij.psi.search.GlobalSearchScope
5356
import com.intellij.psi.util.InheritanceUtil
5457
import com.intellij.psi.util.PsiModificationTracker
5558
import com.intellij.psi.util.PsiTypesUtil
59+
import com.intellij.psi.util.PsiUtil
5660
import com.intellij.psi.util.TypeConversionUtil
5761
import org.objectweb.asm.Opcodes
5862
import org.objectweb.asm.tree.ClassNode
@@ -319,3 +323,20 @@ fun PsiElement.hasNamedLocalVariables(className: String): Boolean {
319323

320324
return true
321325
}
326+
327+
@PsiUtil.AccessLevel
328+
fun PsiModifierList.bytecodeFriendlyAccessLevel(): Int {
329+
val originalLevel = PsiUtil.getAccessLevel(this)
330+
331+
val parent = this.parent
332+
333+
// Constructors are package-local in abstract enums in the bytecode, but not in source
334+
if (parent is PsiMethod && parent.isConstructor) {
335+
val containingClass = parent.containingClass
336+
if (containingClass?.isEnum == true && containingClass.hasModifierProperty(PsiModifier.ABSTRACT)) {
337+
return PsiUtil.ACCESS_LEVEL_PACKAGE_LOCAL
338+
}
339+
}
340+
341+
return originalLevel
342+
}

0 commit comments

Comments
 (0)