User: kyle wood Date: 01 Mar 23 06:01 Revision: fb8a9b0a86ebb275e53a028c05d15f6195a5da7c Summary: Resolve lots of warnings and minor highlights throughout TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=8330&personal=false Index: src/main/kotlin/creator/field-validation.kt =================================================================== --- src/main/kotlin/creator/field-validation.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/creator/field-validation.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -32,9 +32,5 @@ return false } // keyword identifier - if (fieldNameSplit.any { it.isJavaKeyword() }) { - return false + return !fieldNameSplit.any { it.isJavaKeyword() } - } +} - - return true -} Index: src/main/kotlin/creator/platformtype/PlatformTypeStep.kt =================================================================== --- src/main/kotlin/creator/platformtype/PlatformTypeStep.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/creator/platformtype/PlatformTypeStep.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -25,7 +25,7 @@ */ class PlatformTypeStep private constructor( parent: NewProjectWizardStep, -) : AbstractNewProjectWizardMultiStep(parent, EP_NAME), +) : AbstractNewProjectWizardMultiStep(parent, EP_NAME), NewProjectWizardBaseData by parent as NewProjectWizardBaseData { companion object { val EP_NAME = ExtensionPointName("com.demonwav.minecraft-dev.platformTypeWizard") Index: src/main/kotlin/creator/platformtype/PluginPlatformStep.kt =================================================================== --- src/main/kotlin/creator/platformtype/PluginPlatformStep.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/creator/platformtype/PluginPlatformStep.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -23,7 +23,7 @@ */ class PluginPlatformStep( parent: PlatformTypeStep, -) : AbstractNewProjectWizardMultiStep(parent, EP_NAME) { +) : AbstractNewProjectWizardMultiStep(parent, EP_NAME) { companion object { val EP_NAME = ExtensionPointName("com.demonwav.minecraft-dev.pluginPlatformWizard") } Index: src/main/kotlin/insight/ColorLineMarkerProvider.kt =================================================================== --- src/main/kotlin/insight/ColorLineMarkerProvider.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/insight/ColorLineMarkerProvider.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -114,7 +114,7 @@ element: PsiElement, color: Color, workElement: UElement, - ) : ColorLineMarkerProvider.ColorInfo( + ) : ColorInfo( element, color, GutterIconNavigationHandler handler@{ _, psiElement -> Index: src/main/kotlin/insight/ColorPicker.kt =================================================================== --- src/main/kotlin/insight/ColorPicker.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/insight/ColorPicker.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -75,17 +75,17 @@ } } - private class ColorPickerDialog constructor(parent: JComponent, private val component: JComponent) : + private class ColorPickerDialog(parent: JComponent, private val component: JComponent) : DialogWrapper(parent, false) { init { title = "Choose Color" - setResizable(true) + isResizable = true init() } - override fun createCenterPanel(): JComponent? { + override fun createCenterPanel(): JComponent { return component } } Index: src/main/kotlin/insight/ListenerLineMarkerProvider.kt =================================================================== --- src/main/kotlin/insight/ListenerLineMarkerProvider.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/insight/ListenerLineMarkerProvider.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -80,7 +80,7 @@ override fun getName() = "Event Listener line marker" override fun getIcon() = GeneralAssets.LISTENER - private class EventLineMarkerInfo constructor( + private class EventLineMarkerInfo( element: PsiElement, range: TextRange, icon: Icon, Index: src/main/kotlin/insight/PluginLineMarkerProvider.kt =================================================================== --- src/main/kotlin/insight/PluginLineMarkerProvider.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/insight/PluginLineMarkerProvider.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -36,6 +36,7 @@ return null } + @Suppress("MoveLambdaOutsideParentheses") return LineMarkerInfo( element, element.textRange, Index: src/main/kotlin/nbt/lang/format/NbttFoldingBuilder.kt =================================================================== --- src/main/kotlin/nbt/lang/format/NbttFoldingBuilder.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/nbt/lang/format/NbttFoldingBuilder.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -100,9 +100,7 @@ } override fun isCollapsedByDefault(node: ASTNode): Boolean { - val psi = node.psi - - val size = when (psi) { + val size = when (val psi = node.psi) { is NbttByteArray -> psi.getByteList().size is NbttIntArray -> psi.getIntList().size is NbttLongArray -> psi.getLongList().size Index: src/main/kotlin/platform/bukkit/BukkitModule.kt =================================================================== --- src/main/kotlin/platform/bukkit/BukkitModule.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/bukkit/BukkitModule.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -36,7 +36,7 @@ import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.toUElementOfType -class BukkitModule> constructor(facet: MinecraftFacet, type: T) : AbstractModule(facet) { +class BukkitModule>(facet: MinecraftFacet, type: T) : AbstractModule(facet) { var pluginYml by nullable { facet.findFile("plugin.yml", SourceType.RESOURCE) } private set Index: src/main/kotlin/platform/bukkit/generation/BukkitEventGenerationPanel.kt =================================================================== --- src/main/kotlin/platform/bukkit/generation/BukkitEventGenerationPanel.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/bukkit/generation/BukkitEventGenerationPanel.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -23,7 +23,7 @@ private lateinit var parentPanel: JPanel private lateinit var eventPriorityComboBox: JComboBox - override val panel: JPanel? + override val panel: JPanel get() { ignoreCanceledCheckBox.isSelected = true @@ -40,7 +40,10 @@ return parentPanel } - override fun gatherData(): GenerationData? { - return BukkitGenerationData(ignoreCanceledCheckBox.isSelected, eventPriorityComboBox.selectedItem.toString()) + override fun gatherData(): GenerationData { + return BukkitGenerationData( + ignoreCanceledCheckBox.isSelected, + eventPriorityComboBox.selectedItem?.toString() ?: error("No selected item") + ) } } Index: src/main/kotlin/platform/bukkit/inspection/BukkitListenerImplementedInspection.kt =================================================================== --- src/main/kotlin/platform/bukkit/inspection/BukkitListenerImplementedInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/bukkit/inspection/BukkitListenerImplementedInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -33,7 +33,7 @@ override fun getStaticDescription() = "All Bukkit @EventHandler methods must reside in a class that implements Listener." - override fun buildFix(vararg infos: Any): InspectionGadgetsFix? { + override fun buildFix(vararg infos: Any): InspectionGadgetsFix { return object : InspectionGadgetsFix() { override fun doFix(project: Project, descriptor: ProblemDescriptor) { val psiClass = infos[0] as PsiClass Index: src/main/kotlin/platform/bungeecord/generation/BungeeCordEventGenerationPanel.kt =================================================================== --- src/main/kotlin/platform/bungeecord/generation/BungeeCordEventGenerationPanel.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/bungeecord/generation/BungeeCordEventGenerationPanel.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -20,7 +20,7 @@ private lateinit var eventPriorityComboBox: JComboBox private lateinit var parentPanel: JPanel - override val panel: JPanel? + override val panel: JPanel get() { // Not static because the form builder is not reliable eventPriorityComboBox.addItem("HIGHEST") Index: src/main/kotlin/platform/bungeecord/inspection/BungeeCordListenerImplementedInspection.kt =================================================================== --- src/main/kotlin/platform/bungeecord/inspection/BungeeCordListenerImplementedInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/bungeecord/inspection/BungeeCordListenerImplementedInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -32,7 +32,7 @@ override fun getStaticDescription() = "All BungeeCord @EventHandler methods must reside in a class that implements Listener." - override fun buildFix(vararg infos: Any): InspectionGadgetsFix? { + override fun buildFix(vararg infos: Any): InspectionGadgetsFix { return object : InspectionGadgetsFix() { override fun doFix(project: Project, descriptor: ProblemDescriptor) { val psiClass = infos[0] as PsiClass Index: src/main/kotlin/platform/fabric/creator/asset-steps.kt =================================================================== --- src/main/kotlin/platform/fabric/creator/asset-steps.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/fabric/creator/asset-steps.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -98,8 +98,7 @@ val buildSystemProps = findStep>() val modName = data.getUserData(AbstractModNameStep.KEY) ?: return val description = data.getUserData(DescriptionStep.KEY) ?: "" - val environment = data.getUserData(FabricEnvironmentStep.KEY) ?: Side.NONE - val envName = when (environment) { + val envName = when (data.getUserData(FabricEnvironmentStep.KEY) ?: Side.NONE) { Side.CLIENT -> "client" Side.SERVER -> "server" else -> "*" Index: src/main/kotlin/platform/forge/inspections/sideonly/FieldDeclarationSideOnlyInspection.kt =================================================================== --- src/main/kotlin/platform/forge/inspections/sideonly/FieldDeclarationSideOnlyInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/forge/inspections/sideonly/FieldDeclarationSideOnlyInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -28,7 +28,7 @@ return error.getErrorString(*SideOnlyUtil.getSubArray(infos)) } - override fun getStaticDescription(): String? { + override fun getStaticDescription(): String { return "A field in a class annotated for one side cannot be declared as being in the other side. " + "For example, a class which is annotated as @SideOnly(Side.SERVER) cannot contain a field which is " + "annotated as @SideOnly(Side.CLIENT). Since a class that is annotated with @SideOnly brings " + @@ -39,7 +39,10 @@ val annotation = infos[3] as PsiAnnotation return if (annotation.isWritable) { - RemoveAnnotationInspectionGadgetsFix(annotation, "Remove @SideOnly annotation from field") + RemoveAnnotationInspectionGadgetsFix( + annotation.qualifiedName ?: return null, + "Remove @SideOnly annotation from field" + ) } else { null } Index: src/main/kotlin/platform/forge/inspections/sideonly/LocalVariableDeclarationSideOnlyInspection.kt =================================================================== --- src/main/kotlin/platform/forge/inspections/sideonly/LocalVariableDeclarationSideOnlyInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/forge/inspections/sideonly/LocalVariableDeclarationSideOnlyInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -38,7 +38,7 @@ return if (annotation.isWritable) { RemoveAnnotationInspectionGadgetsFix( - annotation, + annotation.qualifiedName ?: return null, "Remove @SideOnly annotation from variable class declaration", ) } else { Index: src/main/kotlin/platform/forge/inspections/sideonly/MethodCallSideOnlyInspection.kt =================================================================== --- src/main/kotlin/platform/forge/inspections/sideonly/MethodCallSideOnlyInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/forge/inspections/sideonly/MethodCallSideOnlyInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -41,7 +41,10 @@ val annotation = infos[3] as PsiAnnotation return if (annotation.isWritable) { - RemoveAnnotationInspectionGadgetsFix(annotation, "Remove @SideOnly annotation from method declaration") + RemoveAnnotationInspectionGadgetsFix( + annotation.qualifiedName ?: return null, + "Remove @SideOnly annotation from method declaration" + ) } else { null } Index: src/main/kotlin/platform/forge/inspections/sideonly/MethodSideOnlyInspection.kt =================================================================== --- src/main/kotlin/platform/forge/inspections/sideonly/MethodSideOnlyInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/forge/inspections/sideonly/MethodSideOnlyInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -28,7 +28,7 @@ return error.getErrorString(*SideOnlyUtil.getSubArray(infos)) } - override fun getStaticDescription(): String? { + override fun getStaticDescription(): String { return "A method in a class annotated for one side cannot be declared as being in the other side. " + "For example, a class which is annotated as @SideOnly(Side.SERVER) cannot contain a method which " + "is annotated as @SideOnly(Side.CLIENT). Since a class that is annotated with @SideOnly brings " + @@ -40,7 +40,10 @@ val annotation = infos[3] as PsiAnnotation return if (annotation.isWritable && error === Error.METHOD_IN_WRONG_CLASS) { - RemoveAnnotationInspectionGadgetsFix(annotation, "Remove @SideOnly annotation from method") + RemoveAnnotationInspectionGadgetsFix( + annotation.qualifiedName ?: return null, + "Remove @SideOnly annotation from method" + ) } else { null } Index: src/main/kotlin/platform/forge/inspections/sideonly/NestedClassSideOnlyInspection.kt =================================================================== --- src/main/kotlin/platform/forge/inspections/sideonly/NestedClassSideOnlyInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/forge/inspections/sideonly/NestedClassSideOnlyInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -26,7 +26,7 @@ "A nested class cannot declare a side that is different from the parent class." + "\nEither remove the nested class's @SideOnly annotation, or change it to match it's parent's side." - override fun getStaticDescription(): String? { + override fun getStaticDescription(): String { return "Classes which are annotated with @SideOnly cannot contain any nested classes which are " + "annotated with a different @SideOnly annotation. Since a class that is annotated with @SideOnly " + "brings everything with it, @SideOnly annotated nested classes are usually useless." @@ -36,7 +36,10 @@ val annotation = infos[0] as PsiAnnotation return if (annotation.isWritable) { - RemoveAnnotationInspectionGadgetsFix(annotation, "Remove @SideOnly annotation from nested class") + RemoveAnnotationInspectionGadgetsFix( + annotation.qualifiedName ?: return null, + "Remove @SideOnly annotation from nested class" + ) } else { null } Index: src/main/kotlin/platform/forge/inspections/sideonly/NewExpressionSideOnlyInspection.kt =================================================================== --- src/main/kotlin/platform/forge/inspections/sideonly/NewExpressionSideOnlyInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/forge/inspections/sideonly/NewExpressionSideOnlyInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -38,7 +38,10 @@ val annotation = infos[0] as? PsiAnnotation ?: return null return if (annotation.isWritable) { - RemoveAnnotationInspectionGadgetsFix(annotation, "Remove @SideOnly annotation from class declaration") + RemoveAnnotationInspectionGadgetsFix( + annotation.qualifiedName ?: return null, + "Remove @SideOnly annotation from class declaration" + ) } else { null } @@ -67,6 +70,7 @@ } } + @Suppress("KotlinConstantConditions") // kotlin is wrong if (classAnnotation == null || classSide == Side.NONE || offender == null) { return } Index: src/main/kotlin/platform/forge/inspections/sideonly/RemoveAnnotationInspectionGadgetsFix.kt =================================================================== --- src/main/kotlin/platform/forge/inspections/sideonly/RemoveAnnotationInspectionGadgetsFix.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/forge/inspections/sideonly/RemoveAnnotationInspectionGadgetsFix.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -10,19 +10,22 @@ package com.demonwav.mcdev.platform.forge.inspections.sideonly +import com.demonwav.mcdev.util.findAnnotation import com.intellij.codeInspection.ProblemDescriptor import com.intellij.openapi.project.Project -import com.intellij.psi.PsiAnnotation -import com.intellij.structuralsearch.plugin.util.SmartPsiPointer +import com.intellij.psi.PsiModifierListOwner +import com.intellij.psi.util.findParentOfType import com.siyeh.ig.InspectionGadgetsFix import org.jetbrains.annotations.Nls -class RemoveAnnotationInspectionGadgetsFix(element: PsiAnnotation, private val name: String) : InspectionGadgetsFix() { +class RemoveAnnotationInspectionGadgetsFix( + private val annotationName: String, + private val name: String +) : InspectionGadgetsFix() { - private val pointer: SmartPsiPointer = SmartPsiPointer(element) - override fun doFix(project: Project, descriptor: ProblemDescriptor) { - (pointer.element as? PsiAnnotation)?.delete() + val decl = descriptor.psiElement.findParentOfType() ?: return + decl.findAnnotation(annotationName)?.delete() } @Nls Index: src/main/kotlin/platform/forge/inspections/simpleimpl/AddEmptyConstructorInspectionGadgetsFix.kt =================================================================== --- src/main/kotlin/platform/forge/inspections/simpleimpl/AddEmptyConstructorInspectionGadgetsFix.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/forge/inspections/simpleimpl/AddEmptyConstructorInspectionGadgetsFix.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -10,23 +10,20 @@ package com.demonwav.mcdev.platform.forge.inspections.simpleimpl +import com.demonwav.mcdev.util.findContainingClass import com.intellij.codeInspection.ProblemDescriptor import com.intellij.openapi.project.Project import com.intellij.psi.JavaPsiFacade -import com.intellij.psi.PsiClass -import com.intellij.structuralsearch.plugin.util.SmartPsiPointer import com.siyeh.ig.InspectionGadgetsFix -class AddEmptyConstructorInspectionGadgetsFix(element: PsiClass, private val name: String) : InspectionGadgetsFix() { +object AddEmptyConstructorInspectionGadgetsFix : InspectionGadgetsFix() { - private val pointer: SmartPsiPointer = SmartPsiPointer(element) - - override fun doFix(project: Project, descriptor: ProblemDescriptor?) { - val clazz = pointer.element as? PsiClass ?: return + override fun doFix(project: Project, descriptor: ProblemDescriptor) { + val clazz = descriptor.psiElement.findContainingClass() ?: return clazz.addBefore(JavaPsiFacade.getElementFactory(project).createConstructor(), clazz.methods[0]) } - override fun getName() = name + override fun getName() = "Add empty constructor" override fun getFamilyName() = name } Index: src/main/kotlin/platform/forge/inspections/simpleimpl/MissingMessageConstructorInspection.kt =================================================================== --- src/main/kotlin/platform/forge/inspections/simpleimpl/MissingMessageConstructorInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/forge/inspections/simpleimpl/MissingMessageConstructorInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -30,7 +30,7 @@ val messageClass = infos[0] as PsiClass return if (messageClass.isWritable) { - AddEmptyConstructorInspectionGadgetsFix(messageClass, "Add empty constructor") + AddEmptyConstructorInspectionGadgetsFix } else { null } Index: src/main/kotlin/platform/mcp/actions/FindSrgMappingAction.kt =================================================================== --- src/main/kotlin/platform/mcp/actions/FindSrgMappingAction.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mcp/actions/FindSrgMappingAction.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -32,7 +32,7 @@ } is PsiClass -> { val classMcpToSrg = srgMap.getSrgClass(parent) ?: return showBalloon("No SRG name found", e) - showSuccessBalloon(data.editor, data.element, "SRG name: " + classMcpToSrg) + showSuccessBalloon(data.editor, data.element, "SRG name: $classMcpToSrg") } else -> showBalloon("Not a valid element", e) } Index: src/main/kotlin/platform/mcp/at/AtUsageInspection.kt =================================================================== --- src/main/kotlin/platform/mcp/at/AtUsageInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mcp/at/AtUsageInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -26,7 +26,7 @@ class AtUsageInspection : LocalInspectionTool() { - override fun getStaticDescription(): String? { + override fun getStaticDescription(): String { return "The declared access transformer is never used" } Index: src/main/kotlin/platform/mcp/inspections/StackEmptyInspection.kt =================================================================== --- src/main/kotlin/platform/mcp/inspections/StackEmptyInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mcp/inspections/StackEmptyInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -52,7 +52,7 @@ "When a stack in an inventory is shrunk, the instance is not replaced with ItemStack.EMPTY, but" + " the stack should still be considered empty. Instead, isEmpty() should be called." - override fun buildFix(vararg infos: Any): InspectionGadgetsFix? { + override fun buildFix(vararg infos: Any): InspectionGadgetsFix { return object : InspectionGadgetsFix() { override fun getFamilyName() = "Replace with .isEmpty()" Index: src/main/kotlin/platform/mcp/srg/TinySrgParser.kt =================================================================== --- src/main/kotlin/platform/mcp/srg/TinySrgParser.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mcp/srg/TinySrgParser.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -144,15 +144,16 @@ else -> return } - if (targetKind == MappedElementKind.CLASS && named != null) { - classMapBuilder.put(cls, named!!.replace('/', '.')) - } else if (inter != null && named != null) { + if (targetKind == MappedElementKind.CLASS) { + classMapBuilder.put(cls, name.replace('/', '.')) + } else if (inter != null) { + val inter = inter!! if (targetKind == MappedElementKind.FIELD) { - fieldMapBuilder.put(MemberReference(inter!!, null, cls), MemberReference(named!!, null, cls)) - srgNames[inter!!] = named!! + fieldMapBuilder.put(MemberReference(inter, null, cls), MemberReference(name, null, cls)) + srgNames[inter] = name } else if (targetKind == MappedElementKind.METHOD) { - methodMapBuilder.put(MemberReference(inter!!, desc, cls), MemberReference(named!!, desc, cls)) - srgNames[inter!!] = named!! + methodMapBuilder.put(MemberReference(inter, desc, cls), MemberReference(name, desc, cls)) + srgNames[inter] = name } } } Index: src/main/kotlin/platform/mixin/action/GenerateSoftImplementsAction.kt =================================================================== --- src/main/kotlin/platform/mixin/action/GenerateSoftImplementsAction.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/action/GenerateSoftImplementsAction.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -64,7 +64,7 @@ return } - val chooser = MemberChooser(methods.keys.toTypedArray(), false, true, project) + val chooser = MemberChooser(methods.keys.toTypedArray(), false, true, project) chooser.title = "Select Methods to Soft-implement" chooser.show() Index: src/main/kotlin/platform/mixin/config/MixinConfigImportOptimizer.kt =================================================================== --- src/main/kotlin/platform/mixin/config/MixinConfigImportOptimizer.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/config/MixinConfigImportOptimizer.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -23,6 +23,7 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile +import kotlin.math.min class MixinConfigImportOptimizer : ImportOptimizer { @@ -52,7 +53,7 @@ val parts1 = class1.split('.') val parts2 = class2.split('.') - val end = Math.min(parts1.size - 1, parts2.size - 1) + val end = min(parts1.size - 1, parts2.size - 1) for (i in 0 until end) { val result = parts1[i].compareTo(parts2[i], ignoreCase = true) if (result != 0) { @@ -62,7 +63,7 @@ if (parts1.size != parts2.size) { // Default package always comes first - return Integer.compare(parts1.size, parts2.size) + return parts1.size.compareTo(parts2.size) } // Compare class names Index: src/main/kotlin/platform/mixin/debug/MixinPositionManagerFactory.kt =================================================================== --- src/main/kotlin/platform/mixin/debug/MixinPositionManagerFactory.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/debug/MixinPositionManagerFactory.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -16,5 +16,5 @@ class MixinPositionManagerFactory : PositionManagerFactory() { - override fun createPositionManager(process: DebugProcess): PositionManager? = MixinPositionManager(process) + override fun createPositionManager(process: DebugProcess): PositionManager = MixinPositionManager(process) } Index: src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -78,8 +78,7 @@ ): InsnResolutionInfo.Failure? { return annotation.findAttributeValue("at")?.findAnnotations() .ifNullOrEmpty { return InsnResolutionInfo.Failure() }!! - .mapNotNull { AtResolver(it, targetClass, targetMethod).isUnresolved() } - .firstOrNull() + .firstNotNullOfOrNull { AtResolver(it, targetClass, targetMethod).isUnresolved() } } override fun resolveForNavigation(annotation: PsiAnnotation, targetClass: ClassNode): List { Index: src/main/kotlin/platform/mixin/handlers/ModifyArgHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/ModifyArgHandler.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/handlers/ModifyArgHandler.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -59,7 +59,7 @@ if (validSingleArgTypes.isEmpty()) { validSingleArgTypes.addAll(validArgTypes) } else { - validSingleArgTypes.retainAll(validArgTypes) + validSingleArgTypes.retainAll(validArgTypes.toSet()) if (validSingleArgTypes.isEmpty()) { return listOf() } Index: src/main/kotlin/platform/mixin/inspection/implements/EmptyImplementsInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/implements/EmptyImplementsInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/inspection/implements/EmptyImplementsInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -33,7 +33,7 @@ } val interfaces = annotation.findDeclaredAttributeValue(null)?.findAnnotations() - if (interfaces == null || interfaces.isEmpty()) { + if (interfaces.isNullOrEmpty()) { holder.registerProblem( annotation, "@Implements is redundant", Index: src/main/kotlin/platform/mixin/inspection/injector/InjectIntoConstructorInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/InjectIntoConstructorInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/inspection/injector/InjectIntoConstructorInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -32,13 +32,13 @@ class InjectIntoConstructorInspection : MixinInspection() { @JvmField - var ALLOW_ON_FABRIC = true + var allowOnFabric = true override fun createOptionsPanel(): JComponent { val panel = JPanel(FlowLayout(FlowLayout.LEFT)) - val checkbox = JCheckBox("Allow @Inject into constructors in Fabric", ALLOW_ON_FABRIC) + val checkbox = JCheckBox("Allow @Inject into constructors in Fabric", allowOnFabric) checkbox.addActionListener { - ALLOW_ON_FABRIC = checkbox.isSelected + allowOnFabric = checkbox.isSelected } panel.add(checkbox) return panel @@ -47,7 +47,7 @@ override fun buildVisitor(holder: ProblemsHolder): PsiElementVisitor { val isFabric = holder.file.findModule()?.let { MinecraftFacet.getInstance(it) }?.isOfType(FabricModuleType) ?: false - if (isFabric && ALLOW_ON_FABRIC) { + if (isFabric && allowOnFabric) { return PsiElementVisitor.EMPTY_VISITOR } Index: src/main/kotlin/platform/mixin/inspection/injector/InvalidInjectorMethodSignatureInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/InvalidInjectorMethodSignatureInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/inspection/injector/InvalidInjectorMethodSignatureInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -24,6 +24,7 @@ import com.demonwav.mcdev.util.Parameter import com.demonwav.mcdev.util.fullQualifiedName import com.demonwav.mcdev.util.synchronize +import com.intellij.codeInsight.intention.FileModifier.SafeFieldForPreview import com.intellij.codeInsight.intention.QuickFixFactory import com.intellij.codeInspection.LocalQuickFix import com.intellij.codeInspection.ProblemDescriptor @@ -279,6 +280,7 @@ } private class ParametersQuickFix( + @SafeFieldForPreview private val expected: List, isInject: Boolean, ) : LocalQuickFix { Index: src/main/kotlin/platform/mixin/inspection/reference/UnresolvedReferenceInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/reference/UnresolvedReferenceInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/inspection/reference/UnresolvedReferenceInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -36,8 +36,7 @@ private class Visitor(private val holder: ProblemsHolder) : JavaElementVisitor() { override fun visitNameValuePair(pair: PsiNameValuePair) { - val name = pair.name ?: PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME - val resolvers: Array = when (name) { + val resolvers: Array = when (pair.name ?: PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME) { "method" -> arrayOf(MethodReference) "target" -> arrayOf(TargetReference) "value" -> arrayOf(InjectionPointReference, DescReference) Index: src/main/kotlin/platform/mixin/inspection/suppress/ShadowOverwriteInspectionSuppressor.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/suppress/ShadowOverwriteInspectionSuppressor.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/inspection/suppress/ShadowOverwriteInspectionSuppressor.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -21,14 +21,6 @@ class ShadowOverwriteInspectionSuppressor : InspectionSuppressor { - private val SUPPRESSED_INSPECTIONS = setOf( - "UnusedReturnValue", - "SameParameterValue", - "Guava", - VisibilityInspection.SHORT_NAME, - "MethodMayBeStatic", - ) - override fun isSuppressedFor(element: PsiElement, toolId: String): Boolean { if (toolId !in SUPPRESSED_INSPECTIONS) { return false @@ -40,4 +32,14 @@ override fun getSuppressActions(element: PsiElement?, toolId: String): Array = SuppressQuickFix.EMPTY_ARRAY + + companion object { + private val SUPPRESSED_INSPECTIONS = setOf( + "UnusedReturnValue", + "SameParameterValue", + "Guava", + VisibilityInspection.SHORT_NAME, + "MethodMayBeStatic", + ) -} + } +} Index: src/main/kotlin/platform/mixin/util/LocalVariables.kt =================================================================== --- src/main/kotlin/platform/mixin/util/LocalVariables.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/util/LocalVariables.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -227,6 +227,7 @@ val localsHere = this.locals[offset] ?: emptyArray() var changed = false val nextLocals = this.locals[nextOffset] + @Suppress("KotlinConstantConditions") // kotlin is wrong if (nextLocals == null) { this.locals[nextOffset] = localsHere.clone() changed = true @@ -246,6 +247,7 @@ } } } + @Suppress("KotlinConstantConditions") // kotlin is wrong if (changed) { instructionQueue.add(nextOffset) } Index: src/main/kotlin/platform/mixin/util/TargetClass.kt =================================================================== --- src/main/kotlin/platform/mixin/util/TargetClass.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/mixin/util/TargetClass.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -136,7 +136,7 @@ private fun PsiClass.streamMixinHierarchy(): Sequence { return generateSequence(this) { - it.superClass?.takeIf { it.isMixin } + it.superClass?.takeIf { superClass -> superClass.isMixin } } } Index: src/main/kotlin/platform/sponge/generation/SpongeEventGenerationPanel.kt =================================================================== --- src/main/kotlin/platform/sponge/generation/SpongeEventGenerationPanel.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/sponge/generation/SpongeEventGenerationPanel.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -23,7 +23,7 @@ private lateinit var eventOrderComboBox: JComboBox private lateinit var ignoreCanceledCheckBox: JCheckBox - override val panel: JPanel? + override val panel: JPanel get() { ignoreCanceledCheckBox.isSelected = true @@ -43,7 +43,7 @@ return parentPanel } - override fun gatherData(): GenerationData? { + override fun gatherData(): GenerationData { return SpongeGenerationData(ignoreCanceledCheckBox.isSelected, eventOrderComboBox.selectedItem as String) } } Index: src/main/kotlin/platform/sponge/util/SpongeConstants.kt =================================================================== --- src/main/kotlin/platform/sponge/util/SpongeConstants.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/sponge/util/SpongeConstants.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -31,8 +31,8 @@ const val INJECT_ANNOTATION = "com.google.inject.Inject" // Taken from https://github.com/SpongePowered/plugin-meta/blob/185f5c2/src/main/java/org/spongepowered/plugin/meta/PluginMetadata.java#L60 - val ID_PATTERN_STRING = "^[a-z][a-z0-9-_]{1,63}$" - val ID_PATTERN = Pattern.compile(ID_PATTERN_STRING) + private const val ID_PATTERN_STRING = "^[a-z][a-z0-9-_]{1,63}$" + val ID_PATTERN: Pattern = Pattern.compile(ID_PATTERN_STRING) val API8 = SemanticVersion.release(8) val API9 = SemanticVersion.release(9) Index: src/main/kotlin/platform/velocity/creator/gradle-steps.kt =================================================================== --- src/main/kotlin/platform/velocity/creator/gradle-steps.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/velocity/creator/gradle-steps.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -36,6 +36,7 @@ import com.intellij.openapi.project.Project class VelocityGradleSupport : BuildSystemSupport { + @Suppress("MoveLambdaOutsideParentheses") override fun createStep(step: String, parent: NewProjectWizardStep): NewProjectWizardStep { return when (step) { BuildSystemSupport.PRE_STEP -> VelocityGradleFilesStep(parent).chain( Index: src/main/kotlin/platform/velocity/generation/VelocityEventGenerationPanel.kt =================================================================== --- src/main/kotlin/platform/velocity/generation/VelocityEventGenerationPanel.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/platform/velocity/generation/VelocityEventGenerationPanel.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -21,7 +21,7 @@ private lateinit var parentPanel: JPanel private lateinit var eventOrderComboBox: JComboBox - override val panel: JPanel? + override val panel: JPanel get() { // Not static because the form builder is not reliable eventOrderComboBox.addItem("FIRST") @@ -35,7 +35,7 @@ return parentPanel } - override fun gatherData(): GenerationData? { + override fun gatherData(): GenerationData { return VelocityGenerationData(eventOrderComboBox.selectedItem as String) } } Index: src/main/kotlin/toml/platform/forge/completion/ModsTomlCompletionContributor.kt =================================================================== --- src/main/kotlin/toml/platform/forge/completion/ModsTomlCompletionContributor.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/toml/platform/forge/completion/ModsTomlCompletionContributor.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -57,6 +57,7 @@ ModsTomlKnownStringValuesCompletionProvider(values), ) + @Suppress("SameParameterValue") private fun extendKnownValues(key: String, vararg values: String) = extendKnownValues(key, values.toSet()) @@ -86,16 +87,16 @@ is TomlTable -> false else -> return } - schema.topLevelKeys(isArray) - table.entries.map { it.key.text } + schema.topLevelKeys(isArray) - table.entries.mapTo(HashSet()) { it.key.text } } is TomlKeyValue -> when (table) { null -> { schema.topLevelEntries.map { it.key } - - key.containingFile.children.filterIsInstance().map { it.key.text } + key.containingFile.children.filterIsInstance().mapTo(HashSet()) { it.key.text } } is TomlHeaderOwner -> { val tableName = table.header.key?.segments?.firstOrNull()?.text ?: return - schema.keysForTable(tableName) - table.entries.map { it.key.text } + schema.keysForTable(tableName) - table.entries.mapTo(HashSet()) { it.key.text } } else -> return } Index: src/main/kotlin/toml/platform/forge/inspections/ModsTomlValidationInspection.kt =================================================================== --- src/main/kotlin/toml/platform/forge/inspections/ModsTomlValidationInspection.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/toml/platform/forge/inspections/ModsTomlValidationInspection.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -112,7 +112,7 @@ val isDeclaredId = keySegment.containingFile.children .filterIsInstance() .filter { it.header.key?.name == "mods" } - .any { it.entries.find { it.key.text == "modId" }?.value?.stringValue() == targetId } + .any { it.entries.find { entry -> entry.key.text == "modId" }?.value?.stringValue() == targetId } if (!isDeclaredId) { holder.registerProblem(keySegment, "Mod $targetId is not declared in this file") } Index: src/main/kotlin/toml/platform/forge/reference/ModsTomlReferenceContributor.kt =================================================================== --- src/main/kotlin/toml/platform/forge/reference/ModsTomlReferenceContributor.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/toml/platform/forge/reference/ModsTomlReferenceContributor.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -85,13 +85,11 @@ override fun resolve(): PsiElement? { val referencedId = element.text return element.containingFile.childrenOfType() - .filter { it.header.key?.segments?.firstOrNull()?.text == "mods" } - .mapNotNull { table -> + .filter { it.header.key?.segments?.firstOrNull()?.text == "mods" }.firstNotNullOfOrNull { table -> table.entries.find { it.key.text == "modId" && it.value?.stringValue() == referencedId }?.value } - .firstOrNull() } override fun getVariants(): Array = Index: src/main/kotlin/toml/toml-patterns.kt =================================================================== --- src/main/kotlin/toml/toml-patterns.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/toml/toml-patterns.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -25,13 +25,17 @@ fun inModsToml(clazz: Class): PsiElementPattern.Capture = PlatformPatterns.psiElement(clazz).inVirtualFile(VirtualFilePattern().withName(ForgeConstants.MODS_TOML)) -fun inModsTomlKey() = inModsToml().withParent(TomlKeySegment::class.java) +fun inModsTomlKey(): PsiElementPattern.Capture = + inModsToml().withParent(TomlKeySegment::class.java) -fun tomlKeyValue(key: String) = PlatformPatterns.psiElement(TomlKeyValue::class.java) +fun tomlKeyValue(key: String): PsiElementPattern.Capture = + PlatformPatterns.psiElement(TomlKeyValue::class.java) - .withChild(PlatformPatterns.psiElement(TomlKey::class.java).withText(key)) + .withChild(PlatformPatterns.psiElement(TomlKey::class.java).withText(key)) -fun inModsTomlValueWithKey(key: String) = inModsToml().inside(tomlKeyValue(key)) +fun inModsTomlValueWithKey(key: String): PsiElementPattern.Capture = + inModsToml().inside(tomlKeyValue(key)) -fun inDependenciesHeaderId() = inModsToml().inside(PlatformPatterns.psiElement(TomlTableHeader::class.java)) +fun inDependenciesHeaderId(): PsiElementPattern.Capture = + inModsToml().inside(PlatformPatterns.psiElement(TomlTableHeader::class.java)) - // [[dependencies.]] - .afterLeaf(PlatformPatterns.psiElement().withText(".").afterLeaf("dependencies")) + // [[dependencies.]] + .afterLeaf(PlatformPatterns.psiElement().withText(".").afterLeaf("dependencies")) Index: src/main/kotlin/translations/TranslationEditorNotificationProvider.kt =================================================================== --- src/main/kotlin/translations/TranslationEditorNotificationProvider.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/TranslationEditorNotificationProvider.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -48,7 +48,7 @@ val missingTranslations = getMissingTranslations(project, file) if (missingTranslations.any()) { val panel = InfoPanel() - panel.setText("Translation file doesn't match default one (${TranslationConstants.DEFAULT_LOCALE} locale).") + panel.text = "Translation file doesn't match default one (${TranslationConstants.DEFAULT_LOCALE} locale)." panel.createActionLabel( "Add missing default entries (won't reflect changes in original English localization)", ) { Index: src/main/kotlin/translations/TranslationFiles.kt =================================================================== --- src/main/kotlin/translations/TranslationFiles.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/TranslationFiles.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -238,7 +238,7 @@ return result.removeSuffix("\n").removeSuffix(",") } - fun buildFileEntries(project: Project, locale: String, entries: Sequence, keepComments: Int) = + fun buildFileEntries(project: Project, locale: String, entries: Iterable, keepComments: Int) = sequence { for (entry in entries) { val langElement = TranslationInverseIndex.findElements( Index: src/main/kotlin/translations/index/TranslationIndex.kt =================================================================== --- src/main/kotlin/translations/index/TranslationIndex.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/index/TranslationIndex.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -73,15 +73,11 @@ fun getAllDefaultEntries(project: Project, domain: String? = null) = getEntries(GlobalSearchScope.allScope(project), TranslationConstants.DEFAULT_LOCALE, domain) - fun getProjectDefaultEntries(project: Project, domain: String? = null) = + private fun getProjectDefaultEntries(project: Project, domain: String? = null) = getEntries(GlobalSearchScope.projectScope(project), TranslationConstants.DEFAULT_LOCALE, domain) fun getEntries(scope: GlobalSearchScope, locale: String, domain: String? = null) = - FileBasedIndex.getInstance().getValues( - TranslationIndex.NAME, - locale, - scope, - ).asSequence() + FileBasedIndex.getInstance().getValues(NAME, locale, scope,).asSequence() .filter { domain == null || it.sourceDomain == domain } private fun Sequence.flatten() = this.flatMap { it.translations.asSequence() } @@ -108,7 +104,7 @@ private object Indexer : DataIndexer { override fun map(inputData: FileContent): MutableMap { val domain = inputData.file.mcDomain ?: return mutableMapOf() - val entry = TranslationProvider.INSTANCES[inputData.fileType]?.map(domain, inputData) + val entry = TranslationProvider.INSTANCES[inputData.fileType.name]?.map(domain, inputData) ?: return mutableMapOf() val locale = TranslationFiles.getLocale(inputData.file) ?: return mutableMapOf() return mutableMapOf(locale to entry) Index: src/main/kotlin/translations/index/TranslationInputFilter.kt =================================================================== --- src/main/kotlin/translations/index/TranslationInputFilter.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/index/TranslationInputFilter.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -12,6 +12,7 @@ import com.demonwav.mcdev.translations.TranslationFiles import com.intellij.openapi.fileTypes.FileType +import com.intellij.openapi.fileTypes.FileTypeManager import com.intellij.openapi.vfs.VirtualFile import com.intellij.util.Consumer import com.intellij.util.indexing.FileBasedIndex @@ -19,7 +20,7 @@ object TranslationInputFilter : FileBasedIndex.FileTypeSpecificInputFilter { override fun registerFileTypesUsedForIndexing(fileTypeSink: Consumer) { for (fileType in TranslationProvider.INSTANCES.keys) { - fileTypeSink.consume(fileType) + fileTypeSink.consume(FileTypeManager.getInstance().findFileTypeByName(fileType)) } } Index: src/main/kotlin/translations/index/TranslationInverseIndex.kt =================================================================== --- src/main/kotlin/translations/index/TranslationInverseIndex.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/index/TranslationInverseIndex.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -54,7 +54,7 @@ locale == null || TranslationFiles.getLocale(it) == locale } .flatMap { - TranslationProvider.INSTANCES[it.fileType]?.findElements(project, it, key) ?: emptyList() + TranslationProvider.INSTANCES[it.fileType.name]?.findElements(project, it, key) ?: emptyList() } } } @@ -62,7 +62,7 @@ private object Indexer : DataIndexer { override fun map(inputData: FileContent): MutableMap { val domain = inputData.file.mcDomain ?: return mutableMapOf() - val entry = TranslationProvider.INSTANCES[inputData.fileType]?.map(domain, inputData) + val entry = TranslationProvider.INSTANCES[inputData.fileType.name]?.map(domain, inputData) ?: return mutableMapOf() return entry.translations.associateTo(mutableMapOf()) { it.key to null } } Index: src/main/kotlin/translations/index/providers.kt =================================================================== --- src/main/kotlin/translations/index/providers.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/index/providers.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -38,9 +38,11 @@ fun findElements(project: Project, file: VirtualFile, key: String): List companion object { + // Use name, using FileType as map keys can leak and cause problems with plugin unloading + // name is unique among all file types val INSTANCES = mapOf( - JsonFileType.INSTANCE to JsonTranslationProvider, - LangFileType to LangTranslationProvider, + JsonFileType.INSTANCE.name to JsonTranslationProvider, + LangFileType.name to LangTranslationProvider, ) } } @@ -79,7 +81,7 @@ } object LangTranslationProvider : TranslationProvider { - override fun map(domain: String, input: FileContent): TranslationIndexEntry? { + override fun map(domain: String, input: FileContent): TranslationIndexEntry { val translations = input.contentAsText .lineSequence() .filter { !it.startsWith("#") && it.isNotEmpty() } Index: src/main/kotlin/translations/intentions/ConvertToTranslationIntention.kt =================================================================== --- src/main/kotlin/translations/intentions/ConvertToTranslationIntention.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/intentions/ConvertToTranslationIntention.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -50,11 +50,11 @@ } override fun checkInput(inputString: String): Boolean { - return !inputString.isEmpty() && !inputString.contains('=') + return inputString.isNotEmpty() && !inputString.contains('=') } override fun canClose(inputString: String): Boolean { - return !inputString.isEmpty() && !inputString.contains('=') + return inputString.isNotEmpty() && !inputString.contains('=') } }, ) Index: src/main/kotlin/translations/lang/LangCommenter.kt =================================================================== --- src/main/kotlin/translations/lang/LangCommenter.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/lang/LangCommenter.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -13,7 +13,7 @@ import com.intellij.lang.Commenter class LangCommenter : Commenter { - override fun getLineCommentPrefix(): String? = "#" + override fun getLineCommentPrefix(): String = "#" override fun getBlockCommentPrefix(): String? = null override fun getBlockCommentSuffix(): String? = null override fun getCommentedBlockCommentPrefix(): String? = null Index: src/main/kotlin/translations/lang/formatting/LangBlock.kt =================================================================== --- src/main/kotlin/translations/lang/formatting/LangBlock.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/lang/formatting/LangBlock.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -50,7 +50,7 @@ return blocks } - override fun getIndent() = Indent.getNoneIndent() + override fun getIndent(): Indent = Indent.getNoneIndent() override fun getSpacing(child1: Block?, child2: Block) = spacingBuilder.getSpacing(this, child1, child2) Index: src/main/kotlin/translations/lang/structure/LangStructureViewFactory.kt =================================================================== --- src/main/kotlin/translations/lang/structure/LangStructureViewFactory.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/lang/structure/LangStructureViewFactory.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -17,7 +17,7 @@ import com.intellij.psi.PsiFile class LangStructureViewFactory : PsiStructureViewFactory { - override fun getStructureViewBuilder(psiFile: PsiFile): StructureViewBuilder? { + override fun getStructureViewBuilder(psiFile: PsiFile): StructureViewBuilder { return object : TreeBasedStructureViewBuilder() { override fun createStructureViewModel(editor: Editor?) = LangStructureViewModel(psiFile) } Index: src/main/kotlin/translations/reference/usages.kt =================================================================== --- src/main/kotlin/translations/reference/usages.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/reference/usages.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -42,21 +42,37 @@ } class JsonFindUsagesProvider : TranslationFindUsagesProvider() { - override fun getWordsScanner(): WordsScanner? = + override fun getWordsScanner(): WordsScanner = DefaultWordsScanner( JsonLexer(), TokenSet.create(JsonElementTypes.DOUBLE_QUOTED_STRING, JsonElementTypes.SINGLE_QUOTED_STRING), TokenSet.create(JsonElementTypes.BLOCK_COMMENT, JsonElementTypes.LINE_COMMENT), TokenSet.EMPTY, ) + + override fun equals(other: Any?): Boolean { + return this === other -} + } + override fun hashCode(): Int { + return System.identityHashCode(this) + } +} + class LangFindUsagesProvider : TranslationFindUsagesProvider() { - override fun getWordsScanner(): WordsScanner? = + override fun getWordsScanner(): WordsScanner = DefaultWordsScanner( LangLexerAdapter(), TokenSet.create(LangTypes.KEY), TokenSet.create(LangTypes.COMMENT), TokenSet.EMPTY, ) + + override fun equals(other: Any?): Boolean { + return this === other -} + } + + override fun hashCode(): Int { + return System.identityHashCode(this) + } +} Index: src/main/kotlin/translations/sorting/TranslationSorter.kt =================================================================== --- src/main/kotlin/translations/sorting/TranslationSorter.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/translations/sorting/TranslationSorter.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -20,6 +20,7 @@ import com.demonwav.mcdev.util.runWriteAction import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile +import java.util.TreeSet object TranslationSorter { private val ascendingComparator = compareBy>( @@ -51,13 +52,13 @@ Ordering.ASCENDING -> TranslationFiles.buildFileEntries( project, locale, - it.sortedWith(ascendingComparator), + it.sortedWith(ascendingComparator).asIterable(), keepComments, ) Ordering.DESCENDING -> TranslationFiles.buildFileEntries( project, locale, - it.sortedWith(descendingComparator), + it.sortedWith(descendingComparator).asIterable(), keepComments, ) Ordering.TEMPLATE -> sortByTemplate( @@ -97,12 +98,12 @@ is Comment -> yield(TranslationFiles.FileEntry.Comment(elem.text)) EmptyLine -> yield(TranslationFiles.FileEntry.EmptyLine) is Key -> { - val toWrite = tmp.asSequence().filter { elem.matcher.matches(it.key) } + val toWrite = tmp.filterTo(TreeSet(ascendingComparator)) { elem.matcher.matches(it.key) } yieldAll( TranslationFiles.buildFileEntries( project, locale, - toWrite.sortedWith(ascendingComparator), + toWrite, keepComments, ), ) @@ -116,7 +117,7 @@ TranslationFiles.buildFileEntries( project, locale, - tmp.sortedWith(ascendingComparator).asSequence(), + tmp.sortedWith(ascendingComparator), keepComments, ), ) Index: src/main/kotlin/update/PluginUpdateStatus.kt =================================================================== --- src/main/kotlin/update/PluginUpdateStatus.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/update/PluginUpdateStatus.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -26,7 +26,7 @@ } object LatestVersionInstalled : PluginUpdateStatus() { - override fun getVersionString(): String? = PluginUtil.pluginVersion + override fun getVersionString(): String = PluginUtil.pluginVersion } class Update(val pluginDescriptor: IdeaPluginDescriptor, val hostToInstallFrom: String?) : PluginUpdateStatus() { Index: src/main/kotlin/util/class-utils.kt =================================================================== --- src/main/kotlin/util/class-utils.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/util/class-utils.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -163,7 +163,7 @@ } @Throws(ClassNameResolutionFailedException::class) -fun PsiElement.getAnonymousIndex(anonymousElement: PsiElement): Int? { +fun PsiElement.getAnonymousIndex(anonymousElement: PsiElement): Int { // Attempt to find name for anonymous class for ((i, element) in anonymousElements.withIndex()) { if (element equivalentTo anonymousElement) { Index: src/main/kotlin/util/reference/PackageNameReferenceProvider.kt =================================================================== --- src/main/kotlin/util/reference/PackageNameReferenceProvider.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/util/reference/PackageNameReferenceProvider.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -137,7 +137,7 @@ private val qualifiedName: String get() { val name = qualifiedRange.substring(element.text) - return getBasePackage(element)?.let { it + '.' + name } ?: name + return getBasePackage(element)?.let { "$it.$name" } ?: name } override val unresolved: Boolean @@ -153,7 +153,7 @@ private fun getNewName(newTarget: PsiQualifiedNamedElement): String { val newName = newTarget.qualifiedName!! - return getBasePackage(element)?.let { newName.removePrefix(it + '.') } ?: newName + return getBasePackage(element)?.let { newName.removePrefix("$it.") } ?: newName } override fun bindToElement(newTarget: PsiElement): PsiElement? { Index: src/main/kotlin/util/reference/ReferenceResolver.kt =================================================================== --- src/main/kotlin/util/reference/ReferenceResolver.kt (revision c9139e6a56d8e423957c79a6c0558eda10be5529) +++ src/main/kotlin/util/reference/ReferenceResolver.kt (revision fb8a9b0a86ebb275e53a028c05d15f6195a5da7c) @@ -99,6 +99,7 @@ var current: PsiElement var parent = this + @Suppress("KotlinConstantConditions") // kotlin is wrong do { current = parent parent = current.parent