• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3  */
4 
5 @file:OptIn(ExperimentalSerializationApi::class)
6 package kotlinx.serialization.json.internal
7 
8 import kotlinx.serialization.*
9 import kotlinx.serialization.json.*
10 import kotlin.jvm.*
11 
Composernull12 internal fun Composer(sb: InternalJsonWriter, json: Json): Composer =
13     if (json.configuration.prettyPrint) ComposerWithPrettyPrint(sb, json) else Composer(sb)
14 
15 @OptIn(ExperimentalSerializationApi::class)
16 internal open class Composer(@JvmField internal val writer: InternalJsonWriter) {
17     var writingFirst = true
18         protected set
19 
20     open fun indent() {
21         writingFirst = true
22     }
23 
24     open fun unIndent() = Unit
25 
26     open fun nextItem() {
27         writingFirst = false
28     }
29 
30     open fun nextItemIfNotFirst() {
31         writingFirst = false
32     }
33 
34     open fun space() = Unit
35 
36     fun print(v: Char) = writer.writeChar(v)
37     fun print(v: String) = writer.write(v)
38     open fun print(v: Float) = writer.write(v.toString())
39     open fun print(v: Double) = writer.write(v.toString())
40     open fun print(v: Byte) = writer.writeLong(v.toLong())
41     open fun print(v: Short) = writer.writeLong(v.toLong())
42     open fun print(v: Int) = writer.writeLong(v.toLong())
43     open fun print(v: Long) = writer.writeLong(v)
44     open fun print(v: Boolean) = writer.write(v.toString())
45     open fun printQuoted(value: String) = writer.writeQuoted(value)
46 }
47 
48 @SuppressAnimalSniffer // Long(Integer).toUnsignedString(long)
49 internal class ComposerForUnsignedNumbers(writer: InternalJsonWriter, private val forceQuoting: Boolean) : Composer(writer) {
printnull50     override fun print(v: Int) {
51         if (forceQuoting) printQuoted(v.toUInt().toString()) else print(v.toUInt().toString())
52     }
53 
printnull54     override fun print(v: Long) {
55         if (forceQuoting) printQuoted(v.toULong().toString()) else print(v.toULong().toString())
56     }
57 
printnull58     override fun print(v: Byte) {
59         if (forceQuoting) printQuoted(v.toUByte().toString()) else print(v.toUByte().toString())
60     }
61 
printnull62     override fun print(v: Short) {
63         if (forceQuoting) printQuoted(v.toUShort().toString()) else print(v.toUShort().toString())
64     }
65 }
66 
67 @SuppressAnimalSniffer
68 internal class ComposerForUnquotedLiterals(writer: InternalJsonWriter, private val forceQuoting: Boolean) : Composer(writer) {
printQuotednull69     override fun printQuoted(value: String) {
70         if (forceQuoting) super.printQuoted(value) else super.print(value)
71     }
72 }
73 
74 internal class ComposerWithPrettyPrint(
75     writer: InternalJsonWriter,
76     private val json: Json
77 ) : Composer(writer) {
78     private var level = 0
79 
indentnull80     override fun indent() {
81         writingFirst = true
82         level++
83     }
84 
unIndentnull85     override fun unIndent() {
86         level--
87     }
88 
nextItemnull89     override fun nextItem() {
90         writingFirst = false
91         print("\n")
92         repeat(level) { print(json.configuration.prettyPrintIndent) }
93     }
94 
nextItemIfNotFirstnull95     override fun nextItemIfNotFirst() {
96         if (writingFirst) writingFirst = false
97         else nextItem()
98     }
99 
spacenull100     override fun space() {
101         print(' ')
102     }
103 }
104