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
}