Skip to content

Commit aa52b28

Browse files
Suggest named classes instead of anonymous nested ones (#2003)
* ClassNotFound exception for an anonymous class #1025 Select a single "outer" method in the dialog if caret stays inside anonymous class scope
1 parent a0e145f commit aa52b28

File tree

1 file changed

+12
-2
lines changed
  • utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/language

1 file changed

+12
-2
lines changed

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/language/JavaLanguage.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ object JvmLanguageAssistant : LanguageAssistant() {
6464
val psiElementHandler = PsiElementHandler.makePsiElementHandler(file)
6565

6666
if (psiElementHandler.isCreateTestActionAvailable(element)) {
67-
val srcClass = psiElementHandler.containingClass(element) ?: return null
67+
val srcClass = psiElementHandler.identifiedContainingClass(element) ?: return null
6868
val srcSourceRoot = srcClass.getSourceRoot() ?: return null
6969
val srcMembers = srcClass.extractFirstLevelMembers(false)
7070
val focusedMethod = focusedMethodOrNull(element, srcMembers, psiElementHandler)
@@ -94,7 +94,7 @@ object JvmLanguageAssistant : LanguageAssistant() {
9494
val psiElementHandler = PsiElementHandler.makePsiElementHandler(file)
9595

9696
if (psiElementHandler.isCreateTestActionAvailable(element)) {
97-
psiElementHandler.containingClass(element)?.let {
97+
psiElementHandler.identifiedContainingClass(element)?.let {
9898
srcClasses += setOf(it)
9999
extractMembersFromSrcClasses = true
100100
val memberInfoList = runReadAction<List<MemberInfo>> {
@@ -148,6 +148,11 @@ object JvmLanguageAssistant : LanguageAssistant() {
148148
return null
149149
}
150150

151+
private fun PsiElementHandler.identifiedContainingClass(element: PsiElement): PsiClass? {
152+
val clazz = containingClass(element)
153+
return if (clazz is PsiAnonymousClass) PsiTreeUtil.getParentOfType(clazz, PsiClass::class.java) else clazz
154+
}
155+
151156
/**
152157
* Validates that a set of source classes matches some requirements from [isInvalid].
153158
* If no one of them matches, shows a warning about the first mismatch reason.
@@ -207,8 +212,13 @@ object JvmLanguageAssistant : LanguageAssistant() {
207212
// Thus, make transition to the Psi if it is required.
208213
val currentMethod = PsiTreeUtil.getParentOfType(element, psiElementHandler.methodClass)
209214
?.let { psiElementHandler.toPsi(it, PsiMethod::class.java) }
215+
// For anonymous class, we cannot select the nearest parent method directly.
216+
// So, we have to suggest the nearest "outer" method from the named class.
217+
val topmostCurrentMethod = PsiTreeUtil.getTopmostParentOfType(element, psiElementHandler.methodClass)
218+
?.let { psiElementHandler.toPsi(it, PsiMethod::class.java) }
210219

211220
return methods.singleOrNull { it.member == currentMethod }
221+
?: methods.singleOrNull { it.member == topmostCurrentMethod }
212222
}
213223

214224
private fun getAllClasses(directory: PsiDirectory): Set<PsiClass> {

0 commit comments

Comments
 (0)