1
0
mirror of https://github.com/mamoe/mirai.git synced 2025-04-25 04:50:26 +08:00

[core] Move StructureToStringTransformer to mirai-core-utils, and use legacy implementation as fallback. close .

This commit is contained in:
Him188 2022-08-26 18:19:18 +08:00
parent fea1d28488
commit 965ab57aaa
No known key found for this signature in database
GPG Key ID: BA439CDDCF652375
27 changed files with 150 additions and 91 deletions

View File

@ -0,0 +1,60 @@
/*
* Copyright 2019-2022 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/dev/LICENSE
*/
@file:JvmName("StructureToStringTransformerKt_common")
package net.mamoe.mirai.utils.debug
import net.mamoe.mirai.utils.loadService
import kotlin.jvm.JvmName
public interface StructureToStringTransformer {
public fun transform(any: Any?): String
public fun transformAndDesensitize(any: Any?): String
public companion object {
private class ObjectToStringStructureToStringTransformer : StructureToStringTransformer {
override fun transform(any: Any?): String = any.toString()
override fun transformAndDesensitize(any: Any?): String = any.toString()
}
public val instance: StructureToStringTransformer by lazy {
loadService(StructureToStringTransformer::class) {
getPlatformDefaultStructureToStringTransformer()
?: ObjectToStringStructureToStringTransformer()
}
}
public val available: Boolean = instance !is ObjectToStringStructureToStringTransformer
}
}
internal expect fun getPlatformDefaultStructureToStringTransformer(): StructureToStringTransformer?
/**
* Do not call this inside [Any.toString]. `StackOverflowError` may happen.
*/
public fun Any?.structureToString(): String = StructureToStringTransformer.instance.transform(this)
public fun Any?.structureToStringIfAvailable(): String? {
return if (StructureToStringTransformer.available) {
StructureToStringTransformer.instance.transform(this)
} else null
}
public fun Any?.structureToStringAndDesensitize(): String =
StructureToStringTransformer.instance.transformAndDesensitize(this)
public fun Any?.structureToStringAndDesensitizeIfAvailable(): String? {
return if (StructureToStringTransformer.available) {
StructureToStringTransformer.instance.transformAndDesensitize(this)
} else null
}

View File

@ -0,0 +1,14 @@
/*
* Copyright 2019-2022 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/dev/LICENSE
*/
package net.mamoe.mirai.utils.debug
internal actual fun getPlatformDefaultStructureToStringTransformer(): StructureToStringTransformer? {
return StructureToStringTransformerLegacy()
}

View File

