2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.psi
.filters
.getters
;
18 import com
.intellij
.codeInsight
.CodeInsightUtil
;
19 import com
.intellij
.codeInsight
.completion
.CompletionContext
;
20 import com
.intellij
.codeInsight
.completion
.PrefixMatcher
;
21 import com
.intellij
.codeInsight
.lookup
.AutoCompletionPolicy
;
22 import com
.intellij
.codeInsight
.lookup
.LookupElement
;
23 import com
.intellij
.openapi
.diagnostic
.Logger
;
24 import com
.intellij
.openapi
.util
.Condition
;
25 import com
.intellij
.psi
.*;
26 import com
.intellij
.psi
.filters
.ContextGetter
;
27 import com
.intellij
.psi
.util
.PsiUtil
;
28 import com
.intellij
.util
.IncorrectOperationException
;
29 import org
.jetbrains
.annotations
.Nullable
;
31 import java
.util
.ArrayList
;
32 import java
.util
.List
;
34 public class ClassLiteralGetter
{
35 private static final Logger LOG
= Logger
.getInstance("com.intellij.psi.filters.getters.ClassLiteralGetter");
37 private ClassLiteralGetter() {
40 public static LookupElement
[] getClassLiterals(PsiElement context
, CompletionContext completionContext
, final PrefixMatcher matcher
, ContextGetter myBaseGetter
) {
41 final Condition
<String
> shortNameCondition
= new Condition
<String
>() {
42 public boolean value(String s
) {
43 return matcher
.prefixMatches(s
);
47 final List
<LookupElement
> result
= new ArrayList
<LookupElement
>();
48 for (final Object element
: myBaseGetter
.get(context
, completionContext
)) {
49 if (element
instanceof PsiClassType
) {
50 PsiClassType
.ClassResolveResult resolveResult
= ((PsiClassType
)element
).resolveGenerics();
51 PsiClass psiClass
= resolveResult
.getElement();
52 if (psiClass
!= null && CommonClassNames
.JAVA_LANG_CLASS
.equals(psiClass
.getQualifiedName())) {
53 final PsiTypeParameter
[] typeParameters
= psiClass
.getTypeParameters();
54 if (typeParameters
.length
== 1) {
55 PsiType substitution
= resolveResult
.getSubstitutor().substitute(typeParameters
[0]);
56 boolean addInheritors
= false;
57 if (substitution
instanceof PsiWildcardType
) {
58 final PsiWildcardType wildcardType
= (PsiWildcardType
)substitution
;
59 substitution
= wildcardType
.getBound();
60 addInheritors
= wildcardType
.isExtends();
63 final PsiClass aClass
= PsiUtil
.resolveClassInType(substitution
);
64 if (aClass
== null) continue;
66 createLookupElement(substitution
, result
, context
);
67 if (addInheritors
&& substitution
!= null && !CommonClassNames
.JAVA_LANG_OBJECT
.equals(substitution
.getCanonicalText())) {
68 for (final PsiType type
: CodeInsightUtil
.addSubtypes(substitution
, context
, true, shortNameCondition
)) {
69 createLookupElement(type
, result
, context
);
78 return result
.toArray(new LookupElement
[result
.size()]);
81 private static void createLookupElement(@Nullable final PsiType type
, final List
<LookupElement
> list
, PsiElement context
) {
82 if (type
instanceof PsiClassType
&& !((PsiClassType
)type
).hasParameters() && !(((PsiClassType
) type
).resolve() instanceof PsiTypeParameter
)) {
84 list
.add(AutoCompletionPolicy
.NEVER_AUTOCOMPLETE
.applyPolicy(new ClassLiteralLookupElement((PsiClassType
)type
, context
)));
86 catch (IncorrectOperationException e
) {