@@ -8,9 +8,7 @@ import com.intellij.ide.highlighter.JavaFileType
8
8
import com.intellij.lang.java.JavaLanguage
9
9
import com.intellij.openapi.application.runReadAction
10
10
import com.intellij.openapi.project.Project
11
- import com.intellij.psi.PsiElement
12
- import com.intellij.psi.PsiManager
13
- import com.intellij.psi.PsiPackageStatement
11
+ import com.intellij.psi.*
14
12
import com.intellij.psi.impl.file.impl.JavaFileManagerImpl
15
13
import com.intellij.psi.search.FileTypeIndex
16
14
import com.intellij.psi.search.GlobalSearchScope
@@ -55,11 +53,29 @@ class JavaCustomDevInsSymbolProvider : DevInsSymbolProvider {
55
53
56
54
packageStatements.forEach {
57
55
if (it.packageName.startsWith(text)) {
58
- val element = LookupElementBuilder .create(it.packageName).withIcon(JavaFileType .INSTANCE .icon)
56
+ val element = LookupElementBuilder .create(it.packageName)
57
+ .withIcon(JavaFileType .INSTANCE .icon)
58
+ .withTypeText(" package" )
59
59
lookupElements.add(element)
60
60
}
61
61
}
62
62
63
+ val psiShortNamesCache = PsiShortNamesCache .getInstance(project)
64
+ val classNames = psiShortNamesCache.allClassNames
65
+
66
+ classNames.forEach { className ->
67
+ if (className.startsWith(text) || text.isEmpty()) {
68
+ val psiClasses = psiShortNamesCache.getClassesByName(className, searchScope)
69
+ psiClasses.forEach { psiClass ->
70
+ val qualifiedName = psiClass.qualifiedName ? : return @forEach
71
+ val element = LookupElementBuilder .create(qualifiedName)
72
+ .withIcon(JavaFileType .INSTANCE .icon)
73
+ .withTypeText(" class" )
74
+ lookupElements.add(element)
75
+ }
76
+ }
77
+ }
78
+
63
79
return lookupElements
64
80
}
65
81
@@ -68,23 +84,23 @@ class JavaCustomDevInsSymbolProvider : DevInsSymbolProvider {
68
84
69
85
if (symbol.isEmpty()) return emptyList()
70
86
71
- // className only, like `String` not Dot
72
87
if (symbol.contains(" ." ).not ()) {
73
88
val psiClasses = PsiShortNamesCache .getInstance(project).getClassesByName(symbol, scope)
74
89
if (psiClasses.isNotEmpty()) {
75
- return psiClasses.map { it.qualifiedName!! }
90
+ return psiClasses.mapNotNull { it.qualifiedName }
76
91
}
77
92
}
78
93
79
- // for package name only, like `cc.unitmesh`
80
94
JavaFileManagerImpl (project).findPackage(symbol)?.let { pkg ->
81
- return pkg.classes.map { it.qualifiedName!! }
95
+ return pkg.classes.mapNotNull { it.qualifiedName }
82
96
}
83
97
84
- // for single class, with function name, like `cc.unitmesh.idea.provider.JavaCustomDevInsSymbolProvider`
85
98
val clazz = JavaFileManagerImpl (project).findClass(symbol, scope)
86
99
if (clazz != null ) {
87
- return clazz.methods.map { " ${clazz.qualifiedName} #${it.name} " }
100
+ val classInfo = mutableListOf (clazz.qualifiedName ? : " " )
101
+ classInfo.addAll(clazz.methods.map { " ${clazz.qualifiedName ? : " " } #${it.name} " })
102
+ classInfo.addAll(clazz.fields.map { " ${clazz.qualifiedName ? : " " } .${it.name} " })
103
+ return classInfo
88
104
}
89
105
90
106
// for lookup for method
@@ -139,6 +155,21 @@ class JavaCustomDevInsSymbolProvider : DevInsSymbolProvider {
139
155
return lookupElementWithMethodName(project, clazzName, scope, methodName)
140
156
}
141
157
158
+ // for lookup class field
159
+ val fieldSplit = symbol.split(" ." )
160
+ if (fieldSplit.size >= 2 ) {
161
+ val className = fieldSplit.dropLast(1 ).joinToString(" ." )
162
+ val fieldName = fieldSplit.last()
163
+
164
+ val psiClass = JavaFileManagerImpl (project).findClass(className, scope)
165
+ if (psiClass != null ) {
166
+ val field = psiClass.findFieldByName(fieldName, true )
167
+ if (field != null ) {
168
+ return listOf (field)
169
+ }
170
+ }
171
+ }
172
+
142
173
// may by not our format, like <package>.<class>.<method> split last
143
174
val lastDotIndex = symbol.lastIndexOf(" ." )
144
175
if (lastDotIndex != - 1 ) {
0 commit comments