blob: 75acbeb2525170dad2ed0f7ddc4fee6f005f48d6 [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.lang.java;
import com.intellij.find.impl.HelpID;
import com.intellij.ide.TypePresentationService;
import com.intellij.lang.LangBundle;
import com.intellij.lang.cacheBuilder.WordsScanner;
import com.intellij.lang.findUsages.FindUsagesProvider;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.search.ThrowSearchUtil;
import com.intellij.psi.meta.PsiMetaOwner;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.psi.util.PsiFormatUtilBase;
import com.intellij.usageView.UsageViewBundle;
import org.jetbrains.annotations.NotNull;
/**
* @author ven
*/
public class JavaFindUsagesProvider implements FindUsagesProvider {
public static final String DEFAULT_PACKAGE_NAME = UsageViewBundle.message("default.package.presentable.name");
@Override
public boolean canFindUsagesFor(@NotNull PsiElement element) {
if (element instanceof PsiDirectory) {
PsiPackage psiPackage = JavaDirectoryService.getInstance().getPackage((PsiDirectory)element);
return psiPackage != null && psiPackage.getQualifiedName().length() != 0;
}
return element instanceof PsiClass ||
element instanceof PsiVariable ||
element instanceof PsiMethod ||
element instanceof PsiPackage ||
element instanceof PsiLabeledStatement ||
ThrowSearchUtil.isSearchable(element) ||
element instanceof PsiMetaOwner && ((PsiMetaOwner)element).getMetaData() != null;
}
@Override
public String getHelpId(@NotNull PsiElement element) {
if (element instanceof PsiPackage) {
return HelpID.FIND_PACKAGE_USAGES;
}
if (element instanceof PsiClass) {
return HelpID.FIND_CLASS_USAGES;
}
if (element instanceof PsiMethod) {
return HelpID.FIND_METHOD_USAGES;
}
if (ThrowSearchUtil.isSearchable(element)) {
return HelpID.FIND_THROW_USAGES;
}
return com.intellij.lang.HelpID.FIND_OTHER_USAGES;
}
@Override
@NotNull
public String getType(@NotNull PsiElement element) {
if (element instanceof PsiDirectory) {
return LangBundle.message("terms.directory");
}
if (element instanceof PsiFile) {
return LangBundle.message("terms.file");
}
if (ThrowSearchUtil.isSearchable(element)) {
return LangBundle.message("java.terms.exception");
}
if (element instanceof PsiPackage) {
return LangBundle.message("java.terms.package");
}
if (element instanceof PsiLabeledStatement) {
return LangBundle.message("java.terms.label");
}
if (element instanceof PsiClass) {
if (((PsiClass)element).isAnnotationType()) {
return LangBundle.message("java.terms.annotation.interface");
}
if (((PsiClass)element).isEnum()) {
return LangBundle.message("java.terms.enum");
}
if (((PsiClass)element).isInterface()) {
return LangBundle.message("java.terms.interface");
}
if (element instanceof PsiTypeParameter) {
return LangBundle.message("java.terms.type.parameter");
}
return LangBundle.message("java.terms.class");
}
if (element instanceof PsiField) {
return LangBundle.message("java.terms.field");
}
if (element instanceof PsiParameter) {
return LangBundle.message("java.terms.parameter");
}
if (element instanceof PsiLocalVariable) {
return LangBundle.message("java.terms.variable");
}
if (element instanceof PsiMethod) {
final PsiMethod psiMethod = (PsiMethod)element;
final boolean isConstructor = psiMethod.isConstructor();
if (isConstructor) {
return LangBundle.message("java.terms.constructor");
}
return LangBundle.message("java.terms.method");
}
if (element instanceof PsiExpression) {
return LangBundle.message("java.terms.expression");
}
final String name = TypePresentationService.getService().getTypePresentableName(element.getClass());
if (name != null) {
return name;
}
return "";
}
@Override
@NotNull
public String getDescriptiveName(@NotNull final PsiElement element) {
if (ThrowSearchUtil.isSearchable(element)) {
return ThrowSearchUtil.getSearchableTypeName(element);
}
if (element instanceof PsiDirectory) {
return getPackageName((PsiDirectory)element, false);
}
if (element instanceof PsiPackage) {
return getPackageName((PsiPackage)element);
}
if (element instanceof PsiFile) {
return ((PsiFile)element).getVirtualFile().getPresentableUrl();
}
if (element instanceof PsiLabeledStatement) {
return ((PsiLabeledStatement)element).getLabelIdentifier().getText();
}
if (element instanceof PsiClass) {
if (element instanceof PsiAnonymousClass) {
return LangBundle.message("java.terms.anonymous.class");
}
else {
final PsiClass aClass = (PsiClass)element;
String qName = aClass.getQualifiedName();
return qName == null ? aClass.getName() : qName;
}
}
if (element instanceof PsiMethod) {
PsiMethod psiMethod = (PsiMethod)element;
String formatted = PsiFormatUtil.formatMethod(psiMethod,
PsiSubstitutor.EMPTY, PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS,
PsiFormatUtilBase.SHOW_TYPE | PsiFormatUtilBase.SHOW_RAW_NON_TOP_TYPE);
PsiClass psiClass = psiMethod.getContainingClass();
if (psiClass != null) {
return getContainingClassDescription(psiClass, formatted);
}
return formatted;
}
if (element instanceof PsiField) {
PsiField psiField = (PsiField)element;
String formatted = PsiFormatUtil.formatVariable(psiField, PsiFormatUtilBase.SHOW_NAME, PsiSubstitutor.EMPTY);
PsiClass psiClass = psiField.getContainingClass();
if (psiClass != null) {
return getContainingClassDescription(psiClass, formatted);
}
return formatted;
}
if (element instanceof PsiVariable) {
return PsiFormatUtil.formatVariable((PsiVariable)element, PsiFormatUtilBase.SHOW_NAME, PsiSubstitutor.EMPTY);
}
if (element instanceof PsiLiteralExpression) {
return element.getText();
}
return "";
}
private static String getContainingClassDescription(PsiClass aClass, String formatted) {
if (aClass instanceof PsiAnonymousClass) {
return LangBundle.message("java.terms.of.anonymous.class", formatted);
}
else {
final String qualifiedName = aClass.getQualifiedName();
final String className = qualifiedName != null ? qualifiedName : aClass.getName();
if (aClass.isInterface()) {
return LangBundle.message("java.terms.of.interface", formatted, className);
}
if (aClass.isEnum()) {
return LangBundle.message("java.terms.of.enum", formatted, className);
}
if (aClass.isAnnotationType()) {
return LangBundle.message("java.terms.of.annotation.type", formatted, className);
}
return LangBundle.message("java.terms.of.class", formatted, className);
}
}
@Override
@NotNull
public String getNodeText(@NotNull PsiElement element, boolean useFullName) {
if (element instanceof PsiDirectory) {
return getPackageName((PsiDirectory)element, false);
}
if (element instanceof PsiPackage) {
return getPackageName((PsiPackage)element);
}
if (element instanceof PsiFile) {
return useFullName ? ((PsiFile)element).getVirtualFile().getPresentableUrl() : ((PsiFile)element).getName();
}
if (element instanceof PsiLabeledStatement) {
return ((PsiLabeledStatement)element).getLabelIdentifier().getText();
}
if (ThrowSearchUtil.isSearchable(element)) {
return ThrowSearchUtil.getSearchableTypeName(element);
}
if (element instanceof PsiClass) {
String name = ((PsiClass)element).getQualifiedName();
if (name == null || !useFullName) {
name = ((PsiClass)element).getName();
}
if (name != null) return name;
}
if (element instanceof PsiMethod) {
PsiMethod psiMethod = (PsiMethod)element;
if (useFullName) {
String s = PsiFormatUtil.formatMethod((PsiMethod)element,
PsiSubstitutor.EMPTY, PsiFormatUtilBase.TYPE_AFTER | PsiFormatUtilBase.SHOW_TYPE |
PsiFormatUtilBase.SHOW_NAME |
PsiFormatUtilBase.SHOW_PARAMETERS,
PsiFormatUtilBase.SHOW_TYPE | PsiFormatUtilBase.SHOW_NAME);
final PsiClass psiClass = psiMethod.getContainingClass();
if (psiClass != null) {
final String qName = psiClass.getQualifiedName();
if (qName != null) {
if (psiClass.isInterface()) {
s = LangBundle.message("java.terms.of.interface", s, qName);
}
else {
s = LangBundle.message("java.terms.of.class", s, qName);
}
}
}
return s;
}
else {
return PsiFormatUtil.formatMethod(psiMethod,
PsiSubstitutor.EMPTY,
PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS,
PsiFormatUtilBase.SHOW_TYPE);
}
}
if (element instanceof PsiParameter && ((PsiParameter)element).getDeclarationScope() instanceof PsiMethod) {
PsiMethod method = (PsiMethod)((PsiParameter)element).getDeclarationScope();
String s = LangBundle.message("java.terms.variable.of.method",
PsiFormatUtil.formatVariable((PsiVariable)element,
PsiFormatUtilBase.TYPE_AFTER |
PsiFormatUtilBase.SHOW_TYPE |
PsiFormatUtilBase.SHOW_NAME,
PsiSubstitutor.EMPTY),
PsiFormatUtil.formatMethod(method,
PsiSubstitutor.EMPTY,
PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS,
PsiFormatUtilBase.SHOW_TYPE));
final PsiClass psiClass = method.getContainingClass();
if (psiClass != null && psiClass.getQualifiedName() != null) {
if (psiClass.isInterface()) {
s = LangBundle.message("java.terms.of.interface", s, psiClass.getQualifiedName());
}
else {
s = LangBundle.message("java.terms.of.class", s, psiClass.getQualifiedName());
}
}
return s;
}
if (element instanceof PsiField) {
PsiField psiField = (PsiField)element;
String s = PsiFormatUtil.formatVariable(psiField,
PsiFormatUtilBase.TYPE_AFTER | PsiFormatUtilBase.SHOW_TYPE | PsiFormatUtilBase.SHOW_NAME,
PsiSubstitutor.EMPTY);
PsiClass psiClass = psiField.getContainingClass();
if (psiClass != null) {
String qName = psiClass.getQualifiedName();
if (qName != null) {
if (psiClass.isInterface()) {
s = LangBundle.message("java.terms.of.interface", s, qName);
}
else {
s = LangBundle.message("java.terms.of.class", s, qName);
}
}
}
return s;
}
if (element instanceof PsiVariable) {
return PsiFormatUtil.formatVariable((PsiVariable)element,
PsiFormatUtilBase.TYPE_AFTER | PsiFormatUtilBase.SHOW_TYPE | PsiFormatUtilBase.SHOW_NAME,
PsiSubstitutor.EMPTY);
}
return "";
}
public static String getPackageName(PsiDirectory directory, boolean includeRootDir) {
PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory);
if (aPackage == null) {
return directory.getVirtualFile().getPresentableUrl();
}
else {
String packageName = getPackageName(aPackage);
if (includeRootDir) {
String rootDir = getRootDirectoryForPackage(directory);
if (rootDir != null) {
return UsageViewBundle.message("usage.target.package.in.directory", packageName, rootDir);
}
}
return packageName;
}
}
public static String getRootDirectoryForPackage(PsiDirectory directory) {
PsiManager manager = directory.getManager();
final VirtualFile virtualFile = directory.getVirtualFile();
final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(manager.getProject()).getFileIndex();
VirtualFile root = fileIndex.getSourceRootForFile(virtualFile);
if (root == null) {
root = fileIndex.getClassRootForFile(virtualFile);
}
if (root != null) {
return root.getPresentableUrl();
}
return null;
}
public static String getPackageName(PsiPackage psiPackage) {
if (psiPackage == null) {
return null;
}
String name = psiPackage.getQualifiedName();
if (name.length() > 0) {
return name;
}
return DEFAULT_PACKAGE_NAME;
}
@Override
public WordsScanner getWordsScanner() {
return null;
}
}