package org.fandev.lang.fan.psi.impl;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import org.fandev.lang.fan.psi.api.types.FanCodeReferenceElement;
import org.fandev.lang.fan.psi.api.statements.typeDefs.FanTypeDefinition;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
/**
* Date: Mar 18, 2009
* Time: 11:17:54 PM
* @author Dror Bereznitsky
*/
public class FanClassReferenceType extends PsiClassType {
private final FanCodeReferenceElement myReferenceElement;
public FanClassReferenceType(final FanCodeReferenceElement ref) {
this(LanguageLevel.JDK_1_6, ref);
}
public FanClassReferenceType(final LanguageLevel languageLevel, final FanCodeReferenceElement ref) {
super(languageLevel);
this.myReferenceElement = ref;
}
public PsiClass resolve() {
final ResolveResult[] results = multiResolve();
if (results.length == 1) {
final PsiElement only = results[0].getElement();
return only instanceof PsiClass ? (PsiClass) only : null;
}
return null;
}
public FanTypeDefinition resolveFanType() {
return (FanTypeDefinition)resolve();
}
//reference resolve is cached
private ResolveResult[] multiResolve() {
return myReferenceElement.multiResolve(false);
}
public String getClassName() {
return myReferenceElement.getReferenceName();
}
@NotNull
public PsiType[] getParameters() {
//todo
return PsiType.EMPTY_ARRAY;
}
@NotNull
public ClassResolveResult resolveGenerics() {
return ClassResolveResult.EMPTY;
}
@NotNull
public PsiClassType rawType() {
return this;
}
public String getPresentableText() {
return myReferenceElement.getReferenceName();
}
public String getCanonicalText() {
return myReferenceElement.getReferenceName();
}
public String getInternalCanonicalText() {
return getCanonicalText();
}
public boolean isValid() {
return myReferenceElement.isValid();
}
public boolean equalsToText(@NonNls final String text) {
return text.endsWith(getPresentableText()) && //optimization
text.equals(getCanonicalText());
}
@NotNull
public GlobalSearchScope getResolveScope() {
return myReferenceElement.getResolveScope();
}
@NotNull
public LanguageLevel getLanguageLevel() {
return myLanguageLevel;
}
public PsiClassType setLanguageLevel(final LanguageLevel languageLevel) {
return new FanClassReferenceType(languageLevel, myReferenceElement);
}
}