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
.impl
.source
;
18 import com
.intellij
.openapi
.util
.Comparing
;
19 import com
.intellij
.pom
.java
.LanguageLevel
;
20 import com
.intellij
.psi
.*;
21 import com
.intellij
.psi
.impl
.light
.LightClassReference
;
22 import com
.intellij
.psi
.search
.GlobalSearchScope
;
23 import com
.intellij
.psi
.util
.PsiTreeUtil
;
24 import com
.intellij
.psi
.util
.PsiUtil
;
25 import org
.jetbrains
.annotations
.NotNull
;
30 public class PsiClassReferenceType
extends PsiClassType
{
31 private final PsiJavaCodeReferenceElement myReference
;
33 public PsiClassReferenceType(@NotNull PsiJavaCodeReferenceElement reference
, LanguageLevel languageLevel
) {
34 super(languageLevel
, extractAnnosFromReference(reference
));
35 myReference
= reference
;
38 private static PsiAnnotation
[] extractAnnosFromReference(PsiJavaCodeReferenceElement reference
) {
39 PsiAnnotation
[] annotations
= PsiTreeUtil
.getChildrenOfType(reference
, PsiAnnotation
.class);
40 return annotations
== null ? PsiAnnotation
.EMPTY_ARRAY
: annotations
;
43 public PsiClassReferenceType(@NotNull PsiJavaCodeReferenceElement reference
, LanguageLevel languageLevel
, PsiAnnotation
[] annotations
) {
44 super(languageLevel
,annotations
);
45 myReference
= reference
;
48 public boolean isValid() {
49 return myReference
.isValid();
52 public boolean equalsToText(String text
) {
53 return Comparing
.equal(text
, getCanonicalText());
57 public GlobalSearchScope
getResolveScope() {
58 return myReference
.getResolveScope();
62 public LanguageLevel
getLanguageLevel() {
63 if (myLanguageLevel
!= null) return myLanguageLevel
;
64 return PsiUtil
.getLanguageLevel(myReference
);
67 public PsiClassType
setLanguageLevel(final LanguageLevel languageLevel
) {
68 if (languageLevel
.equals(myLanguageLevel
)) return this;
69 return new PsiClassReferenceType(myReference
,languageLevel
,getAnnotations());
72 public PsiClass
resolve() {
73 return resolveGenerics().getElement();
76 private static class DelegatingClassResolveResult
implements ClassResolveResult
{
77 private final JavaResolveResult myDelegate
;
79 private DelegatingClassResolveResult(JavaResolveResult delegate
) {
80 myDelegate
= delegate
;
83 public PsiSubstitutor
getSubstitutor() {
84 return myDelegate
.getSubstitutor();
87 public boolean isValidResult() {
88 return myDelegate
.isValidResult();
91 public boolean isAccessible() {
92 return myDelegate
.isAccessible();
95 public boolean isStaticsScopeCorrect() {
96 return myDelegate
.isStaticsScopeCorrect();
99 public PsiElement
getCurrentFileResolveScope() {
100 return myDelegate
.getCurrentFileResolveScope();
103 public boolean isPackagePrefixPackageReference() {
104 return myDelegate
.isPackagePrefixPackageReference();
107 public PsiClass
getElement() {
108 final PsiElement element
= myDelegate
.getElement();
109 return element
instanceof PsiClass ?
(PsiClass
)element
: null;
114 public ClassResolveResult
resolveGenerics() {
115 final JavaResolveResult result
= myReference
.advancedResolve(false);
116 return new DelegatingClassResolveResult(result
);
120 public PsiClassType
rawType() {
121 PsiElement resolved
= myReference
.resolve();
122 if (resolved
instanceof PsiClass
) {
123 PsiClass aClass
= (PsiClass
)resolved
;
124 if (!PsiUtil
.typeParametersIterable(aClass
).iterator().hasNext()) return this;
125 PsiManager manager
= myReference
.getManager();
126 final PsiElementFactory factory
= JavaPsiFacade
.getInstance(manager
.getProject()).getElementFactory();
127 final PsiSubstitutor rawSubstitutor
= factory
.createRawSubstitutor(aClass
);
128 return factory
.createType(aClass
, rawSubstitutor
, getLanguageLevel(), getAnnotations());
130 String qualifiedName
= myReference
.getQualifiedName();
131 LightClassReference reference
= new LightClassReference(myReference
.getManager(), myReference
.getReferenceName(), qualifiedName
, myReference
.getResolveScope());
132 return new PsiClassReferenceType(reference
, null,getAnnotations());
135 public String
getClassName() {
136 return myReference
.getReferenceName();
140 public PsiType
[] getParameters() {
141 return myReference
.getTypeParameters();
144 public PsiClassType
createImmediateCopy() {
145 final ClassResolveResult resolveResult
= resolveGenerics();
146 if (resolveResult
.getElement() == null) return this;
147 return new PsiImmediateClassType(resolveResult
.getElement(), resolveResult
.getSubstitutor());
150 public String
getPresentableText() {
151 return getAnnotationsTextPrefix() + PsiNameHelper
.getPresentableText(myReference
);
154 public String
getCanonicalText() {
155 return myReference
.getCanonicalText();
158 public String
getInternalCanonicalText() {
159 return getAnnotationsTextPrefix() + getCanonicalText();
162 public PsiJavaCodeReferenceElement
getReference() {