User: joe Date: 23 Jan 24 14:43 Revision: 4600b6d55a58492a9a4f46cad97a916507057b15 Summary: Check inspection settings before adding and reporting on unsafe = true TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=9037&personal=false Index: src/main/kotlin/platform/mixin/handlers/injectionPoint/CtorHeadInjectionPoint.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/injectionPoint/CtorHeadInjectionPoint.kt (revision 3412b3554fec87edc87fe95d5fd95ad811270312) +++ src/main/kotlin/platform/mixin/handlers/injectionPoint/CtorHeadInjectionPoint.kt (revision 4600b6d55a58492a9a4f46cad97a916507057b15) @@ -20,6 +20,7 @@ package com.demonwav.mcdev.platform.mixin.handlers.injectionPoint +import com.demonwav.mcdev.platform.mixin.inspection.injector.CtorHeadNoUnsafeInspection import com.demonwav.mcdev.platform.mixin.reference.MixinSelector import com.demonwav.mcdev.platform.mixin.util.findOrConstructSourceMethod import com.demonwav.mcdev.platform.mixin.util.findSuperConstructorCall @@ -27,6 +28,7 @@ import com.demonwav.mcdev.util.createLiteralExpression import com.demonwav.mcdev.util.enumValueOfOrNull import com.demonwav.mcdev.util.findContainingClass +import com.demonwav.mcdev.util.findInspection import com.intellij.codeInsight.lookup.LookupElementBuilder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project @@ -53,8 +55,16 @@ class CtorHeadInjectionPoint : InjectionPoint() { override fun onCompleted(editor: Editor, reference: PsiLiteral) { - val at = reference.parentOfType() ?: return val project = reference.project + + // avoid adding unsafe = true when it's unnecessary on Fabric + val noUnsafeInspection = + project.findInspection(CtorHeadNoUnsafeInspection.SHORT_NAME) + if (noUnsafeInspection?.ignoreForFabric == true) { + return + } + + val at = reference.parentOfType() ?: return at.setDeclaredAttributeValue( "unsafe", JavaPsiFacade.getElementFactory(project).createLiteralExpression(true) Index: src/main/kotlin/platform/mixin/inspection/injector/CtorHeadNoUnsafeInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/CtorHeadNoUnsafeInspection.kt (revision 3412b3554fec87edc87fe95d5fd95ad811270312) +++ src/main/kotlin/platform/mixin/inspection/injector/CtorHeadNoUnsafeInspection.kt (revision 4600b6d55a58492a9a4f46cad97a916507057b15) @@ -82,4 +82,8 @@ } } } + + companion object { + const val SHORT_NAME = "CtorHeadNoUnsafe" -} + } +} Index: src/main/kotlin/platform/mixin/inspection/injector/UnnecessaryUnsafeInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/UnnecessaryUnsafeInspection.kt (revision 3412b3554fec87edc87fe95d5fd95ad811270312) +++ src/main/kotlin/platform/mixin/inspection/injector/UnnecessaryUnsafeInspection.kt (revision 4600b6d55a58492a9a4f46cad97a916507057b15) @@ -29,6 +29,7 @@ import com.demonwav.mcdev.platform.mixin.util.MixinConstants import com.demonwav.mcdev.platform.mixin.util.isConstructor import com.demonwav.mcdev.util.constantValue +import com.demonwav.mcdev.util.findInspection import com.demonwav.mcdev.util.findModule import com.demonwav.mcdev.util.ifEmpty import com.intellij.codeInspection.ProblemsHolder @@ -64,13 +65,16 @@ val isFabric = holder.file.findModule()?.let { MinecraftFacet.getInstance(it) }?.isOfType(FabricModuleType) ?: false val alwaysUnnecessary = isFabric && alwaysUnnecessaryOnFabric + val requiresUnsafeForCtorHeadOnFabric = + holder.project.findInspection(CtorHeadNoUnsafeInspection.SHORT_NAME) + ?.ignoreForFabric == false return object : JavaElementVisitor() { override fun visitAnnotation(annotation: PsiAnnotation) { if (!annotation.hasQualifiedName(MixinConstants.Annotations.AT)) { return } - if (!alwaysUnnecessary && + if ((!alwaysUnnecessary || requiresUnsafeForCtorHeadOnFabric) && annotation.findDeclaredAttributeValue("value")?.constantValue == "CTOR_HEAD" ) { // this case is handled by a specific inspection for CTOR_HEAD @@ -94,6 +98,8 @@ } companion object { + const val SHORT_NAME = "UnnecessaryUnsafe" + fun mightTargetConstructor(project: Project, at: PsiAnnotation): Boolean { val injectorAnnotation = at.parents(false) .takeWhile { it !is PsiClass } Index: src/main/kotlin/util/utils.kt =================================================================== --- src/main/kotlin/util/utils.kt (revision 3412b3554fec87edc87fe95d5fd95ad811270312) +++ src/main/kotlin/util/utils.kt (revision 4600b6d55a58492a9a4f46cad97a916507057b15) @@ -22,6 +22,7 @@ import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.intellij.codeInspection.InspectionProfileEntry import com.intellij.lang.java.lexer.JavaLexer import com.intellij.openapi.application.AppUIExecutor import com.intellij.openapi.application.ApplicationManager @@ -42,12 +43,14 @@ import com.intellij.openapi.util.Ref import com.intellij.openapi.util.text.StringUtil import com.intellij.pom.java.LanguageLevel +import com.intellij.profile.codeInspection.InspectionProfileManager import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiFile import java.lang.invoke.MethodHandles import java.util.Locale import kotlin.math.min import kotlin.reflect.KClass +import org.jetbrains.annotations.NonNls import org.jetbrains.concurrency.Promise import org.jetbrains.concurrency.runAsync @@ -131,6 +134,11 @@ } } +inline fun Project.findInspection(@NonNls shortName: String): T? = + InspectionProfileManager.getInstance(this) + .currentProfile.getInspectionTool(shortName, this) + ?.tool as? T + /** * Returns an untyped array for the specified [Collection]. */