override fun invoke()

in gdscript/src/main/kotlin/gdscript/action/GdAddTraitAction.kt [31:73]


    override fun invoke(project: Project, editor: Editor, file: PsiFile) {
        if (!EditorModificationUtil.checkModificationAllowed(editor)) return

        val consumer = Consumer { it: GdTraitClass ->
            WriteCommandAction.writeCommandAction(project, file).run<Exception> {
                val traitFile = GdFileResIndex.getFiles(it.resource, project).firstOrNull() ?: return@run

                val titleLine = "${GdTraitLineMarkerContributor.PREFIX}${it.resource.substring("res://".length)}"
                val builder = StringBuilder()
                builder.appendLine(titleLine)
                builder.append(traitFile.getPsiFile(project)?.text?.replace("extends .+\n*".toRegex(), ""))
                builder.appendLine()
                builder.append(GdTraitLineMarkerContributor.SUFFIX)

                EditorModificationUtil.insertStringAtCaret(editor, builder.toString())
                PsiDocumentManager.getInstance(project).commitDocument(editor.document)

                editor.foldingModel.runBatchFoldingOperation {
                    val foldingManager = CodeFoldingManager.getInstance(project)
                    foldingManager.updateFoldRegions(editor)
                    editor.foldingModel.allFoldRegions.find {
                        val element = EditorFoldingInfo.get(editor).getPsiElement(it)
                        element is PsiComment && element.text == titleLine
                    }?.let {
                        it.isExpanded = false
                    }
                }
            }
        }

        JBPopupFactory.getInstance()
            .createPopupChooserBuilder(ArrayList(
                GdFileUtil.listTraits(project).map {
                    GdTraitClass(it.nameWithoutExtension, it.resourcePath())
                }
            ))
            .setRenderer(GdCellRenderer)
            .setTitle(GdScriptBundle.message("action.select.trait.class"))
            .setItemChosenCallback(consumer)
            .setNamerForFiltering { o: GdTraitClass -> o.name }
            .createPopup()
            .showInBestPositionFor(editor)
    }