FIR IDE: fix resolving of inner type aliases

This commit is contained in:
Ilya Kirillov
2021-04-09 14:34:30 +02:00
parent 9e1bc5680d
commit babf079c31
4 changed files with 52 additions and 6 deletions
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fileClasses.JvmFileClassInfo;
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil;
import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.load.java.JvmAbi;
import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.KtClassOrObject;
@@ -174,13 +175,18 @@ public class IdeStubIndexService extends StubIndexService {
IndexUtilsKt.indexTypeAliasExpansion(stub, sink);
if (stub.isTopLevel()) {
FqName fqName = stub.getFqName();
if (fqName != null) {
FqName fqName = stub.getFqName();
if (fqName != null) {
if (stub.isTopLevel()) {
sink.occurrence(KotlinTopLevelTypeAliasFqNameIndex.getInstance().getKey(), fqName.asString());
sink.occurrence(KotlinTopLevelTypeAliasByPackageIndex.getInstance().getKey(), fqName.parent().asString());
}
}
ClassId classId = stub.getClassId();
if (classId != null && !stub.isTopLevel()) {
sink.occurrence(KotlinInnerTypeAliasClassIdIndex.getInstance().getKey(), classId.asString());
}
}
@Override
@@ -0,0 +1,34 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.stubindex
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.stubs.StringStubIndexExtension
import com.intellij.psi.stubs.StubIndex
import com.intellij.psi.stubs.StubIndexKey
import org.jetbrains.kotlin.psi.KtTypeAlias
/**
* Index of non-top-level type aliases (members of classes)
* The key is stringified [org.jetbrains.kotlin.name.ClassId] by the rules described in [org.jetbrains.kotlin.name.ClassId.asString]:
* packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry"
*/
class KotlinInnerTypeAliasClassIdIndex : StringStubIndexExtension<KtTypeAlias>() {
override fun getKey(): StubIndexKey<String, KtTypeAlias> = KEY
override fun get(s: String, project: Project, scope: GlobalSearchScope): Collection<KtTypeAlias> =
StubIndex.getElements(KEY, s, project, scope, KtTypeAlias::class.java)
companion object {
val KEY = KotlinIndexUtil.createIndexKey(KotlinInnerTypeAliasClassIdIndex::class.java)
val INSTANCE = KotlinInnerTypeAliasClassIdIndex()
@JvmStatic
fun getInstance() = INSTANCE
}
}
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
/*
* Move to another module
@@ -28,7 +29,7 @@ public class IndexHelper(val project: Project, private val scope: GlobalSearchSc
private inline fun <INDEX_KEY : Any, reified PSI : PsiElement> firstMatchingOrNull(
stubKey: StubIndexKey<INDEX_KEY, PSI>,
key: INDEX_KEY,
crossinline filter: (PSI) -> Boolean
crossinline filter: (PSI) -> Boolean = { true }
): PSI? {
var result: PSI? = null
stubIndex.processElements(
@@ -48,10 +49,14 @@ public class IndexHelper(val project: Project, private val scope: GlobalSearchSc
classId.asStringForIndexes(),
) { candidate -> candidate.containingKtFile.packageFqName == classId.packageFqName }
fun typeAliasFromIndexByClassId(classId: ClassId) = firstMatchingOrNull(
fun typeAliasFromIndexByClassId(classId: ClassId): KtTypeAlias? = firstMatchingOrNull<String, KtTypeAlias>(
KotlinTopLevelTypeAliasFqNameIndex.KEY,
classId.asStringForIndexes(),
key = classId.asStringForIndexes(),
) { candidate -> candidate.containingKtFile.packageFqName == classId.packageFqName }
?: firstMatchingOrNull<String, KtTypeAlias>(
KotlinInnerTypeAliasClassIdIndex.KEY,
key = classId.asString(),
)
fun getTopLevelProperties(callableId: CallableId): Collection<KtProperty> =
+1
View File
@@ -15,6 +15,7 @@
<stubIndex implementation="org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex"/>
<stubIndex implementation="org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelPropertyFqnNameIndex"/>
<stubIndex implementation="org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelTypeAliasFqNameIndex"/>
<stubIndex implementation="org.jetbrains.kotlin.idea.stubindex.KotlinInnerTypeAliasClassIdIndex"/>
<stubIndex implementation="org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelExtensionsByReceiverTypeIndex"/>
<stubIndex implementation="org.jetbrains.kotlin.idea.stubindex.KotlinAnnotationsIndex"/>
<stubIndex implementation="org.jetbrains.kotlin.idea.stubindex.KotlinProbablyNothingFunctionShortNameIndex"/>