override fun resolve()

in src/main/kotlin/org/arend/resolving/ArendReference.kt [52:102]


    override fun resolve(): PsiElement? {
        val cache = element.project.service<ArendResolveCache>()
        val resolver = {
            if (beforeImportDot) {
                val refName = element.referenceName
                var result: Referable? = null
                for (ref in element.scope.getElements(refKind)) {
                    val name = if (ref is ModuleReferable) ref.path.lastName else ref.refName
                    if (name == refName) {
                        result = ref
                        if (ref !is PsiModuleReferable || ref.modules.firstOrNull() is PsiDirectory) {
                            break
                        }
                    }
                }
                result
            } else {
                val expr = element.ancestor<ArendExpr>()
                val def = expr?.ancestor<PsiConcreteReferable>()
                when {
                    def != null -> {
                        val project = def.project
                        PsiConcreteProvider(project, DummyErrorReporter.INSTANCE, null, true, ArendResolverListener(cache)).getConcrete(def)
                        cache.getCached(element)
                    }
                    expr != null -> {
                        ConcreteBuilder.convertExpression(expr).accept(ExpressionResolveNameVisitor(ArendReferableConverter, CachingScope.make(element.scope), ArrayList<Referable>(), DummyErrorReporter.INSTANCE, ArendResolverListener(cache)), null)
                        cache.getCached(element) ?: element.scope.resolveName(element.referenceName, refKind)
                    }
                    else -> element.scope.resolveName(element.referenceName, refKind)
                }
            }
        }

        val ref = cache.resolveCached(resolver, element)?.underlyingReferable
        if (element.containingFile.isArendScratch) {
            return checkScratchRef(ref)
        }
        return when (ref) {
            is PsiElement -> ref
            is PsiModuleReferable -> ref.modules.firstOrNull()
            is ModuleReferable -> {
                if (ref.path == Prelude.MODULE_PATH) {
                    element.project.service<TypeCheckingService>().prelude
                } else {
                    (element.containingFile as? ArendFile)?.arendLibrary?.config?.forAvailableConfigs { it.findArendFileOrDirectory(ref.path, withAdditional = true, withTests = true) }
                }
            }
            else -> null
        }
    }