@ -7,10 +7,9 @@
* https://github.com/mamoe/mirai/blob/dev/LICENSE
*/
package net.mamoe.mirai.internal.utils
package net.mamoe.mirai.utils.debug
import kotlinx.serialization.Transient
import net.mamoe.mirai.internal.testFramework.desensitizer.Desensitizer
import net.mamoe.mirai.utils.toUHexString
import java.lang.reflect.Modifier
import kotlin.reflect.KClass
@ -19,9 +18,10 @@ import kotlin.reflect.KProperty1
import kotlin.reflect.full.hasAnnotation
import kotlin.reflect.jvm.javaField
internal class StructureToStringTransformerLegacy : StructureToStringTransformer {
public class StructureToStringTransformerLegacy : StructureToStringTransformer {
override fun transform(any: Any?): String = any._miraiContentToString()
override fun transformAndDesensitize(any: Any?): String = Desensitizer.desensitize(any._miraiContentToString())
override fun transformAndDesensitize(any: Any?): String = transform(any) // desensitization not supported
private val indent: String = " ".repeat(4)

View File

@ -0,0 +1,14 @@
/*
* Copyright 2019-2022 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/dev/LICENSE
*/
package net.mamoe.mirai.utils.debug
internal actual fun getPlatformDefaultStructureToStringTransformer(): StructureToStringTransformer? {
return null
}

View File

@ -37,10 +37,10 @@ import net.mamoe.mirai.internal.network.protocol.packet.chat.image.ImgStore
import net.mamoe.mirai.internal.network.protocol.packet.chat.image.LongConn
import net.mamoe.mirai.internal.utils.AtomicIntSeq
import net.mamoe.mirai.internal.utils.C2CPkgMsgParsingCache
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.debug.structureToString
import kotlin.contracts.contract
import kotlin.coroutines.CoroutineContext

View File

@ -17,9 +17,9 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
import net.mamoe.mirai.internal.network.protocol.data.proto.ImgExtPbResvAttrCommon
import net.mamoe.mirai.internal.network.protocol.data.proto.NotOnlineImageExtPb
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.message.data.ImageType
import net.mamoe.mirai.utils.debug.structureToString
import net.mamoe.mirai.utils.generateImageId
import net.mamoe.mirai.utils.generateImageIdFromResourceId

View File

@ -39,13 +39,13 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
import net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm
import net.mamoe.mirai.internal.pipeline.ProcessResult
import net.mamoe.mirai.internal.utils.runCoroutineInPlace
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.MessageSerializers
import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.message.data.visitor.RecursiveMessageVisitor
import net.mamoe.mirai.message.data.visitor.accept
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.debug.structureToString
import kotlin.reflect.KClass
internal interface MessageProtocolFacade {

View File

@ -14,10 +14,10 @@ import net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext.Co
import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
import net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm
import net.mamoe.mirai.internal.pipeline.*
import net.mamoe.mirai.internal.utils.structureToStringAndDesensitizeIfAvailable
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.MessageSourceKind
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.debug.structureToStringAndDesensitizeIfAvailable
import kotlin.coroutines.RestrictsSuspension
internal interface MessageDecoderPipeline :

View File

@ -31,13 +31,13 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
import net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm
import net.mamoe.mirai.internal.network.protocol.data.proto.SourceMsg
import net.mamoe.mirai.internal.utils.io.serialization.toByteArray
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.MessageSource
import net.mamoe.mirai.message.data.MessageSourceKind
import net.mamoe.mirai.message.data.OnlineMessageSource
import net.mamoe.mirai.message.data.visitor.MessageVisitor
import net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY
import net.mamoe.mirai.utils.debug.structureToString
import net.mamoe.mirai.utils.encodeBase64
import net.mamoe.mirai.utils.mapToIntArray

View File

@ -20,8 +20,8 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.MsgOnlinePush
import net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans
import net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg
import net.mamoe.mirai.internal.network.protocol.packet.chat.NewContact
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.debug.structureToString
internal class UnconsumedNoticesAlerter(
logger: MiraiLogger,

View File

@ -29,8 +29,8 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x27
import net.mamoe.mirai.internal.network.protocol.data.proto.TroopTips0x857
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
import net.mamoe.mirai.internal.utils.parseToMessageDataList
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.debug.structureToString
import kotlin.jvm.JvmName
internal class GroupNotificationProcessor(

View File

@ -33,10 +33,10 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg
import net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x44
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
import net.mamoe.mirai.internal.utils.parseToMessageDataList
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.internal.utils.toMemberInfo
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.context
import net.mamoe.mirai.utils.debug.structureToString
import net.mamoe.mirai.utils.read

View File

@ -35,8 +35,8 @@ import net.mamoe.mirai.internal.network.protocol.packet.chat.NewContact
import net.mamoe.mirai.internal.network.protocol.packet.list.FriendList.GetFriendGroupList
import net.mamoe.mirai.internal.utils.io.ProtoBuf
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.debug.structureToString
/**
* All [FriendEvent] except [FriendMessageEvent]

View File

@ -32,10 +32,10 @@ import net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushStatus
import net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm
import net.mamoe.mirai.internal.network.protocol.data.proto.SubMsgType0x7
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.message.data.PlainText
import net.mamoe.mirai.message.data.buildMessageChain
import net.mamoe.mirai.utils.context
import net.mamoe.mirai.utils.debug.structureToString
/**
* @see OtherClientOnlineEvent

View File

@ -18,8 +18,8 @@ import net.mamoe.mirai.internal.utils.io.NestedStructure
import net.mamoe.mirai.internal.utils.io.NestedStructureDesensitizer
import net.mamoe.mirai.internal.utils.io.ProtoBuf
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
import net.mamoe.mirai.internal.utils.structureToStringIfAvailable
import net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY
import net.mamoe.mirai.utils.debug.structureToStringIfAvailable
import net.mamoe.mirai.utils.inflate
import net.mamoe.mirai.utils.isSameType
import kotlin.jvm.JvmField

View File

@ -22,7 +22,7 @@ import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory
import net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket
import net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf
import net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.utils.debug.structureToString
import net.mamoe.mirai.utils.md5
internal class MessageValidationData(

View File

@ -42,8 +42,8 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.StatSvcSimpleGet
import net.mamoe.mirai.internal.network.protocol.packet.*
import net.mamoe.mirai.internal.utils.NetworkType
import net.mamoe.mirai.internal.utils.io.serialization.*
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.debug.structureToString
@Suppress("EnumEntryName", "unused")
internal enum class RegPushReason {

View File

@ -24,8 +24,8 @@ import net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.analysisTl
import net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.orEmpty
import net.mamoe.mirai.internal.utils.crypto.TEA
import net.mamoe.mirai.internal.utils.printStructure
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.debug.structureToString
internal class WtLogin {
/**

View File

@ -13,8 +13,8 @@ import io.ktor.utils.io.core.*
import net.mamoe.mirai.internal.message.contextualBugReportException
import net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext
import net.mamoe.mirai.internal.network.components.NoticeProcessor
import net.mamoe.mirai.internal.utils.structureToStringAndDesensitizeIfAvailable
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.debug.structureToStringAndDesensitizeIfAvailable
import kotlin.jvm.JvmInline
internal interface Processor<C : ProcessorPipelineContext<D, *>, D> : PipelineConsumptionMarker {

View File

@ -1,68 +0,0 @@
/*
* Copyright 2019-2022 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/dev/LICENSE
*/
@file:Suppress("EXPERIMENTAL_API_USAGE", "unused", "NO_REFLECTION_IN_CLASS_PATH")
package net.mamoe.mirai.internal.utils
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.debug
import net.mamoe.mirai.utils.loadService
/**
* Do not call this inside [Any.toString]. [StackOverflowError] may happen. Call [structureToStringIfAvailable] instead.
*/
internal fun Any?.structureToString(): String = StructureToStringTransformer.instance.transform(this)
internal fun Any?.structureToStringIfAvailable(): String? {
return if (StructureToStringTransformer.available) {
StructureToStringTransformer.instance.transform(this)
} else null
}
internal fun Any?.structureToStringAndDesensitize(): String =
StructureToStringTransformer.instance.transformAndDesensitize(this)
internal fun Any?.structureToStringAndDesensitizeIfAvailable(): String? {
return if (StructureToStringTransformer.available) {
StructureToStringTransformer.instance.transformAndDesensitize(this)
} else null
}
private val SoutvLogger: MiraiLogger by lazy {
MiraiLogger.Factory.create(
StructureToStringTransformer::class,
"printStructurally"
)
}
internal fun Any?.printStructure(name: String = "unnamed") {
return SoutvLogger.debug { "$name = ${this.structureToString()}" }
}
internal interface StructureToStringTransformer {
fun transform(any: Any?): String
fun transformAndDesensitize(any: Any?): String
companion object {
private class ObjectToStringStructureToStringTransformer : StructureToStringTransformer {
override fun transform(any: Any?): String = any.toString()
override fun transformAndDesensitize(any: Any?): String = any.toString()
}
val instance by lazy {
loadService(StructureToStringTransformer::class) { ObjectToStringStructureToStringTransformer() }
}
val available = instance !is ObjectToStringStructureToStringTransformer
}
}

View File

@ -0,0 +1,29 @@
/*
* Copyright 2019-2022 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/dev/LICENSE
*/
@file:Suppress("EXPERIMENTAL_API_USAGE", "unused")
package net.mamoe.mirai.internal.utils
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.debug
import net.mamoe.mirai.utils.debug.StructureToStringTransformer
import net.mamoe.mirai.utils.debug.structureToString
private val SoutvLogger: MiraiLogger by lazy {
MiraiLogger.Factory.create(
StructureToStringTransformer::class,
"printStructurally"
)
}
internal fun Any?.printStructure(name: String = "unnamed") {
return SoutvLogger.debug { "$name = ${this.structureToString()}" }
}

View File

@ -15,8 +15,8 @@ import net.mamoe.mirai.internal.MockBot
import net.mamoe.mirai.internal.message.DeepMessageRefiner.refineDeep
import net.mamoe.mirai.internal.message.SimpleRefineContext
import net.mamoe.mirai.internal.test.runBlockingUnit
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.debug.structureToString
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue

View File

@ -17,10 +17,10 @@ import kotlinx.serialization.serializer
import net.mamoe.mirai.Mirai
import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
import net.mamoe.mirai.internal.test.AbstractTest
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.message.MessageSerializers
import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.cast
import net.mamoe.mirai.utils.debug.structureToString
import net.mamoe.mirai.utils.mapToByteArray
import kotlin.test.*

View File

@ -12,11 +12,11 @@ package net.mamoe.mirai.internal.message.protocol.impl
import kotlinx.serialization.KSerializer
import kotlinx.serialization.json.Json
import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
import net.mamoe.mirai.internal.utils.structureToStringIfAvailable
import net.mamoe.mirai.message.MessageSerializers
import net.mamoe.mirai.message.data.MessageChain.Companion.serializeToJsonString
import net.mamoe.mirai.message.data.SingleMessage
import net.mamoe.mirai.message.data.messageChainOf
import net.mamoe.mirai.utils.debug.structureToStringIfAvailable
import kotlin.test.assertNotNull
import kotlin.test.asserter

View File

@ -17,6 +17,8 @@ import net.mamoe.mirai.internal.testFramework.codegen.visitors.OptimizeByteArray
import net.mamoe.mirai.internal.testFramework.codegen.visitors.renderToString
import net.mamoe.mirai.internal.testFramework.desensitizer.DesensitizationVisitor
import net.mamoe.mirai.internal.testFramework.desensitizer.Desensitizer
import net.mamoe.mirai.utils.debug.StructureToStringTransformer
import net.mamoe.mirai.utils.debug.StructureToStringTransformerLegacy
internal class StructureToStringTransformerNew : StructureToStringTransformer {
private val legacy = StructureToStringTransformerLegacy()

View File

@ -10,9 +10,12 @@
package net.mamoe.mirai.internal.utils.test
import net.mamoe.mirai.internal.test.AbstractTest
import net.mamoe.mirai.internal.utils.structureToString
import net.mamoe.mirai.internal.utils.StructureToStringTransformerNew
import net.mamoe.mirai.utils.debug.StructureToStringTransformer
import net.mamoe.mirai.utils.debug.structureToString
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertIs
internal class StructureToStringTransformerNewTest : AbstractTest() {
@ -22,6 +25,11 @@ internal class StructureToStringTransformerNewTest : AbstractTest() {
@Test
fun `can load service`() {
assertIs<StructureToStringTransformerNew>(StructureToStringTransformer.instance)
}
@Test
fun `can use`() {
assertEquals(
"""
${MyClass::class.qualifiedName}(