Skip to content

Commit e416950

Browse files
committed
Fix double-nested anonymous class resolving. Closes #2491
1 parent f6b51c9 commit e416950

4 files changed

Lines changed: 25 additions & 21 deletions

File tree

src/main/kotlin/platform/mcp/at/completion/AtCompletionContributor.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import com.demonwav.mcdev.platform.mcp.at.gen.psi.AtEntry
2828
import com.demonwav.mcdev.platform.mcp.at.gen.psi.AtFieldName
2929
import com.demonwav.mcdev.platform.mcp.at.gen.psi.AtFunction
3030
import com.demonwav.mcdev.platform.mcp.at.gen.psi.AtTypes
31-
import com.demonwav.mcdev.util.anonymousElements
31+
import com.demonwav.mcdev.util.anonymousClasses
3232
import com.demonwav.mcdev.util.fullQualifiedName
3333
import com.demonwav.mcdev.util.getSimilarity
3434
import com.demonwav.mcdev.util.localClasses
@@ -147,9 +147,7 @@ class AtCompletionContributor : CompletionContributor() {
147147
)
148148
}
149149

150-
for (anonymousElement in currentClass.anonymousElements) {
151-
val anonClass = anonymousElement as? PsiClass ?: continue
152-
150+
for (anonClass in currentClass.anonymousClasses) {
153151
val name = anonClass.fullQualifiedName ?: continue
154152
result.addElement(
155153
PrioritizedLookupElement.withPriority(

src/main/kotlin/platform/mixin/util/AsmUtil.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ package com.demonwav.mcdev.platform.mixin.util
2222

2323
import com.demonwav.mcdev.platform.mixin.reference.MixinSelector
2424
import com.demonwav.mcdev.util.MemberReference
25-
import com.demonwav.mcdev.util.anonymousElements
25+
import com.demonwav.mcdev.util.anonymousClasses
2626
import com.demonwav.mcdev.util.cached
2727
import com.demonwav.mcdev.util.childrenOfType
2828
import com.demonwav.mcdev.util.findField
@@ -395,7 +395,7 @@ private fun ClassNode.constructClass(project: Project, body: String): PsiClass?
395395
// find innermost PsiClass
396396
while (true) {
397397
clazz = clazz.innerClasses.firstOrNull()
398-
?: clazz.anonymousElements.lastOrNull { it !== clazz && it is PsiClass } as? PsiClass
398+
?: clazz.anonymousClasses.lastOrNull()
399399
?: clazz.localClasses.lastOrNull()
400400
?: break
401401
}

src/main/kotlin/util/class-utils.kt

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ package com.demonwav.mcdev.util
2222

2323
import com.demonwav.mcdev.platform.mixin.handlers.desugar.DesugarUtil
2424
import com.intellij.codeInsight.daemon.impl.quickfix.AddMethodFix
25-
import com.intellij.navigation.AnonymousElementProvider
2625
import com.intellij.openapi.project.Project
2726
import com.intellij.psi.CommonClassNames
2827
import com.intellij.psi.JavaPsiFacade
28+
import com.intellij.psi.JavaRecursiveElementVisitor
2929
import com.intellij.psi.JavaRecursiveElementWalkingVisitor
3030
import com.intellij.psi.PsiAnonymousClass
3131
import com.intellij.psi.PsiClass
@@ -153,7 +153,7 @@ fun findQualifiedClass(
153153
return outerResolver(fullQualifiedName)
154154
}
155155

156-
var currentClass = outerResolver(fullQualifiedName.substring(0, innerPos)) ?: return null
156+
var currentClass = outerResolver(fullQualifiedName.take(innerPos)) ?: return null
157157
var outerPos: Int
158158

159159
while (true) {
@@ -183,8 +183,8 @@ private fun PsiClass.findInnerClass(name: String): PsiClass? {
183183
null
184184
}
185185
} else {
186-
if (innerIndex > 0 && innerIndex <= anonymousElements.size) {
187-
anonymousElements[innerIndex - 1] as PsiClass
186+
if (innerIndex > 0 && innerIndex <= anonymousClasses.size) {
187+
anonymousClasses[innerIndex - 1]
188188
} else {
189189
null
190190
}
@@ -194,9 +194,9 @@ private fun PsiClass.findInnerClass(name: String): PsiClass? {
194194

195195
@Throws(ClassNameResolutionFailedException::class)
196196
@PublishedApi
197-
internal fun PsiElement.getAnonymousIndex(anonymousElement: PsiElement): Int {
197+
internal fun PsiClass.getAnonymousIndex(anonymousElement: PsiElement): Int {
198198
// Attempt to find name for anonymous class
199-
for ((i, element) in anonymousElements.withIndex()) {
199+
for ((i, element) in anonymousClasses.withIndex()) {
200200
if (element equivalentTo anonymousElement) {
201201
return i + 1
202202
}
@@ -205,16 +205,22 @@ internal fun PsiElement.getAnonymousIndex(anonymousElement: PsiElement): Int {
205205
throw ClassNameResolutionFailedException("Failed to determine anonymous class for $anonymousElement")
206206
}
207207

208-
val PsiElement.anonymousElements: Array<PsiElement>
208+
val PsiClass.anonymousClasses: List<PsiAnonymousClass>
209209
get() {
210-
for (provider in AnonymousElementProvider.EP_NAME.extensionList) {
211-
val elements = provider.getAnonymousElements(this)
212-
if (elements.isNotEmpty()) {
213-
return elements
210+
val list = mutableListOf<PsiAnonymousClass>()
211+
212+
acceptChildren(object : JavaRecursiveElementVisitor() {
213+
override fun visitClass(aClass: PsiClass) {
214+
// skip inner classes
214215
}
215-
}
216216

217-
return emptyArray()
217+
override fun visitAnonymousClass(aClass: PsiAnonymousClass) {
218+
aClass.argumentList?.accept(this)
219+
list += aClass
220+
}
221+
})
222+
223+
return list
218224
}
219225

220226
@Throws(ClassNameResolutionFailedException::class)

src/test/kotlin/util/OuterClassTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ abstract class OuterClassTest : ProjectBuilderTest() {
6868
).toPsiFile<PsiJavaFile>().classes.single()
6969
}
7070

71-
this.outerAnonymousClass = outerClass.anonymousElements.single() as PsiAnonymousClass
71+
this.outerAnonymousClass = outerClass.anonymousClasses.single()
7272

7373
this.innerClass = outerClass.innerClasses.first()
74-
this.innerAnonymousClass = innerClass.anonymousElements.single() as PsiAnonymousClass
74+
this.innerAnonymousClass = innerClass.anonymousClasses.single()
7575
this.innerAnonymousInnerClass = innerAnonymousClass.innerClasses.single()
7676

7777
this.selfReferencingGeneric = outerClass.innerClasses[1]

0 commit comments

Comments
 (0)