@@ -23,10 +23,13 @@ package com.demonwav.mcdev.platform.mixin.config.reference
2323import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Classes.MIXIN_CONFIG
2424import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Classes.MIXIN_SERIALIZED_NAME
2525import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Classes.SERIALIZED_NAME
26+ import com.demonwav.mcdev.platform.mixin.util.MixinConstants.MixinExtras.MIXIN_EXTRAS_CONFIG
27+ import com.demonwav.mcdev.platform.mixin.util.MixinConstants.MixinExtras.MIXIN_EXTRAS_CONFIG_KEY
28+ import com.demonwav.mcdev.platform.mixin.util.MixinConstants.MixinExtras.MIXIN_EXTRAS_SERIALIZED_NAME
2629import com.demonwav.mcdev.util.constantStringValue
27- import com.demonwav.mcdev.util.findAnnotation
2830import com.demonwav.mcdev.util.ifEmpty
2931import com.demonwav.mcdev.util.reference.InspectionReference
32+ import com.demonwav.mcdev.util.toTypedArray
3033import com.intellij.codeInsight.lookup.LookupElementBuilder
3134import com.intellij.json.psi.JsonProperty
3235import com.intellij.json.psi.JsonStringLiteral
@@ -48,18 +51,25 @@ object ConfigProperty : PsiReferenceProvider() {
4851 arrayOf(Reference (element as JsonStringLiteral ))
4952
5053 fun resolveReference (element : JsonStringLiteral ): PsiElement ? {
54+ val name = element.value
55+ customSubConfigs[name]?.let {
56+ return JavaPsiFacade .getInstance(element.project).findClass(it, element.resolveScope)
57+ }
5158 val configClass = findConfigClass(element) ? : return null
5259 return findProperty(configClass, element.value)
5360 }
5461
5562 private fun collectVariants (context : PsiElement ): Array <Any > {
5663 val configClass = findConfigClass(context) ? : return ArrayUtil .EMPTY_OBJECT_ARRAY
5764
58- val list = ArrayList < LookupElementBuilder >()
65+ val list = mutableListOf< String >()
5966 forEachProperty(configClass) { _, name ->
60- list.add(LookupElementBuilder .create(name))
67+ list.add(name)
68+ }
69+ if (configClass.qualifiedName == MIXIN_CONFIG ) {
70+ list.addAll(customSubConfigs.keys)
6171 }
62- return list.toArray ()
72+ return list.asSequence().map { LookupElementBuilder .create(it) }.toTypedArray ()
6373 }
6474
6575 private fun findProperty (configClass : PsiClass , name : String ): PsiField ? {
@@ -73,15 +83,8 @@ object ConfigProperty : PsiReferenceProvider() {
7383 }
7484
7585 private inline fun forEachProperty (configClass : PsiClass , func : (PsiField , String ) -> Unit ) {
76- val mixinSerializedNameClass =
77- JavaPsiFacade .getInstance(configClass.project).findClass(MIXIN_SERIALIZED_NAME , configClass.resolveScope)
78- val serializedNameName = if (mixinSerializedNameClass != null ) {
79- MIXIN_SERIALIZED_NAME
80- } else {
81- SERIALIZED_NAME
82- }
8386 for (field in configClass.fields) {
84- val annotation = field.findAnnotation(serializedNameName)
87+ val annotation = field.annotations.find { it.qualifiedName in serializedNameAnnotations }
8588 val name = annotation?.findDeclaredAttributeValue(null )?.constantStringValue ? : continue
8689 func(field, name)
8790 }
@@ -107,6 +110,14 @@ object ConfigProperty : PsiReferenceProvider() {
107110
108111 // Walk to correct class
109112 var currentClass = mixinConfig
113+
114+ customSubConfigs[path.first()]?.let { newRoot ->
115+ path.removeFirst()
116+ currentClass =
117+ JavaPsiFacade .getInstance(context.project).findClass(newRoot, context.resolveScope)
118+ ? : return null
119+ }
120+
110121 for (i in path.lastIndex downTo 0 ) {
111122 currentClass = (findProperty(currentClass, path[i])?.type as ? PsiClassType )?.resolve() ? : return null
112123 }
@@ -127,4 +138,14 @@ object ConfigProperty : PsiReferenceProvider() {
127138 override fun getVariants () = collectVariants(element)
128139 override fun isReferenceTo (element : PsiElement ) = element is PsiField && super .isReferenceTo(element)
129140 }
141+
142+ private val customSubConfigs = mapOf (
143+ MIXIN_EXTRAS_CONFIG_KEY to MIXIN_EXTRAS_CONFIG
144+ )
145+
146+ private val serializedNameAnnotations = setOf (
147+ SERIALIZED_NAME ,
148+ MIXIN_SERIALIZED_NAME ,
149+ MIXIN_EXTRAS_SERIALIZED_NAME
150+ )
130151}
0 commit comments