Skip to content

Commit

Permalink
New: Support mixinextras entry in mixin configs.
Browse files Browse the repository at this point in the history
  • Loading branch information
LlamaLad7 committed Jan 18, 2025
1 parent 3f47845 commit 1cd6ab6
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 12 deletions.
45 changes: 33 additions & 12 deletions src/main/kotlin/platform/mixin/config/reference/ConfigProperty.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,13 @@ package com.demonwav.mcdev.platform.mixin.config.reference
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Classes.MIXIN_CONFIG
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Classes.MIXIN_SERIALIZED_NAME
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Classes.SERIALIZED_NAME
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.MixinExtras.MIXIN_EXTRAS_CONFIG
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.MixinExtras.MIXIN_EXTRAS_CONFIG_KEY
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.MixinExtras.MIXIN_EXTRAS_SERIALIZED_NAME
import com.demonwav.mcdev.util.constantStringValue
import com.demonwav.mcdev.util.findAnnotation
import com.demonwav.mcdev.util.ifEmpty
import com.demonwav.mcdev.util.reference.InspectionReference
import com.demonwav.mcdev.util.toTypedArray
import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.json.psi.JsonProperty
import com.intellij.json.psi.JsonStringLiteral
Expand All @@ -48,18 +51,25 @@ object ConfigProperty : PsiReferenceProvider() {
arrayOf(Reference(element as JsonStringLiteral))

fun resolveReference(element: JsonStringLiteral): PsiElement? {
val name = element.value
customSubConfigs[name]?.let {
return JavaPsiFacade.getInstance(element.project).findClass(it, element.resolveScope)
}
val configClass = findConfigClass(element) ?: return null
return findProperty(configClass, element.value)
}

private fun collectVariants(context: PsiElement): Array<Any> {
val configClass = findConfigClass(context) ?: return ArrayUtil.EMPTY_OBJECT_ARRAY

val list = ArrayList<LookupElementBuilder>()
val list = mutableListOf<String>()
forEachProperty(configClass) { _, name ->
list.add(LookupElementBuilder.create(name))
list.add(name)
}
if (configClass.qualifiedName == MIXIN_CONFIG) {
list.addAll(customSubConfigs.keys)
}
return list.toArray()
return list.asSequence().map { LookupElementBuilder.create(it) }.toTypedArray()
}

private fun findProperty(configClass: PsiClass, name: String): PsiField? {
Expand All @@ -73,15 +83,8 @@ object ConfigProperty : PsiReferenceProvider() {
}

private inline fun forEachProperty(configClass: PsiClass, func: (PsiField, String) -> Unit) {
val mixinSerializedNameClass =
JavaPsiFacade.getInstance(configClass.project).findClass(MIXIN_SERIALIZED_NAME, configClass.resolveScope)
val serializedNameName = if (mixinSerializedNameClass != null) {
MIXIN_SERIALIZED_NAME
} else {
SERIALIZED_NAME
}
for (field in configClass.fields) {
val annotation = field.findAnnotation(serializedNameName)
val annotation = field.annotations.find { it.qualifiedName in serializedNameAnnotations }
val name = annotation?.findDeclaredAttributeValue(null)?.constantStringValue ?: continue
func(field, name)
}
Expand All @@ -107,6 +110,14 @@ object ConfigProperty : PsiReferenceProvider() {

// Walk to correct class
var currentClass = mixinConfig

customSubConfigs[path.first()]?.let { newRoot ->
path.removeFirst()
currentClass =
JavaPsiFacade.getInstance(context.project).findClass(newRoot, context.resolveScope)
?: return null
}

for (i in path.lastIndex downTo 0) {
currentClass = (findProperty(currentClass, path[i])?.type as? PsiClassType)?.resolve() ?: return null
}
Expand All @@ -127,4 +138,14 @@ object ConfigProperty : PsiReferenceProvider() {
override fun getVariants() = collectVariants(element)
override fun isReferenceTo(element: PsiElement) = element is PsiField && super.isReferenceTo(element)
}

private val customSubConfigs = mapOf(
MIXIN_EXTRAS_CONFIG_KEY to MIXIN_EXTRAS_CONFIG
)

private val serializedNameAnnotations = setOf(
SERIALIZED_NAME,
MIXIN_SERIALIZED_NAME,
MIXIN_EXTRAS_SERIALIZED_NAME
)
}
3 changes: 3 additions & 0 deletions src/main/kotlin/platform/mixin/util/MixinConstants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,9 @@ object MixinConstants {
const val LOCAL_REF_PACKAGE = "com.llamalad7.mixinextras.sugar.ref."
const val EXPRESSION = "com.llamalad7.mixinextras.expression.Expression"
const val DEFINITION = "com.llamalad7.mixinextras.expression.Definition"
const val MIXIN_EXTRAS_CONFIG = "com.llamalad7.mixinextras.config.MixinExtrasConfig"
const val MIXIN_EXTRAS_CONFIG_KEY = "mixinextras"
const val MIXIN_EXTRAS_SERIALIZED_NAME = "com.llamalad7.mixinextras.lib.gson.annotations.SerializedName"

fun PsiType.unwrapLocalRef(): PsiType {
if (this !is PsiClassType) {
Expand Down

0 comments on commit 1cd6ab6

Please sign in to comment.