@@ -46,6 +46,7 @@ import com.intellij.util.ObjectUtils
46
46
import com.intellij.util.containers.ContainerUtil
47
47
import com.intellij.util.containers.ContainerUtilRt
48
48
import com.intellij.util.containers.JBIterable
49
+ import com.intellij.util.containers.JBTreeTraverser
49
50
import org.intellij.clojure.ClojureConstants
50
51
import org.intellij.clojure.psi.impl.ClojureDefinitionService
51
52
import org.intellij.clojure.util.EachNth
@@ -142,30 +143,49 @@ abstract class JavaHelper {
142
143
override fun findPackage (packageName : String? , withClass : String? ): NavigatablePsiElement ? =
143
144
myFacade.findPackage(packageName!! ) as ? NavigatablePsiElement ? : asm.findPackage(packageName, withClass)
144
145
146
+ internal fun superclasses (className : String? ) = JBTreeTraverser <PsiClass > { o ->
147
+ JBIterable .of(o.superClass).append(o.interfaces)
148
+ }
149
+ .withRoot(findClass(className) as ? PsiClass )
150
+ .unique()
151
+ .traverse()
152
+
153
+
145
154
override fun findClassMethods (className : String? ,
146
155
scope : Scope ,
147
156
name : String? ,
148
157
paramCount : Int ,
149
- vararg paramTypes : String ): List <NavigatablePsiElement > {
150
- val aClass = findClass(className) as ? PsiClass ? : return asm.findClassMethods(className, scope, name, paramCount, * paramTypes)
151
- val methods = if (scope == Scope .INIT ) aClass.constructors.jbIt()
152
- else JBIterable .generate(aClass) { it.superClass }.flatMap { it!! .methods.jbIt() }
153
- return methods.map { o ->
154
- if (acceptsName(name, o.name) &&
155
- acceptsMethod(o, scope == Scope .STATIC ) &&
156
- acceptsMethod(myElementFactory, o, paramCount, * paramTypes)) o else null
157
- }.notNulls().toList()
158
- }
158
+ vararg paramTypes : String ): List <NavigatablePsiElement > =
159
+ if (findClass(className) !is PsiClass ) {
160
+ asm.findClassMethods(className, scope, name, paramCount, * paramTypes)
161
+ }
162
+ else {
163
+ superclasses(className)
164
+ .flatten {
165
+ if (scope == Scope .INIT ) it.constructors.jbIt() else it.methods.jbIt()
166
+ }
167
+ .filter {
168
+ acceptsName(name, it.name) &&
169
+ acceptsMethod(it, scope == Scope .STATIC ) &&
170
+ acceptsMethod(myElementFactory, it, paramCount, * paramTypes)
171
+ }
172
+ .notNulls()
173
+ .toList()
174
+ }
159
175
160
- override fun findClassFields (className : String? , scope : Scope , name : String? ): List <NavigatablePsiElement > {
161
- val aClass = findClass(className) as ? PsiClass ? : return asm.findClassFields(className, scope, name)
162
- val fields = JBIterable .generate(aClass) { it.superClass }.flatMap { it!! .fields.jbIt() }
163
- return fields.map { o ->
164
- if (acceptsName(name, o.name) &&
165
- acceptsMethod(o, scope == Scope .STATIC )) o
166
- else null
167
- }.notNulls().toList()
168
- }
176
+ override fun findClassFields (className : String? , scope : Scope , name : String? ): List <NavigatablePsiElement > =
177
+ if (findClass(className) !is PsiClass ) {
178
+ asm.findClassFields(className, scope, name)
179
+ }
180
+ else superclasses(className)
181
+ .flatten {
182
+ it.fields.jbIt()
183
+ }
184
+ .filter {
185
+ acceptsName(name, it.name) &&
186
+ acceptsMethod(it, scope == Scope .STATIC )
187
+ }
188
+ .notNulls().toList()
169
189
170
190
override fun getSuperClassName (className : String? ): String? {
171
191
val aClass = findClass(className) as ? PsiClass ? : return asm.getSuperClassName(className)
@@ -309,8 +329,15 @@ abstract class JavaHelper {
309
329
internal fun cached (id : String , info : Any ) =
310
330
map[id] ? : ConcurrencyUtil .cacheOrGet(map, id, MyElement (project, info))
311
331
312
- internal fun superclasses (name : String? ) = JBIterable .generate(findClass(name)) {
313
- findClass((it?.delegate as ? ClassInfo )?.superClass)}.notNulls()
332
+ internal fun superclasses (name : String? ) = JBTreeTraverser <MyElement <* >> { o ->
333
+ JBIterable .of((o.delegate as ? ClassInfo )?.superClass)
334
+ .append((o.delegate as ? ClassInfo )?.interfaces)
335
+ .map(this @AsmHelper::findClass)
336
+ .notNulls()
337
+ }
338
+ .withRoot(findClass(name))
339
+ .unique()
340
+ .traverse()
314
341
315
342
override fun findClassMethods (className : String? ,
316
343
scope : Scope ,
0 commit comments