@@ -8,7 +8,9 @@ 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.*
11
+ import com.intellij.psi.PsiElement
12
+ import com.intellij.psi.PsiManager
13
+ import com.intellij.psi.PsiPackageStatement
12
14
import com.intellij.psi.impl.file.impl.JavaFileManagerImpl
13
15
import com.intellij.psi.search.FileTypeIndex
14
16
import com.intellij.psi.search.GlobalSearchScope
@@ -38,25 +40,38 @@ class JavaCustomDevInsSymbolProvider : DevInsSymbolProvider {
38
40
): List <LookupElement > {
39
41
val lookupElements: MutableList <LookupElement > = SmartList ()
40
42
val searchScope = ProjectScope .getProjectScope(project)
43
+ val javaFiles = FileTypeIndex .getFiles(JavaFileType .INSTANCE , searchScope)
44
+ if (javaFiles.isEmpty()) return lookupElements
41
45
42
46
val prefixMatcher = CompletionUtil .findReferenceOrAlphanumericPrefix(parameters)
43
47
result.withPrefixMatcher(prefixMatcher)
44
48
45
49
val text = parameters.position.text.removePrefix(CompletionUtilCore .DUMMY_IDENTIFIER_TRIMMED )
46
50
51
+ val packageStatements = javaFiles.mapNotNull {
52
+ val psi = PsiManager .getInstance(project).findFile(it) ? : return @mapNotNull null
53
+ PsiTreeUtil .getChildrenOfTypeAsList(psi, PsiPackageStatement ::class .java).firstOrNull()
54
+ }
55
+
56
+ packageStatements.forEach {
57
+ if (it.packageName.startsWith(text)) {
58
+ val element = LookupElementBuilder .create(it.packageName)
59
+ .withIcon(JavaFileType .INSTANCE .icon)
60
+ .withTypeText(" package" )
61
+ lookupElements.add(element)
62
+ }
63
+ }
64
+
47
65
val psiShortNamesCache = PsiShortNamesCache .getInstance(project)
48
66
val classNames = psiShortNamesCache.allClassNames
49
-
50
67
classNames.forEach { className ->
51
- if (className.startsWith(text) || text.isEmpty()) {
52
- val psiClasses = psiShortNamesCache.getClassesByName(className, searchScope)
53
- psiClasses.forEach { psiClass ->
54
- val qualifiedName = psiClass.qualifiedName ? : return @forEach
55
- val element = LookupElementBuilder .create(qualifiedName)
56
- .withIcon(JavaFileType .INSTANCE .icon)
57
- .withTypeText(" class" )
58
- lookupElements.add(element)
59
- }
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)
60
75
}
61
76
}
62
77
@@ -72,28 +87,19 @@ class JavaCustomDevInsSymbolProvider : DevInsSymbolProvider {
72
87
if (symbol.contains(" ." ).not ()) {
73
88
val psiClasses = PsiShortNamesCache .getInstance(project).getClassesByName(symbol, scope)
74
89
if (psiClasses.isNotEmpty()) {
75
- return psiClasses.mapNotNull { it.qualifiedName }
90
+ return psiClasses.map { it.qualifiedName!! }
76
91
}
77
92
}
78
93
79
94
// for package name only, like `cc.unitmesh`
80
95
JavaFileManagerImpl (project).findPackage(symbol)?.let { pkg ->
81
- return pkg.classes.mapNotNull { it.qualifiedName }
96
+ return pkg.classes.map { it.qualifiedName!! }
82
97
}
83
98
84
99
// for single class, with function name, like `cc.unitmesh.idea.provider.JavaCustomDevInsSymbolProvider`
85
100
val clazz = JavaFileManagerImpl (project).findClass(symbol, scope)
86
101
if (clazz != null ) {
87
- // Return class details if no specific method is requested
88
- val classInfo = mutableListOf (clazz.qualifiedName ? : " " )
89
-
90
- // Add methods information
91
- classInfo.addAll(clazz.methods.map { " ${clazz.qualifiedName ? : " " } #${it.name} " })
92
-
93
- // Add field information
94
- classInfo.addAll(clazz.fields.map { " ${clazz.qualifiedName ? : " " } .${it.name} " })
95
-
96
- return classInfo
102
+ return clazz.methods.map { " ${clazz.qualifiedName} #${it.name} " }
97
103
}
98
104
99
105
// for lookup for method
@@ -148,21 +154,6 @@ class JavaCustomDevInsSymbolProvider : DevInsSymbolProvider {
148
154
return lookupElementWithMethodName(project, clazzName, scope, methodName)
149
155
}
150
156
151
- // for lookup class field
152
- val fieldSplit = symbol.split(" ." )
153
- if (fieldSplit.size >= 2 ) {
154
- val className = fieldSplit.dropLast(1 ).joinToString(" ." )
155
- val fieldName = fieldSplit.last()
156
-
157
- val psiClass = JavaFileManagerImpl (project).findClass(className, scope)
158
- if (psiClass != null ) {
159
- val field = psiClass.findFieldByName(fieldName, true )
160
- if (field != null ) {
161
- return listOf (field)
162
- }
163
- }
164
- }
165
-
166
157
// may by not our format, like <package>.<class>.<method> split last
167
158
val lastDotIndex = symbol.lastIndexOf(" ." )
168
159
if (lastDotIndex != - 1 ) {
@@ -174,6 +165,7 @@ class JavaCustomDevInsSymbolProvider : DevInsSymbolProvider {
174
165
return emptyList()
175
166
}
176
167
168
+
177
169
private fun lookupWithMethodName (
178
170
project : Project ,
179
171
clazzName : String ,
0 commit comments