summaryrefslogtreecommitdiff
path: root/platform/script-debugger/protocol/protocol-reader/src/ObjectValueReader.kt
blob: ef6e02f29966079198d6676be58ca588cc9e2179 (plain)
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
41
42
43
package org.jetbrains.protocolReader

internal class ObjectValueReader(val type: TypeRef<*>, private val isSubtyping: Boolean, primitiveValueName: String?) : ValueReader() {
  val primitiveValueName = if (primitiveValueName == null || primitiveValueName.isEmpty()) null else primitiveValueName

  override fun asJsonTypeParser() = this

  fun isSubtyping() = isSubtyping

  override fun appendFinishedValueTypeName(out: TextOutput) {
    out.append(type.typeClass.canonicalName)
  }

  override fun appendInternalValueTypeName(scope: FileScope, out: TextOutput) {
    out.append(scope.getTypeImplReference(type.type!!))
  }

  override fun writeReadCode(scope: ClassScope, subtyping: Boolean, out: TextOutput) {
    type.type!!.writeInstantiateCode(scope.getRootClassScope(), subtyping, out)
    out.append('(')
    addReaderParameter(subtyping, out)
    out.comma().append("null")
    if (subtyping && type.type!!.subtypeAspect != null) {
      out.comma().append("this")
    }
    out.append(')')
  }

  override fun writeArrayReadCode(scope: ClassScope, subtyping: Boolean, out: TextOutput) {
    beginReadCall("ObjectArray", subtyping, out)
    writeFactoryArgument(scope, out)
    out.append(')')
  }

  fun writeFactoryArgument(scope: ClassScope, out: TextOutput) {
    out.comma()
    writeFactoryNewExpression(scope, out)
  }

  fun writeFactoryNewExpression(scope: ClassScope, out: TextOutput) {
    out.append(TYPE_FACTORY_NAME_PREFIX).append(scope.requireFactoryGenerationAndGetName(type.type!!)).append("()")
  }
}