Skip to content

Commit eaa630f

Browse files
committed
Merge branch '2023.3' into 2024.1
2 parents 0e680c6 + bb41432 commit eaa630f

File tree

14 files changed

+80
-73
lines changed

14 files changed

+80
-73
lines changed

build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ license {
287287
style["bnf"] = HeaderStyle.BLOCK_COMMENT.format
288288

289289
val endings = listOf("java", "kt", "kts", "groovy", "gradle.kts", "xml", "properties", "html", "flex", "bnf")
290+
exclude("META-INF/plugin.xml") // https://youtrack.jetbrains.com/issue/IDEA-345026
290291
include(endings.map { "**/*.$it" })
291292

292293
exclude("com/demonwav/mcdev/platform/mixin/invalidInjectorMethodSignature/*.java")

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ kotlin.code.style=official
2424
ideaVersion = 241.10840-EAP-CANDIDATE-SNAPSHOT
2525
ideaVersionName = 2024.1
2626

27-
coreVersion = 1.7.1
27+
coreVersion = 1.7.2
2828
downloadIdeaSources = true
2929

3030
pluginTomlVersion = 241.10840.7

src/main/kotlin/creator/MinecraftModuleBuilder.kt

+3-4
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import com.demonwav.mcdev.creator.buildsystem.BuildSystemPropertiesStep
2626
import com.demonwav.mcdev.creator.platformtype.PlatformTypeStep
2727
import com.demonwav.mcdev.creator.step.NewProjectWizardChainStep.Companion.nextStep
2828
import com.demonwav.mcdev.creator.step.TemplateOutdatedStep
29-
import com.demonwav.mcdev.platform.MinecraftModuleType
3029
import com.intellij.ide.projectWizard.ProjectSettingsStep
3130
import com.intellij.ide.util.projectWizard.WizardContext
3231
import com.intellij.ide.wizard.AbstractNewProjectWizardBuilder
@@ -37,9 +36,9 @@ import com.intellij.openapi.roots.ModifiableRootModel
3736

3837
class MinecraftModuleBuilder : AbstractNewProjectWizardBuilder() {
3938

40-
override fun getPresentableName() = MinecraftModuleType.NAME
39+
override fun getPresentableName() = "Minecraft"
4140
override fun getNodeIcon() = PlatformAssets.MINECRAFT_ICON
42-
override fun getGroupName() = MinecraftModuleType.NAME
41+
override fun getGroupName() = "Minecraft"
4342
override fun getBuilderId() = "MINECRAFT_MODULE"
4443
override fun getDescription() = MCDevBundle("creator.ui.create_minecraft_project")
4544

@@ -51,7 +50,7 @@ class MinecraftModuleBuilder : AbstractNewProjectWizardBuilder() {
5150
}
5251
}
5352

54-
override fun getParentGroup() = MinecraftModuleType.NAME
53+
override fun getParentGroup() = "Minecraft"
5554

5655
override fun createStep(context: WizardContext) = RootNewProjectWizardStep(context)
5756
.nextStep(::NewProjectWizardBaseStep)

src/main/kotlin/facet/MinecraftFacet.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import com.demonwav.mcdev.platform.AbstractModuleType
2727
import com.demonwav.mcdev.platform.PlatformType
2828
import com.demonwav.mcdev.util.SourceType
2929
import com.demonwav.mcdev.util.filterNotNull
30-
import com.demonwav.mcdev.util.invokeAndWait
3130
import com.demonwav.mcdev.util.mapFirstNotNull
3231
import com.google.common.collect.HashMultimap
3332
import com.intellij.facet.Facet
@@ -36,6 +35,7 @@ import com.intellij.facet.FacetTypeId
3635
import com.intellij.facet.FacetTypeRegistry
3736
import com.intellij.ide.projectView.ProjectView
3837
import com.intellij.openapi.application.runReadAction
38+
import com.intellij.openapi.application.runWriteAction
3939
import com.intellij.openapi.application.runWriteActionAndWait
4040
import com.intellij.openapi.module.Module
4141
import com.intellij.openapi.module.ModuleGrouper
@@ -77,9 +77,9 @@ class MinecraftFacet(
7777
roots.clear()
7878
}
7979

80-
fun refresh() {
80+
fun refresh() = runWriteActionAndWait {
8181
if (module.isDisposed) {
82-
return
82+
return@runWriteActionAndWait
8383
}
8484

8585
// Don't allow parent types with child types in auto detected set
@@ -122,9 +122,9 @@ class MinecraftFacet(
122122
ProjectView.getInstance(module.project).refresh()
123123
}
124124

125-
private fun updateRoots() = invokeAndWait {
125+
private fun updateRoots() = runWriteAction {
126126
if (module.isDisposed) {
127-
return@invokeAndWait
127+
return@runWriteAction
128128
}
129129

130130
roots.clear()

src/main/kotlin/facet/MinecraftFacetDetector.kt

+17-9
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,16 @@ import com.intellij.openapi.startup.ProjectActivity
5050
import com.intellij.openapi.util.Key
5151
import com.intellij.platform.ide.progress.withBackgroundProgress
5252
import com.intellij.platform.util.progress.forEachWithProgress
53+
import com.intellij.util.concurrency.NonUrgentExecutor
5354
import kotlinx.coroutines.CoroutineScope
5455
import kotlinx.coroutines.Dispatchers
5556
import kotlinx.coroutines.Job
57+
import kotlinx.coroutines.asCoroutineDispatcher
5658
import kotlinx.coroutines.cancelAndJoin
5759
import kotlinx.coroutines.job
5860
import kotlinx.coroutines.launch
61+
import kotlinx.coroutines.sync.Mutex
62+
import kotlinx.coroutines.sync.withLock
5963
import org.jetbrains.plugins.gradle.util.GradleUtil
6064

6165
class MinecraftFacetDetector : ProjectActivity {
@@ -69,15 +73,13 @@ class MinecraftFacetDetector : ProjectActivity {
6973

7074
override suspend fun execute(project: Project) {
7175
val detectorService = project.service<FacetDetectorScopeProvider>()
72-
detectorService.currentJob?.cancelAndJoin()
73-
withBackgroundProgress(project, "Detecting Minecraft Frameworks", cancellable = false) {
74-
detectorService.currentJob = coroutineContext.job
75-
MinecraftModuleRootListener.doCheck(project)
76-
}
76+
MinecraftModuleRootListener.doCheckUnderProgress(project, detectorService)
7777
}
7878

7979
@Service(Service.Level.PROJECT)
8080
private class FacetDetectorScopeProvider(val scope: CoroutineScope) {
81+
val dispatcher = NonUrgentExecutor.getInstance().asCoroutineDispatcher()
82+
val lock = Mutex()
8183
var currentJob: Job? = null
8284
}
8385

@@ -89,12 +91,18 @@ class MinecraftFacetDetector : ProjectActivity {
8991

9092
val project = event.source as? Project ?: return
9193
val detectorService = project.service<FacetDetectorScopeProvider>()
92-
detectorService.scope.launch {
93-
detectorService.currentJob?.cancelAndJoin()
94-
withBackgroundProgress(project, "Detecting Minecraft Frameworks", cancellable = false) {
94+
detectorService.scope.launch(detectorService.dispatcher) {
95+
doCheckUnderProgress(project, detectorService)
96+
}
97+
}
98+
99+
suspend fun doCheckUnderProgress(project: Project, detectorService: FacetDetectorScopeProvider) {
100+
withBackgroundProgress(project, "Detecting Minecraft Frameworks", cancellable = false) {
101+
detectorService.lock.withLock {
102+
detectorService.currentJob?.cancelAndJoin()
95103
detectorService.currentJob = coroutineContext.job
96-
doCheck(project)
97104
}
105+
doCheck(project)
98106
}
99107
}
100108

src/main/kotlin/platform/MinecraftModuleType.kt

-43
This file was deleted.

src/main/kotlin/platform/forge/creator/gradle-steps.kt

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import com.demonwav.mcdev.creator.step.LicenseStep
4141
import com.demonwav.mcdev.creator.step.NewProjectWizardChainStep.Companion.nextStep
4242
import com.demonwav.mcdev.creator.step.UseMixinsStep
4343
import com.demonwav.mcdev.util.MinecraftTemplates
44+
import com.demonwav.mcdev.util.MinecraftVersions
4445
import com.demonwav.mcdev.util.SemanticVersion
4546
import com.intellij.ide.wizard.NewProjectWizardStep
4647
import com.intellij.openapi.application.WriteAction
@@ -102,6 +103,7 @@ class ForgeGradleFilesStep(parent: NewProjectWizardStep) : AbstractLongRunningAs
102103
"AUTHOR_LIST" to authors.joinToString(", "),
103104
"LICENSE" to license.id,
104105
"HAS_DATA" to "true",
106+
"MERGE_RESOURCES_AND_CLASSES" to (mcVersion >= MinecraftVersions.MC1_20_3),
105107
)
106108

107109
if (javaVersion != null) {

src/main/kotlin/platform/mcp/actions/SrgActionBase.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import com.intellij.psi.PsiElement
3737
import com.intellij.psi.PsiIdentifier
3838
import com.intellij.psi.PsiMember
3939
import com.intellij.psi.PsiReference
40+
import com.intellij.psi.util.createSmartPointer
4041
import com.intellij.ui.LightColors
4142
import com.intellij.ui.awt.RelativePoint
4243
import java.awt.Point
@@ -88,9 +89,10 @@ abstract class SrgActionBase : AnAction() {
8889

8990
val project = e.project ?: return
9091

92+
val elementPointer = getDataFromActionEvent(e)?.element?.createSmartPointer()
93+
val editor = getDataFromActionEvent(e)?.editor
9194
invokeLater {
92-
val element = getDataFromActionEvent(e)?.element
93-
val editor = getDataFromActionEvent(e)?.editor
95+
val element = elementPointer?.element
9496
if (element != null && editor != null) {
9597
val pos = editor.offsetToVisualPosition(element.textRange.endOffset - element.textLength / 2)
9698
val at = RelativePoint(

src/main/kotlin/platform/mixin/handlers/injectionPoint/NewInsnInjectionPoint.kt

+21-2
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,30 @@ class NewInsnSelectorParser : MixinSelectorParser {
219219
if (!at.hasQualifiedName(AT)) return null
220220
if (at.findAttributeValue("value")?.constantStringValue != "NEW") return null
221221

222-
return NewInsnSelector(value)
222+
val strippedValue = value.replace(" ", "")
223+
return if (strippedValue.startsWith('(')) {
224+
NewInsnDescriptorSelector(strippedValue)
225+
} else {
226+
NewInsnTypeSelector(strippedValue)
227+
}
223228
}
224229
}
225230

226-
private class NewInsnSelector(
231+
private class NewInsnTypeSelector(
232+
override val owner: String,
233+
) : MixinSelector {
234+
override fun matchField(owner: String, name: String, desc: String) = false
235+
236+
override fun matchMethod(owner: String, name: String, desc: String): Boolean {
237+
return name == "<init>" && owner == this.owner
238+
}
239+
240+
override val fieldDescriptor = null
241+
override val methodDescriptor = null
242+
override val displayName = owner
243+
}
244+
245+
private class NewInsnDescriptorSelector(
227246
override val methodDescriptor: String,
228247
) : MixinSelector {
229248
override fun matchField(owner: String, name: String, desc: String): Boolean = false

src/main/kotlin/platform/mixin/reference/MixinSelectors.kt

+5
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ class MixinMemberParser : MixinSelectorParser {
240240
}
241241

242242
owner = internalOwner.replace('/', '.')
243+
244+
// if owner is all there is to the selector, match anything with the owner
245+
if (pos == reference.length - 1) {
246+
return MemberReference("", null, owner, matchAllNames = true, matchAllDescs = true)
247+
}
243248
} else {
244249
// No owner/qualifier specified
245250
pos = -1

src/main/kotlin/platform/sponge/reference/SpongeReferenceContributor.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ private class GetterReference(element: PsiLanguageInjectionHost) : PsiReferenceB
7878
}
7979

8080
override fun getVariants(): Array<Any> {
81-
val literal = element.toUElementOfType<ULiteralExpression>() ?: return ArrayUtil.EMPTY_OBJECT_ARRAY
81+
val literal = element.toUElement() ?: return ArrayUtil.EMPTY_OBJECT_ARRAY
8282
val (eventClass, _) = literal.uastEventListener
8383
?: return ArrayUtil.EMPTY_OBJECT_ARRAY
8484
val methodByClass = mutableMapOf<String, Pair<PsiMethod, PsiClass>>()

src/main/resources/META-INF/plugin.xml

+5-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
GNU General Public License for more details.
1616
1717
You should have received a copy of the GNU Lesser General Public License
18-
along with this program. If not, see <https://www.gnu.org/licenses/>.
18+
along with this program. If not, see https://www.gnu.org/licenses/.
1919
-->
2020

2121
<idea-plugin require-restart="true">
@@ -81,7 +81,7 @@
8181
<extensionPoint name="injectionPoint" beanClass="com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.InjectionPointInfo" dynamic="true">
8282
<with attribute="implementation" implements="com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.InjectionPoint"/>
8383
</extensionPoint>
84-
<extensionPoint name="injectionPointAnnotation" beanClass="com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.InjectionPointAnnotation" />
84+
<extensionPoint name="injectionPointAnnotation" beanClass="com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.InjectionPointAnnotation" dynamic="true" />
8585
</extensionPoints>
8686

8787
<extensions defaultExtensionNs="com.demonwav.minecraft-dev">
@@ -181,11 +181,11 @@
181181
<!--region NO PLATFORM-->
182182
<!---->
183183

184-
<moduleType id="MINECRAFT_MODULE_TYPE" implementationClass="com.demonwav.mcdev.platform.MinecraftModuleType"/>
185184
<moduleBuilder id="MINECRAFT_MODULE" builderClass="com.demonwav.mcdev.creator.MinecraftModuleBuilder"/>
186185
<facetType implementation="com.demonwav.mcdev.facet.MinecraftFacetType" />
187186
<postStartupActivity implementation="com.demonwav.mcdev.facet.MinecraftFacetDetector"/>
188187
<notificationGroup id="Minecraft project creator" displayType="STICKY_BALLOON"/>
188+
<notificationGroup id="Minecraft facet" displayType="STICKY_BALLOON"/>
189189

190190
<!-- File templates are for project creations -->
191191
<fileTemplateGroup implementation="com.demonwav.mcdev.util.MinecraftTemplates"/>
@@ -266,6 +266,7 @@
266266
<annotator language="MCLang" implementationClass="com.demonwav.mcdev.translations.intentions.TranslationFileAnnotator"/>
267267
<annotator language="JSON" implementationClass="com.demonwav.mcdev.translations.intentions.TranslationFileAnnotator"/>
268268
<intentionAction>
269+
<language>JAVA</language>
269270
<className>com.demonwav.mcdev.translations.intentions.ConvertToTranslationIntention</className>
270271
<category>Minecraft</category>
271272
<descriptionDirectoryName>convertToTranslation</descriptionDirectoryName>
@@ -354,7 +355,7 @@
354355
<!--endregion-->
355356

356357
<!--region NEOFORGE-->
357-
<dependencySupport coordinate="net.neoforge:neoforge" kind="java"/>
358+
<dependencySupport coordinate="net.neoforged:neoforge" kind="java"/>
358359

359360
<fileIconProvider implementation="com.demonwav.mcdev.platform.neoforge.NeoForgeFileIconProvider"/>
360361
<implicitUsageProvider implementation="com.demonwav.mcdev.platform.neoforge.insight.NeoForgeImplicitUsageProvider" />

src/main/resources/fileTemplates/j2ee/forge/Forge (1.13+) build.gradle.ft

+12-2
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,22 @@ minecraft {
9090
// You can set various levels here.
9191
// Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
9292
property 'forge.logging.console.level', 'debug'
93+
#if (!${MERGE_RESOURCES_AND_CLASSES})
94+
95+
mods {
96+
"${mod_id}" {
97+
source sourceSets.main
98+
}
99+
}
100+
#end
93101
}
94102

95-
#if (${GAME_TEST_FRAMEWORK})
96103
client {
104+
#if (${GAME_TEST_FRAMEWORK})
97105
// Comma-separated list of namespaces to load gametests from. Empty = all namespaces.
98106
property 'forge.enabledGameTestNamespaces', mod_id
99-
}
100107
#end
108+
}
101109

102110
server {
103111
#if (${GAME_TEST_FRAMEWORK})
@@ -217,6 +225,7 @@ tasks.named('jar', Jar).configure {
217225
tasks.withType(JavaCompile).configureEach {
218226
options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
219227
}
228+
#if (${MERGE_RESOURCES_AND_CLASSES})
220229

221230
// Merge the resources and classes into the same directory.
222231
// This is done because java expects modules to be in a single directory.
@@ -227,3 +236,4 @@ sourceSets.each {
227236
it.output.resourcesDir = dir
228237
it.java.destinationDirectory = dir
229238
}
239+
#end

src/main/resources/messages/MinecraftDevelopment.properties

+3
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ error_reporter.report.error=Error Submitting Issue: {0}.
9292
error_reporter.report.error.action=Open an issue on the GitHub issue tracker
9393

9494
facet.editor.name=Minecraft Module Settings
95+
facet.reimport.failed.title=Minecraft facet refresh
96+
facet.reimport.failed.content.no_error=Failed to start project refresh, please refresh your project manually.
97+
facet.reimport.failed.content.with_error=Failed to start project refresh, please refresh your project manually. Cause: {0}
9598

9699
generate.event_listener.title=Generate Event Listener
97100
generate.event_listener.settings=Event Listener Settings

0 commit comments

Comments
 (0)