override fun resolveReference()

in src/main/kotlin/org/arend/highlight/ArendHighlightingPass.kt [85:129]


            override fun resolveReference(data: Any?, referent: Referable?, list: List<ArendReferenceElement>, resolvedRefs: List<Referable?>) {
                val lastReference = list.lastOrNull() ?: return
                if (data !is ArendPattern && (lastReference is ArendRefIdentifier || lastReference is ArendDefIdentifier)) {
                    when {
                        referent is GlobalReferable && referent.precedence.isInfix ->
                            addHighlightInfo(lastReference.textRange, ArendHighlightingColors.OPERATORS)
                        (((referent as? RedirectingReferable)?.originalReferable ?: referent) as? MetaReferable)?.resolver != null ->
                            addHighlightInfo(lastReference.textRange, ArendHighlightingColors.META_RESOLVER)
                    }
                }

                var index = 0
                while (index < resolvedRefs.size - 1 && resolvedRefs[index] !is ErrorReference) {
                    index++
                }

                if (index > 0) {
                    val last = list[index]
                    val textRange = if (last is ArendIPName) {
                        last.parentLiteral?.let { literal ->
                            literal.longName?.let { longName ->
                                TextRange(longName.textRange.startOffset, (literal.dot ?: longName).textRange.endOffset)
                            }
                        }
                    } else {
                        (last.parent as? ArendLongName)?.let { longName ->
                            last.extendLeft.prevSibling?.let { nextToLast ->
                                TextRange(longName.textRange.startOffset, nextToLast.textRange.endOffset)
                            }
                        }
                    }

                    if (textRange != null) {
                        addHighlightInfo(textRange, ArendHighlightingColors.LONG_NAME)
                    }
                }

                if (data is ArendPattern && (referent as? GlobalReferable?)?.kind == GlobalReferable.Kind.CONSTRUCTOR) {
                    addHighlightInfo(data.textRange, ArendHighlightingColors.CONSTRUCTOR_PATTERN)
                }

                if (lastReference.containingFile.isArendScratch && lastReference.resolve == null) {
                    (data as? PsiElement?)?.textRange?.let { addHighlightInfo(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(it).descriptionAndTooltip("The resolved element is located outside the current scope")) }
                }
            }