From c3de96dde08bcc72cda29da54d3b5551048e55bf Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Mon, 27 Apr 2020 22:07:27 +0800
Subject: [PATCH] Mark LockFreeLinkedList with MiraiInternalAPI, planning to
 make it internal in 1.0.0

---
 .../kotlin/net.mamoe.mirai/contact/ContactList.kt      |  4 ++++
 .../event/internal/InternalEventListeners.kt           |  2 ++
 .../net.mamoe.mirai/message/data/CustomMessage.kt      |  3 +++
 .../kotlin/net.mamoe.mirai/utils/LockFreeLinkedList.kt | 10 ++++++++++
 .../mamoe/mirai/event/internal/MiraiAtomicBoolean.kt   |  3 +++
 5 files changed, 22 insertions(+)

diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt
index ef3770417..c82c75960 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt
@@ -81,16 +81,19 @@ val ContactList<*>.idContentString: String
     ) + "]"
 
 
+@MiraiInternalAPI
 operator fun <C : Contact> LockFreeLinkedList<C>.get(id: Long): C {
     forEach { if (it.id == id) return it }
     throw NoSuchElementException("No such contact: $id")
 }
 
+@MiraiInternalAPI
 fun <C : Contact> LockFreeLinkedList<C>.getOrNull(id: Long): C? {
     forEach { if (it.id == id) return it }
     return null
 }
 
