Skip to content

Commit dcd383b

Browse files
committed
Prefer project scope when resolving directives and enums
1 parent 44d1482 commit dcd383b

File tree

3 files changed

+31
-27
lines changed

3 files changed

+31
-27
lines changed

src/org/jetbrains/kotlin/test/helper/completion/CommentDirectiveCompletionContributor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class CommentDirectiveCompletionProvider : CompletionProvider<CompletionParamete
5959
}
6060
}
6161

62-
private fun completeEnumValues(classes: Array<out PsiClass>, resultSet: CompletionResultSet) {
62+
private fun completeEnumValues(classes: List<PsiClass>, resultSet: CompletionResultSet) {
6363
classes.flatMap { it.fields.filterIsInstance<PsiEnumConstant>() }
6464
.mapTo(mutableSetOf()) { it.name }
6565
.forEach { resultSet.addElement(LookupElementBuilder.create(it)) }

src/org/jetbrains/kotlin/test/helper/reference/EnumValueReference.kt

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.intellij.psi.ResolveResult
1313
import com.intellij.psi.search.GlobalSearchScope
1414
import org.jetbrains.kotlin.analysis.api.analyze
1515
import org.jetbrains.kotlin.analysis.api.types.KaClassType
16+
import org.jetbrains.kotlin.asJava.classes.KtLightClass
1617
import org.jetbrains.kotlin.asJava.toLightClass
1718
import org.jetbrains.kotlin.idea.stubindex.KotlinPropertyShortNameIndex
1819
import org.jetbrains.kotlin.name.ClassId
@@ -24,7 +25,7 @@ const val LANGUAGE_FEATURE_FQ_NAME = "org.jetbrains.kotlin.config.LanguageFeatur
2425
private val VALUE_DIRECTIVE_CLASS_ID =
2526
ClassId.topLevel(FqName("org.jetbrains.kotlin.test.directives.model.ValueDirective"))
2627

27-
typealias EnumClassProvider = (Project) -> Array<out PsiClass>
28+
typealias EnumClassProvider = (Project) -> List<PsiClass>
2829

2930
class EnumValueReference(
3031
element: PsiElement,
@@ -52,26 +53,27 @@ class EnumValueReference(
5253
override fun getVariants(): Array<Any> = emptyArray()
5354
}
5455

55-
fun getLanguageFeatureClasses(project: Project): Array<out PsiClass> {
56+
fun getLanguageFeatureClasses(project: Project): List<PsiClass> {
5657
val psiFacade = JavaPsiFacade.getInstance(project)
57-
return psiFacade
58-
.findClasses(
59-
LANGUAGE_FEATURE_FQ_NAME,
60-
GlobalSearchScope.allScope(project)
61-
)
58+
59+
return resolvePreferringProjectScope(project) {
60+
psiFacade.findClasses(LANGUAGE_FEATURE_FQ_NAME, it).toList()
61+
}
6262
}
6363

64-
fun getEnumClassesByDirective(key: String, project: Project): Array<out PsiClass> {
65-
val declarations =
66-
KotlinPropertyShortNameIndex.Helper[key, project, GlobalSearchScope.allScope(project)]
64+
fun getEnumClassesByDirective(key: String, project: Project): List<KtLightClass> {
65+
return resolvePreferringProjectScope(project) {
66+
val declarations =
67+
KotlinPropertyShortNameIndex.Helper[key, project, GlobalSearchScope.allScope(project)]
6768

68-
return declarations.mapNotNull {
69-
analyze(it) {
70-
if (it.returnType.isClassType(VALUE_DIRECTIVE_CLASS_ID)) {
71-
((it.returnType as KaClassType).typeArguments.firstOrNull()?.type?.expandedSymbol?.psi as? KtClass)?.toLightClass()
72-
} else {
73-
null
69+
declarations.mapNotNull {
70+
analyze(it) {
71+
if (it.returnType.isClassType(VALUE_DIRECTIVE_CLASS_ID)) {
72+
((it.returnType as KaClassType).typeArguments.firstOrNull()?.type?.expandedSymbol?.psi as? KtClass)?.toLightClass()
73+
} else {
74+
null
75+
}
7476
}
7577
}
76-
}.toTypedArray()
78+
}
7779
}

src/org/jetbrains/kotlin/test/helper/reference/TestDirectiveReference.kt

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.jetbrains.kotlin.test.helper.reference
22

3+
import com.intellij.openapi.project.Project
34
import com.intellij.openapi.util.TextRange
45
import com.intellij.psi.PsiElement
56
import com.intellij.psi.PsiElementResolveResult
@@ -24,15 +25,11 @@ class TestDirectiveReference(
2425

2526
override fun multiResolve(incompleteCode: Boolean): Array<ResolveResult> {
2627
val project = myElement.project
27-
28-
val declarations =
29-
KotlinPropertyShortNameIndex.Helper[key, project, GlobalSearchScope.allScope(project)]
30-
31-
return declarations
32-
.filter {
33-
it.isDirective()
34-
}
35-
.map { PsiElementResolveResult(it) }.toTypedArray()
28+
return resolvePreferringProjectScope(project) {
29+
val declarations = KotlinPropertyShortNameIndex.Helper[key, project, it]
30+
declarations.filter { it.isDirective() }
31+
}.map { PsiElementResolveResult(it) }
32+
.toTypedArray()
3633
}
3734

3835
override fun resolve(): PsiElement? {
@@ -44,4 +41,9 @@ class TestDirectiveReference(
4441

4542
fun KtNamedDeclaration.isDirective(): Boolean = analyze(this) {
4643
returnType.isSubtypeOf(DIRECTIVE_CLASS_ID)
44+
}
45+
46+
fun <T : PsiElement> resolvePreferringProjectScope(project: Project, resolve: (GlobalSearchScope) -> List<T>): List<T> {
47+
return resolve(GlobalSearchScope.projectScope(project))
48+
.ifEmpty { resolve(GlobalSearchScope.allScope(project)) }
4749
}

0 commit comments

Comments
 (0)