1212import java .util .Map ;
1313import java .util .function .Function ;
1414import java .util .stream .Stream ;
15+ import javax .swing .Icon ;
1516
1617import com .intellij .codeInsight .AnnotationUtil ;
1718import com .intellij .codeInsight .lookup .LookupElement ;
2122import com .intellij .openapi .roots .ProjectRootManager ;
2223import com .intellij .openapi .util .Pair ;
2324import com .intellij .psi .CommonClassNames ;
25+ import com .intellij .psi .EmptySubstitutor ;
2426import com .intellij .psi .JavaPsiFacade ;
2527import com .intellij .psi .PsiArrayType ;
2628import com .intellij .psi .PsiClass ;
2729import com .intellij .psi .PsiClassType ;
2830import com .intellij .psi .PsiElement ;
31+ import com .intellij .psi .PsiEnumConstant ;
2932import com .intellij .psi .PsiField ;
3033import com .intellij .psi .PsiFile ;
3134import com .intellij .psi .PsiMethod ;
@@ -109,7 +112,8 @@ public static LookupElement[] asLookup(Map<String, Pair<? extends PsiElement, Ps
109112 lookupElements [index ++] = asLookup (
110113 propertyName ,
111114 pair ,
112- typeMapper
115+ typeMapper ,
116+ PlatformIcons .VARIABLE_ICON
113117 );
114118 }
115119 return lookupElements ;
@@ -120,13 +124,29 @@ public static LookupElement[] asLookup(Map<String, Pair<? extends PsiElement, Ps
120124
121125 }
122126
127+ public static LookupElement asLookup (PsiParameter parameter ) {
128+ return asLookup ( parameter .getName (), parameter , PsiParameter ::getType , PlatformIcons .PARAMETER_ICON );
129+ }
130+
131+ public static LookupElement asLookup (PsiEnumConstant enumConstant ) {
132+ return asLookup ( enumConstant .getName (), enumConstant , PsiField ::getType , PlatformIcons .FIELD_ICON );
133+ }
134+
135+ public static <T extends PsiElement > LookupElement asLookup (String propertyName , @ NotNull T psiElement ,
136+ Function <T , PsiType > typeMapper , Icon icon ) {
137+ //noinspection unchecked
138+ return asLookup ( propertyName , Pair .pair ( psiElement , EmptySubstitutor .getInstance () ),
139+ (Function <PsiElement , PsiType >) typeMapper , icon
140+ );
141+ }
142+
123143 public static LookupElement asLookup (String propertyName , @ NotNull Pair <? extends PsiElement , PsiSubstitutor > pair ,
124- Function <PsiElement , PsiType > typeMapper ) {
144+ Function <PsiElement , PsiType > typeMapper , Icon icon ) {
125145 PsiElement member = pair .getFirst ();
126146 PsiSubstitutor substitutor = pair .getSecond ();
127147
128148 LookupElementBuilder builder = LookupElementBuilder .create ( member , propertyName )
129- .withIcon ( PlatformIcons . VARIABLE_ICON )
149+ .withIcon ( icon )
130150 .withPresentableText ( propertyName )
131151 .withTailText ( formatTailText ( member , substitutor ) );
132152 final PsiType type = typeMapper .apply ( member );
@@ -138,20 +158,23 @@ public static LookupElement asLookup(String propertyName, @NotNull Pair<? extend
138158 }
139159
140160 private static String formatTailText (PsiElement member , PsiSubstitutor substitutor ) {
161+ String tailText ;
141162 if ( member instanceof PsiMethod ) {
142- return PsiFormatUtil .formatMethod (
163+ tailText = PsiFormatUtil .formatMethod (
143164 (PsiMethod ) member ,
144165 substitutor ,
145166 0 ,
146167 PsiFormatUtilBase .SHOW_NAME | PsiFormatUtilBase .SHOW_TYPE
147168 );
148169 }
149170 else if ( member instanceof PsiVariable ) {
150- return PsiFormatUtil .formatVariable ( (PsiVariable ) member , 0 , substitutor );
171+ tailText = PsiFormatUtil .formatVariable ( (PsiVariable ) member , 0 , substitutor );
151172 }
152173 else {
153- return "" ;
174+ tailText = "" ;
154175 }
176+
177+ return !tailText .isEmpty () ? tailText : null ;
155178 }
156179
157180 public static boolean isPublic (@ NotNull PsiMethod method ) {
0 commit comments