+@OptIn(MiraiInternalAPI::class)
 @PlannedRemoval("1.0.0")
 @Deprecated(
     "use firstOrNull from stdlib",
@@ -102,6 +105,7 @@ inline fun <C : Contact> LockFreeLinkedList<C>.firstOrNull(filter: (C) -> Boolea
     return null
 }
 
+@OptIn(MiraiInternalAPI::class)
 @PlannedRemoval("1.0.0")
 @Deprecated(
     "use firstOrNull from stdlib",
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt
index d7eca4ad0..e4af20054 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt
@@ -6,6 +6,7 @@
  *
  * https://github.com/mamoe/mirai/blob/master/LICENSE
  */
+@file:OptIn(MiraiInternalAPI::class)
 
 package net.mamoe.mirai.event.internal
 
@@ -122,6 +123,7 @@ internal object EventListenerManager {
     // 不要用 atomicfu. 在 publish 后会出现 VerifyError
     private val lock: MiraiAtomicBoolean = MiraiAtomicBoolean(false)
 
+    @OptIn(MiraiInternalAPI::class)
     @Suppress("UNCHECKED_CAST", "BooleanLiteralArgument")
     internal tailrec fun <E : Event> get(clazz: KClass<out E>): EventListeners<E> {
         registries.forEach {
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt
index 89ef02e51..73318dddf 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt
@@ -7,6 +7,7 @@
  * https://github.com/mamoe/mirai/blob/master/LICENSE
  */
 
+@file:OptIn(MiraiInternalAPI::class)
 package net.mamoe.mirai.message.data
 
 import kotlinx.io.core.*
@@ -114,6 +115,7 @@ sealed class CustomMessage : SingleMessage {
         override val typeName: String get() = "CustomMessage"
         private val factories: LockFreeLinkedList<Factory<*>> = LockFreeLinkedList()
 
+        @OptIn(MiraiInternalAPI::class)
         internal fun register(factory: Factory<out CustomMessage>) {
             factories.removeIf { it::class == factory::class }
             val exist = factories.asSequence().firstOrNull { it.typeName == factory.typeName }
@@ -134,6 +136,7 @@ sealed class CustomMessage : SingleMessage {
         class CustomMessageFullDataDeserializeUserException(val body: ByteArray, cause: Throwable?) :
             RuntimeException(cause)
 
+        @OptIn(MiraiInternalAPI::class)
         internal fun deserialize(fullData: ByteReadPacket): CustomMessage? {
             val msg = kotlin.runCatching {
                 val length = fullData.readInt()
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LockFreeLinkedList.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LockFreeLinkedList.kt
index bfdb1cc0a..409b05fe5 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LockFreeLinkedList.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LockFreeLinkedList.kt
@@ -19,11 +19,13 @@ import kotlin.jvm.JvmOverloads
 /**
  * Collect all the elements into a [MutableList] then cast it as a [List]
  */
+@MiraiInternalAPI
 fun <E> LockFreeLinkedList<E>.toList(): List<E> = toMutableList()
 
 /**
  * Collect all the elements into a [MutableList].
  */
+@MiraiInternalAPI
 fun <E> LockFreeLinkedList<E>.toMutableList(): MutableList<E> {
     val list = mutableListOf<E>()
     this.forEach { list.add(it) }
@@ -33,11 +35,13 @@ fun <E> LockFreeLinkedList<E>.toMutableList(): MutableList<E> {
 /**
  * Collect all the elements into a [MutableSet] then cast it as a [Set]
  */
+@MiraiInternalAPI
 fun <E> LockFreeLinkedList<E>.toSet(): Set<E> = toMutableSet()
 
 /**
  * Collect all the elements into a [MutableSet].
  */
+@MiraiInternalAPI
 fun <E> LockFreeLinkedList<E>.toMutableSet(): MutableSet<E> {
     val list = mutableSetOf<E>()
     this.forEach { list.add(it) }
@@ -49,6 +53,7 @@ fun <E> LockFreeLinkedList<E>.toMutableSet(): MutableSet<E> {
  *
  * Note that the sequence is dynamic, that is, elements are yielded atomically only when it is required
  */
+@MiraiInternalAPI
 fun <E> LockFreeLinkedList<E>.asSequence(): Sequence<E> {
     return sequence {
         forEach {
@@ -57,6 +62,7 @@ fun <E> LockFreeLinkedList<E>.asSequence(): Sequence<E> {
     }
 }
 
+@MiraiInternalAPI
 operator fun <E> LockFreeLinkedList<E>.iterator(): Iterator<E> {
     return asSequence().iterator()
 }
@@ -64,6 +70,7 @@ operator fun <E> LockFreeLinkedList<E>.iterator(): Iterator<E> {
 /**
  * 构建链表结构然后转为 [LockFreeLinkedList]
  */
+@MiraiInternalAPI
 fun <E> Iterable<E>.toLockFreeLinkedList(): LockFreeLinkedList<E> {
     return LockFreeLinkedList<E>().apply { addAll(this@toLockFreeLinkedList) }
 }
@@ -71,6 +78,7 @@ fun <E> Iterable<E>.toLockFreeLinkedList(): LockFreeLinkedList<E> {
 /**
  * 构建链表结构然后转为 [LockFreeLinkedList]
  */
+@MiraiInternalAPI
 fun <E> Sequence<E>.toLockFreeLinkedList(): LockFreeLinkedList<E> {
     return LockFreeLinkedList<E>().apply { addAll(this@toLockFreeLinkedList) }
 }
@@ -81,6 +89,8 @@ fun <E> Sequence<E>.toLockFreeLinkedList(): LockFreeLinkedList<E> {
  * Modifying can be performed concurrently.
  * Iterating concurrency is guaranteed.
  */
+@PlannedRemoval("1.0.0") // make internal
+@MiraiInternalAPI("This is unstable API and is going to be internal in 1.0.0")
 open class LockFreeLinkedList<E> {
     @PublishedApi
     internal val tail: Tail<E> = Tail()
diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/MiraiAtomicBoolean.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/MiraiAtomicBoolean.kt
index 36a9236f5..7101b3adc 100644
--- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/MiraiAtomicBoolean.kt
+++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/MiraiAtomicBoolean.kt
@@ -1,8 +1,11 @@
+@file:OptIn(MiraiInternalAPI::class)
+
 package net.mamoe.mirai.event.internal
 
 import net.mamoe.mirai.event.Event
 import net.mamoe.mirai.event.Listener
 import net.mamoe.mirai.utils.LockFreeLinkedList
+import net.mamoe.mirai.utils.MiraiInternalAPI
 import java.util.concurrent.atomic.AtomicBoolean
 import kotlin.reflect.KClass