-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSerializationResolveExtension.kt
40 lines (35 loc) · 1.53 KB
/
SerializationResolveExtension.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
class SerializationResolveExtension : SyntheticResolveExtension {
/**
* Ensure companion is added to the class
*/
override fun getSyntheticCompanionObjectNameIfNeeded(thisDescriptor: ClassDescriptor): Name? =
Names.DEFAULT_COMPANION
override fun getSyntheticFunctionNames(thisDescriptor: ClassDescriptor): List<Name> =
if (thisDescriptor.isCompanionObject && thisDescriptor.isSerializableCompanion) {
listOf(Names.SERIALIZER_METHOD)
} else {
emptyList()
}
override fun generateSyntheticMethods(
thisDescriptor: ClassDescriptor,
name: Name,
bindingContext: BindingContext,
fromSupertypes: List<SimpleFunctionDescriptor>,
result: MutableCollection<SimpleFunctionDescriptor>
) {
if (name != Names.SERIALIZER_METHOD) return
val classDescriptor = getSerializableForCompanion(thisDescriptor) ?: return
result.add(createSerializerGetterDescriptor(thisDescriptor, classDescriptor))
}
private fun getSerializableForCompanion(descriptor: ClassDescriptor): ClassDescriptor? =
if (descriptor.isSerializableCompanion) {
descriptor.containingDeclaration as ClassDescriptor
} else {
null
}
}