aboutsummaryrefslogtreecommitdiff
path: root/.live-plugins
diff options
context:
space:
mode:
Diffstat (limited to '.live-plugins')
-rw-r--r--.live-plugins/event/plugin.kts76
1 files changed, 76 insertions, 0 deletions
diff --git a/.live-plugins/event/plugin.kts b/.live-plugins/event/plugin.kts
new file mode 100644
index 000000000..d012154b8
--- /dev/null
+++ b/.live-plugins/event/plugin.kts
@@ -0,0 +1,76 @@
+import com.intellij.codeInspection.LocalQuickFix
+import com.intellij.codeInspection.ProblemDescriptor
+import com.intellij.codeInspection.ProblemHighlightType
+import com.intellij.codeInspection.ProblemsHolder
+import com.intellij.openapi.project.Project
+import com.intellij.psi.PsiElementVisitor
+import liveplugin.registerInspection
+import org.jetbrains.kotlin.idea.base.utils.fqname.fqName
+import org.jetbrains.kotlin.idea.codeinsight.api.classic.inspections.AbstractKotlinInspection
+import org.jetbrains.kotlin.idea.util.AnnotationModificationHelper
+import org.jetbrains.kotlin.name.FqName
+import org.jetbrains.kotlin.nj2k.postProcessing.type
+import org.jetbrains.kotlin.psi.KtNamedFunction
+import org.jetbrains.kotlin.psi.KtVisitorVoid
+import org.jetbrains.kotlin.psi.psiUtil.isPublic
+import org.jetbrains.kotlin.types.typeUtil.supertypes
+
+// depends-on-plugin org.jetbrains.kotlin
+
+val skyhanniEvent = "at.hannibal2.skyhanni.api.event.SkyHanniEvent"
+val handleEvent = "HandleEvent"
+
+registerInspection(HandleEventInspectionKotlin())
+
+class HandleEventInspectionKotlin : AbstractKotlinInspection() {
+ override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
+
+ val visitor = object : KtVisitorVoid() {
+ override fun visitNamedFunction(function: KtNamedFunction) {
+ val hasEventAnnotation = function.annotationEntries.any { it.shortName!!.asString() == handleEvent }
+ val isEvent = function.valueParameters.firstOrNull()?.type()?.supertypes()
+ ?.any { it.fqName?.asString() == skyhanniEvent } ?: false
+
+ if (isEvent && !hasEventAnnotation && function.valueParameters.size == 1 && function.isPublic) {
+ holder.registerProblem(
+ function,
+ "Event handler function should be annotated with @HandleEvent",
+ HandleEventQuickFix()
+ )
+ } else if (!isEvent && hasEventAnnotation) {
+ holder.registerProblem(
+ function,
+ "Function should not be annotated with @HandleEvent if it does not take a SkyHanniEvent",
+ ProblemHighlightType.GENERIC_ERROR
+ )
+ }
+ }
+ }
+
+ return visitor
+ }
+
+ override fun getDisplayName() = "Event handler function should be annotated with @HandleEvent"
+ override fun getShortName() = "HandleEventInspection"
+ override fun getGroupDisplayName() = "SkyHanni"
+ override fun isEnabledByDefault() = true
+}
+
+class HandleEventQuickFix : LocalQuickFix {
+ override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
+ val function = descriptor.psiElement as KtNamedFunction
+ AnnotationModificationHelper.addAnnotation(
+ function,
+ FqName("at.hannibal2.skyhanni.api.event.HandleEvent"),
+ null,
+ null,
+ { null },
+ " ",
+ null
+ )
+ }
+
+ override fun getName() = "Annotate with @HandleEvent"
+
+ override fun getFamilyName() = name
+}