Explorar o código

Introduce RestrictedScope for further resolution for IDE plugin

Him188 %!s(int64=5) %!d(string=hai) anos
pai
achega
ceb689066e

+ 8 - 11
backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/compiler/common/ResolveContext.kt

@@ -36,19 +36,16 @@ public annotation class ResolveContext(
         // ConstantKind
         // ConstantKind
         ///////////////////////////////////////////////////////////////////////////
         ///////////////////////////////////////////////////////////////////////////
 
 
-        PLUGIN_ID,
-        PLUGIN_NAME,
-        PLUGIN_VERSION,
+        PLUGIN_ID, // ILLEGAL_PLUGIN_DESCRIPTION
+        PLUGIN_NAME, // ILLEGAL_PLUGIN_DESCRIPTION
+        PLUGIN_VERSION, // ILLEGAL_PLUGIN_DESCRIPTION
 
 
-        COMMAND_NAME,
+        COMMAND_NAME, // ILLEGAL_COMMAND_NAME
 
 
-        PERMISSION_NAMESPACE,
-        PERMISSION_NAME,
-        PERMISSION_ID, // for parseFromString
+        PERMISSION_NAMESPACE, // ILLEGAL_COMMAND_NAMESPACE
+        PERMISSION_NAME, // ILLEGAL_COMMAND_NAME
+        PERMISSION_ID, // ILLEGAL_COMMAND_ID
 
 
-        /**
-         * Custom serializers allowed
-         */
-        RESTRICTED_NO_ARG_CONSTRUCTOR,
+        RESTRICTED_NO_ARG_CONSTRUCTOR, // NOT_CONSTRUCTABLE_TYPE
     }
     }
 }
 }

+ 28 - 0
backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/compiler/common/RestrictedScope.kt

@@ -0,0 +1,28 @@
+/*
+ * Copyright 2020 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/master/LICENSE
+ */
+
+package net.mamoe.mirai.console.compiler.common
+
+import net.mamoe.mirai.console.util.ConsoleExperimentalApi
+import kotlin.annotation.AnnotationTarget.FUNCTION
+
+/**
+ * 标记一个函数, 在其函数体内限制特定一些函数的使用.
+ */
+@ConsoleExperimentalApi
+@Target(FUNCTION)
+@Retention(AnnotationRetention.BINARY)
+public annotation class RestrictedScope(
+    vararg val kinds: Kind,
+) {
+    public enum class Kind {
+        PERMISSION_REGISTER, // ILLEGAL_PERMISSION_REGISTER_USE
+        COMMAND_REGISTER, // ILLEGAL_COMMAND_REGISTER_USE
+    }
+}

+ 2 - 2
backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/data/PluginData.kt

