@@ -22,15 +22,17 @@ import com.intellij.psi.PsiClass
22
22
import com.intellij.psi.PsiJavaFile
23
23
import org.jetbrains.kotlin.descriptors.ClassDescriptor
24
24
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
25
- import org.jetbrains.kotlin.descriptors.Visibilities
26
25
import com.google.devtools.ksp.processing.impl.ResolverImpl
27
26
import com.google.devtools.ksp.symbol.*
28
27
import com.google.devtools.ksp.symbol.impl.*
28
+ import com.google.devtools.ksp.symbol.impl.binary.KSClassDeclarationDescriptorImpl
29
29
import com.google.devtools.ksp.symbol.impl.kotlin.KSExpectActualNoImpl
30
30
import com.google.devtools.ksp.symbol.impl.kotlin.KSNameImpl
31
31
import com.google.devtools.ksp.symbol.impl.kotlin.getKSTypeCached
32
32
import com.google.devtools.ksp.symbol.impl.replaceTypeArguments
33
33
import com.google.devtools.ksp.symbol.impl.toKSFunctionDeclaration
34
+ import com.intellij.psi.PsiClassType
35
+ import com.intellij.psi.PsiEnumConstant
34
36
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
35
37
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
36
38
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
@@ -59,6 +61,7 @@ class KSClassDeclarationJavaImpl private constructor(val psi: PsiClass) : KSClas
59
61
psi.isAnnotationType -> ClassKind .ANNOTATION_CLASS
60
62
psi.isInterface -> ClassKind .INTERFACE
61
63
psi.isEnum -> ClassKind .ENUM_CLASS
64
+ psi is PsiEnumConstant -> ClassKind .ENUM_ENTRY
62
65
else -> ClassKind .CLASS
63
66
}
64
67
}
@@ -96,8 +99,23 @@ class KSClassDeclarationJavaImpl private constructor(val psi: PsiClass) : KSClas
96
99
}
97
100
98
101
override val declarations: List <KSDeclaration > by lazy {
99
- (psi.fields.map { KSPropertyDeclarationJavaImpl .getCached(it) } +
100
- psi.innerClasses.map { KSClassDeclarationJavaImpl .getCached(it) } +
102
+ // field declarations might be enum entries so we need to check their type before wrapping
103
+ // them as property declarations
104
+ val fieldDeclarations = psi.fields.map { field ->
105
+ if (field is PsiEnumConstant ) {
106
+ // PsiEnumConstant does not have a PsiClass that would let us create a
107
+ // KSClassDeclarationJavaImpl instance. Instead, we'll fallback to the descriptor
108
+ // implementation.
109
+ val descriptor = ResolverImpl .instance.resolveJavaDeclaration(field)
110
+ // if we can resolve it to a class descriptor, use that instead
111
+ if (descriptor is ClassDescriptor ) {
112
+ return @map KSClassDeclarationDescriptorImpl .getCached(descriptor)
113
+ }
114
+ }
115
+ KSPropertyDeclarationJavaImpl .getCached(field)
116
+ }
117
+ (fieldDeclarations +
118
+ psi.innerClasses.map { getCached(it) } +
101
119
psi.constructors.map { KSFunctionDeclarationJavaImpl .getCached(it) } +
102
120
psi.methods.map { KSFunctionDeclarationJavaImpl .getCached(it) })
103
121
.distinct()
0 commit comments