Skip to content

Commit 56b3764

Browse files
authored
Add json5 support to mixin config jsons (#2375)
* add json5 support to mixin config jsons * remove debug line * use or pattern
1 parent 816437a commit 56b3764

File tree

5 files changed

+38
-12
lines changed

5 files changed

+38
-12
lines changed

src/main/kotlin/platform/mixin/config/MixinConfigFileType.kt

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,35 @@ package com.demonwav.mcdev.platform.mixin.config
2222

2323
import com.demonwav.mcdev.asset.PlatformAssets
2424
import com.intellij.json.JsonLanguage
25+
import com.intellij.json.json5.Json5Language
2526
import com.intellij.openapi.fileTypes.LanguageFileType
2627
import com.intellij.openapi.fileTypes.ex.FileTypeIdentifiableByVirtualFile
2728
import com.intellij.openapi.vfs.VirtualFile
2829

29-
object MixinConfigFileType : LanguageFileType(JsonLanguage.INSTANCE), FileTypeIdentifiableByVirtualFile {
30-
31-
private val filenameRegex = "(^|\\.)mixins?(\\.[^.]+)*\\.json\$".toRegex()
30+
interface MixinConfigFileType : FileTypeIdentifiableByVirtualFile {
31+
fun getFilenameRegex() : Regex
3232

3333
// Dynamic file type detection is sadly needed as we're overriding the built-in json file type.
3434
// Simply using an extension pattern is not sufficient as there is no way to bump the version to tell
3535
// the cache that the pattern has changed, as it now has, without changing the file type name.
3636
// See https://www.plugin-dev.com/intellij/custom-language/file-type-detection/#guidelines
37-
override fun isMyFileType(file: VirtualFile) = file.name.contains(filenameRegex)
37+
override fun isMyFileType(file: VirtualFile) = file.name.contains(getFilenameRegex())
3838

39-
override fun getName() = "Mixin Configuration"
4039
override fun getDescription() = "Mixin configuration"
4140
override fun getDefaultExtension() = ""
4241
override fun getIcon() = PlatformAssets.MIXIN_ICON
43-
}
42+
43+
object Json : LanguageFileType(JsonLanguage.INSTANCE), MixinConfigFileType {
44+
private val filenameRegex = "(^|\\.)mixins?(\\.[^.]+)*\\.json\$".toRegex()
45+
46+
override fun getFilenameRegex() : Regex = filenameRegex
47+
override fun getName() = "Mixin Json Configuration"
48+
}
49+
50+
object Json5 : LanguageFileType(Json5Language.INSTANCE), MixinConfigFileType {
51+
private var filenameRegex = "(^|\\.)mixins?(\\.[^.]+)*\\.json5\$".toRegex()
52+
53+
override fun getFilenameRegex() : Regex = filenameRegex
54+
override fun getName() = "Mixin Json5 Configuration"
55+
}
56+
}

src/main/kotlin/platform/mixin/config/MixinConfigImportOptimizer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class MixinConfigImportOptimizer : ImportOptimizer {
8181
}
8282
}
8383

84-
override fun supports(file: PsiFile) = file is JsonFile && file.fileType == MixinConfigFileType
84+
override fun supports(file: PsiFile) = file is JsonFile && file.fileType is MixinConfigFileType
8585

8686
override fun processFile(file: PsiFile): Runnable {
8787
if (file !is JsonFile) {

src/main/kotlin/platform/mixin/config/inspection/MixinConfigInspection.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ abstract class MixinConfigInspection : LocalInspectionTool() {
3434
protected abstract fun buildVisitor(holder: ProblemsHolder): PsiElementVisitor
3535

3636
private fun checkFile(file: PsiFile): Boolean {
37-
return file.fileType === MixinConfigFileType && MixinModuleType.isInModule(file)
37+
return file.fileType is MixinConfigFileType && MixinModuleType.isInModule(file)
3838
}
3939

4040
final override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {

src/main/kotlin/platform/mixin/config/reference/MixinConfigReferenceContributor.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,14 @@ import com.intellij.psi.PsiReferenceContributor
3131
import com.intellij.psi.PsiReferenceRegistrar
3232

3333
class MixinConfigReferenceContributor : PsiReferenceContributor() {
34-
3534
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
35+
val anyMixinConfigFileType = StandardPatterns.or(
36+
StandardPatterns.`object`(MixinConfigFileType.Json),
37+
StandardPatterns.`object`(MixinConfigFileType.Json5)
38+
)
39+
3640
val pattern = PlatformPatterns.psiElement(JsonStringLiteral::class.java)
37-
.inFile(PlatformPatterns.psiFile().withFileType(StandardPatterns.`object`(MixinConfigFileType)))
41+
.inFile(PlatformPatterns.psiFile().withFileType(anyMixinConfigFileType))
3842

3943
registrar.registerReferenceProvider(pattern.isPropertyKey(), ConfigProperty)
4044
registrar.registerReferenceProvider(pattern.isPropertyValue("package"), MixinPackage)
@@ -47,3 +51,4 @@ class MixinConfigReferenceContributor : PsiReferenceContributor() {
4751
registrar.registerReferenceProvider(pattern.withParent(mixinList.isPropertyValue("client")), MixinClass)
4852
}
4953
}
54+

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -720,14 +720,22 @@
720720
id="Find Mixins"/>
721721

722722
<!-- Mixin configuration -->
723-
<fileType name="Mixin Configuration" language="JSON"
724-
implementationClass="com.demonwav.mcdev.platform.mixin.config.MixinConfigFileType"
723+
<fileType name="Mixin Json Configuration" language="JSON"
724+
implementationClass="com.demonwav.mcdev.platform.mixin.config.MixinConfigFileType$Json"
725725
fieldName="INSTANCE"/>
726726
<psi.referenceContributor language="JSON"
727727
implementation="com.demonwav.mcdev.platform.mixin.config.reference.MixinConfigReferenceContributor"/>
728728
<lang.importOptimizer language="JSON"
729729
implementationClass="com.demonwav.mcdev.platform.mixin.config.MixinConfigImportOptimizer"/>
730730

731+
<fileType name="Mixin Json5 Configuration" language="JSON5"
732+
implementationClass="com.demonwav.mcdev.platform.mixin.config.MixinConfigFileType$Json5"
733+
fieldName="INSTANCE"/>
734+
<psi.referenceContributor language="JSON5"
735+
implementation="com.demonwav.mcdev.platform.mixin.config.reference.MixinConfigReferenceContributor"/>
736+
<lang.importOptimizer language="JSON5"
737+
implementationClass="com.demonwav.mcdev.platform.mixin.config.MixinConfigImportOptimizer"/>
738+
731739
<!-- Mixin Line Marker Providers -->
732740
<codeInsight.lineMarkerProvider language="JAVA"
733741
implementationClass="com.demonwav.mcdev.platform.mixin.insight.MixinLineMarkerProvider"/>

0 commit comments

Comments
 (0)