override fun collect()

in src/main/kotlin/org/arend/codeInsight/hints/ArendParametersInlayProvider.kt [61:115]


            override fun collect(element: PsiElement, editor: Editor, sink: InlayHintsSink): Boolean {
                if (element !is ArendDefIdentifier) return true
                val arendDef = element.parent as? ArendDefinition<*> ?: return true
                val def = (arendDef.tcReferable as? TCDefReferable)?.typechecked ?: return true
                val levelParams = def.levelParameters
                if ((levelParams == null || levelParams.isEmpty()) && def.parametersOriginalDefinitions.isEmpty()) return true
                val builder = StringBuilder()

                if (levelParams != null && levelParams.isNotEmpty()) {
                    if (levelParams[0].type == LevelVariable.LvlType.PLVL && levelParams[0] is ParamLevelVariable && arendDef.pLevelParameters == null) {
                        builder.append(" ")
                        val ppv = PrettyPrintVisitor(builder, 0)
                        ppv.prettyPrintLevelParameters(ToAbstractVisitor.visitLevelParameters(levelParams.subList(0, def.numberOfPLevelParameters), true), true)
                    }
                    val lastVar = levelParams[levelParams.size - 1]
                    if (lastVar.type == LevelVariable.LvlType.HLVL && lastVar is ParamLevelVariable && arendDef.hLevelParameters == null) {
                        builder.append(" ")
                        val ppv = PrettyPrintVisitor(builder, 0)
                        ppv.prettyPrintLevelParameters(ToAbstractVisitor.visitLevelParameters(levelParams.subList(def.numberOfPLevelParameters, levelParams.size), false), false)
                    }
                }

                if (def.parametersOriginalDefinitions.isNotEmpty()) {
                    builder.append(" ")
                    if (settings.showTypes) {
                        val ppv = PrettyPrintVisitor(builder, 0)
                        val parameters = if (def is ClassDefinition) {
                            def.personalFields.subList(0, def.parametersOriginalDefinitions.size).map { Concrete.TelescopeParameter(null, it.referable.isExplicitField, listOf(it.referable), ToAbstractVisitor.convert(it.resultType, PrettyPrinterConfig.DEFAULT), it.isProperty) }
                        } else {
                            ToAbstractVisitor.convert(DependentLink.Helper.take(if (def.hasEnclosingClass()) def.parameters.next else def.parameters, def.parametersOriginalDefinitions.size), PrettyPrinterConfig.DEFAULT)
                        }
                        ppv.prettyPrintParameters(parameters)
                    } else {
                        val list = if (def is ClassDefinition) {
                            def.personalFields.subList(0, min(def.parametersOriginalDefinitions.size, def.personalFields.size)).map { Pair(it.referable.isExplicitField, it.name) }
                        } else {
                            DependentLink.Helper.toList(DependentLink.Helper.take(if (def.hasEnclosingClass()) def.parameters.next else def.parameters, def.parametersOriginalDefinitions.size)).map { Pair(it.isExplicit, it.name) }
                        }
                        builder.append(list.joinToString(" ") { if (it.first) it.second else "{${it.second}}" })
                    }
                }

                val str = builder.toString()
                if (str.isEmpty()) return true
                var lastElement = element
                val sibling1 = lastElement.findNextSibling()
                if (sibling1 is ArendAlias) lastElement = sibling1
                val sibling2 = lastElement.findNextSibling()
                if (sibling2 is LeafPsiElement && sibling2.elementType == NO_CLASSIFYING_KW) lastElement = sibling2
                sink.addInlineElement(lastElement.endOffset, true, MenuOnClickPresentation(factory.text(str), project) {
                    val provider = this@ArendParametersInlayProvider
                    listOf(InlayProviderDisablingAction(provider.name, file.language, project, provider.key))
                }, false)
                return true
            }