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
}
}