@@ -217,8 +217,8 @@ public inline fun <reified T> PluginData.value(
  */
  */
 @ResolveContext(RESTRICTED_NO_ARG_CONSTRUCTOR)
 @ResolveContext(RESTRICTED_NO_ARG_CONSTRUCTOR)
 @LowPriorityInOverloadResolution
 @LowPriorityInOverloadResolution
-public inline fun <reified T> PluginData.value(apply: T.() -> Unit = {}): SerializerAwareValue<T> =
-    valueImpl<T>(typeOf0<T>(), T::class).also { it.value.apply() }
+public inline fun <@ResolveContext(RESTRICTED_NO_ARG_CONSTRUCTOR) reified T>
+    PluginData.value(apply: T.() -> Unit = {}): SerializerAwareValue<T> = valueImpl<T>(typeOf0<T>(), T::class).also { it.value.apply() }
 
 
 @Suppress("UNCHECKED_CAST")
 @Suppress("UNCHECKED_CAST")
 @PublishedApi
 @PublishedApi

+ 4 - 0
backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPlugin.kt

@@ -18,6 +18,9 @@
 package net.mamoe.mirai.console.plugin.jvm
 package net.mamoe.mirai.console.plugin.jvm
 
 
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineScope
+import net.mamoe.mirai.console.compiler.common.RestrictedScope
+import net.mamoe.mirai.console.compiler.common.RestrictedScope.Kind.COMMAND_REGISTER
+import net.mamoe.mirai.console.compiler.common.RestrictedScope.Kind.PERMISSION_REGISTER
 import net.mamoe.mirai.console.extension.PluginComponentStorage
 import net.mamoe.mirai.console.extension.PluginComponentStorage
 import net.mamoe.mirai.console.permission.PermissionIdNamespace
 import net.mamoe.mirai.console.permission.PermissionIdNamespace
 import net.mamoe.mirai.console.plugin.Plugin
 import net.mamoe.mirai.console.plugin.Plugin
@@ -59,6 +62,7 @@ public interface JvmPlugin : Plugin, CoroutineScope,
      *
      *
      * @receiver 组件容器
      * @receiver 组件容器
      */
      */
+    @RestrictedScope(COMMAND_REGISTER, PERMISSION_REGISTER)
     public fun PluginComponentStorage.onLoad() {}
     public fun PluginComponentStorage.onLoad() {}
 
 
     /**
     /**

+ 3 - 0
tools/compiler-common/src/main/java/net/mamoe/mirai/console/compiler/common/diagnostics/MiraiConsoleErrors.java

@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor;
 import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1;
 import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1;
 import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2;
 import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2;
 import org.jetbrains.kotlin.diagnostics.Errors;
 import org.jetbrains.kotlin.diagnostics.Errors;
+import org.jetbrains.kotlin.psi.KtNamedDeclaration;
 
 
 import static org.jetbrains.kotlin.diagnostics.Severity.ERROR;
 import static org.jetbrains.kotlin.diagnostics.Severity.ERROR;
 
 
@@ -25,6 +26,8 @@ public interface MiraiConsoleErrors {
     DiagnosticFactory2<PsiElement, String, String> ILLEGAL_PERMISSION_NAME = DiagnosticFactory2.create(ERROR);
     DiagnosticFactory2<PsiElement, String, String> ILLEGAL_PERMISSION_NAME = DiagnosticFactory2.create(ERROR);
     DiagnosticFactory2<PsiElement, String, String> ILLEGAL_PERMISSION_ID = DiagnosticFactory2.create(ERROR);
     DiagnosticFactory2<PsiElement, String, String> ILLEGAL_PERMISSION_ID = DiagnosticFactory2.create(ERROR);
     DiagnosticFactory2<PsiElement, String, String> ILLEGAL_PERMISSION_NAMESPACE = DiagnosticFactory2.create(ERROR);
     DiagnosticFactory2<PsiElement, String, String> ILLEGAL_PERMISSION_NAMESPACE = DiagnosticFactory2.create(ERROR);
+    DiagnosticFactory2<PsiElement, KtNamedDeclaration, String> ILLEGAL_COMMAND_REGISTER_USE = DiagnosticFactory2.create(ERROR);
+    DiagnosticFactory2<PsiElement, KtNamedDeclaration, String> ILLEGAL_PERMISSION_REGISTER_USE = DiagnosticFactory2.create(ERROR);
 
 
     @Deprecated
     @Deprecated
     Object _init = new Object() {
     Object _init = new Object() {

+ 14 - 0
tools/compiler-common/src/main/kotlin/net/mamoe/mirai/console/compiler/common/diagnostics/MiraiConsoleErrorsRendering.kt

@@ -61,6 +61,20 @@ object MiraiConsoleErrorsRendering : DefaultErrorMessages.Extension {
             Renderers.STRING,
             Renderers.STRING,
             Renderers.STRING,
             Renderers.STRING,
         )
         )
+
+        put(
+            ILLEGAL_COMMAND_REGISTER_USE,
+            "''{0}'' 无法使用在 ''{1}'' 环境下.",
+            Renderers.DECLARATION_NAME,
+            Renderers.STRING
+        )
+
+        put(
+            ILLEGAL_PERMISSION_REGISTER_USE,
+            "''{0}'' 无法使用在 ''{1}'' 环境下.",
+            Renderers.DECLARATION_NAME,
+            Renderers.STRING
+        )
     }
     }
 
 
     override fun getMap() = MAP
     override fun getMap() = MAP