package org.fandev.findUsages;
import com.intellij.lang.findUsages.FindUsagesProvider;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiFormatUtil;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
import org.fandev.lang.fan.psi.api.statements.expressions.FanReferenceExpression;
import org.fandev.lang.fan.psi.api.statements.FanVariable;
/**
* Date: Sep 18, 2009
* Time: 12:22:02 AM
*
* @author Dror Bereznitsky
*/
public class FanFindUsagesProvider implements FindUsagesProvider {
public FanFindUsagesProvider() {}
@Nullable
public FanWordsScanner getWordsScanner() {
return new FanWordsScanner();
}
public boolean canFindUsagesFor(@NotNull final PsiElement psiElement) {
return psiElement instanceof PsiClass ||
psiElement instanceof PsiMethod ||
psiElement instanceof FanVariable;
}
@Nullable
public String getHelpId(@NotNull final PsiElement psiElement) {
return null;
}
@NotNull
public String getType(@NotNull final PsiElement element) {
if (element instanceof PsiClass) return "class";
if (element instanceof PsiMethod) return "method";
if (element instanceof PsiField) return "field";
if (element instanceof PsiParameter) return "parameter";
if (element instanceof PsiVariable || element instanceof FanReferenceExpression) return "variable";
return "";
}
@NotNull
public String getDescriptiveName(@NotNull final PsiElement element) {
if (element instanceof PsiClass) {
final PsiClass aClass = (PsiClass) element;
final String qName = aClass.getQualifiedName();
return qName == null ? "" : qName;
} else if (element instanceof PsiMethod) {
final PsiMethod method = (PsiMethod) element;
String result = PsiFormatUtil.formatMethod(method,
PsiSubstitutor.EMPTY, PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_PARAMETERS,
PsiFormatUtil.SHOW_TYPE);
final PsiClass clazz = method.getContainingClass();
if (clazz != null) {
result += " of " + getDescriptiveName(clazz);
}
return result;
} else if (element instanceof PsiVariable) {
final String name = ((PsiVariable) element).getName();
if (name != null) {
return name;
}
}
return "";
}
@NotNull
public String getNodeText(@NotNull final PsiElement element, final boolean useFullName) {
if (element instanceof PsiClass) {
String name = ((PsiClass) element).getQualifiedName();
if (name == null || !useFullName) {
name = ((PsiClass) element).getName();
}
if (name != null){
return name;
}
} else if (element instanceof PsiMethod) {
return PsiFormatUtil.formatMethod((PsiMethod) element,
PsiSubstitutor.EMPTY,
PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_PARAMETERS,
PsiFormatUtil.SHOW_TYPE);
} else if (element instanceof PsiVariable) {
final String name = ((PsiVariable) element).getName();
if (name != null) {
return name;
}
}
return "";
}
}