blob: 7274a0081bf595c2d7644096898aa891bbc1daea [file] [log] [blame]
/*
* Copyright 2000-2009 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.psi;
import com.intellij.openapi.util.Pair;
import com.intellij.util.ArrayFactory;
import com.intellij.util.IncorrectOperationException;
import com.intellij.pom.PomRenameableTarget;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.List;
/**
* Represents a Java class or interface.
*
* @see PsiJavaFile#getClasses()
*/
public interface PsiClass
extends PsiNameIdentifierOwner, PsiModifierListOwner, PsiDocCommentOwner, PsiTypeParameterListOwner, PsiTarget, PomRenameableTarget<PsiElement> {
/**
* The empty array of PSI classes which can be reused to avoid unnecessary allocations.
*/
@NotNull PsiClass[] EMPTY_ARRAY = new PsiClass[0];
ArrayFactory<PsiClass> ARRAY_FACTORY = new ArrayFactory<PsiClass>() {
@NotNull
@Override
public PsiClass[] create(final int count) {
return count == 0 ? EMPTY_ARRAY : new PsiClass[count];
}
};
/**
* Returns the fully qualified name of the class.
*
* @return the qualified name of the class, or null for anonymous and local classes, and for type parameters
*/
@Nullable @NonNls
String getQualifiedName();
/**
* Checks if the class is an interface.
*
* @return true if the class is an interface, false otherwise.
*/
boolean isInterface();
/**
* Checks if the class is an annotation type.
*
* @return true if the class is an annotation type, false otherwise
*/
boolean isAnnotationType();
/**
* Checks if the class is an enumeration.
*
* @return true if the class is an enumeration, false otherwise.
*/
boolean isEnum();
/**
* Returns the list of classes that this class or interface extends.
*
* @return the extends list, or null for anonymous classes, enums and annotation types
*/
@Nullable
PsiReferenceList getExtendsList();
/**
* Returns the list of interfaces that this class implements.
*
* @return the implements list, or null for anonymous classes
*/
@Nullable
PsiReferenceList getImplementsList();
/**
* Returns the list of class types for the classes that this class or interface extends.
*
* @return the list of extended class types, or an empty list for anonymous classes,
* enums and annotation types
*/
@NotNull
PsiClassType[] getExtendsListTypes();
/**
* Returns the list of class types for the interfaces that this class implements.
*
* @return the list of extended class types, or an empty list for anonymous classes,
* enums and annotation types
*/
@NotNull
PsiClassType[] getImplementsListTypes();
/**
* Returns the base class of this class.
*
* @return the base class. May return null when jdk is not configured, so no java.lang.Object is found,
* or for java.lang.Object itself
*/
@Nullable
PsiClass getSuperClass();
/**
* Returns the list of interfaces implemented by the class, or extended by the interface.
*
* @return the list of interfaces.
*/
PsiClass[] getInterfaces();
/**
* Returns the list of classes and interfaces extended or implemented by the class.
*
* @return the list of classes or interfaces. May return zero elements when jdk is
* not configured, so no java.lang.Object is found
*/
@NotNull PsiClass[] getSupers();
/**
* Returns the list of class types for the classes and interfaces extended or
* implemented by the class.
*
* @return the list of class types for the classes or interfaces.
* For the class with no explicit extends list, the returned list always contains at least one element for the java.lang.Object type.
* If psiClass is java.lang.Object, returned list is empty.
*/
@NotNull PsiClassType[] getSuperTypes();
/**
* Returns the list of fields in the class.
*
* @return the list of fields.
*/
@NotNull
PsiField[] getFields();
/**
* Returns the list of methods in the class.
*
* @return the list of methods.
*/
@NotNull
PsiMethod[] getMethods();
/**
* Returns the list of constructors for the class.
*
* @return the list of constructors,
*/
@NotNull
PsiMethod[] getConstructors();
/**
* Returns the list of inner classes for the class.
*
* @return the list of inner classes.
*/
@NotNull PsiClass[] getInnerClasses();
/**
* Returns the list of class initializers for the class.
*
* @return the list of class initializers.
*/
@NotNull PsiClassInitializer[] getInitializers();
/**
* Returns the list of fields in the class and all its superclasses.
*
* @return the list of fields.
*/
@NotNull PsiField[] getAllFields();
/**
* Returns the list of methods in the class and all its superclasses.
*
* @return the list of methods.
*/
@NotNull PsiMethod[] getAllMethods();
/**
* Returns the list of inner classes for the class and all its superclasses..
*
* @return the list of inner classes.
*/
@NotNull PsiClass[] getAllInnerClasses();
/**
* Searches the class (and optionally its superclasses) for the field with the specified name.
*
* @param name the name of the field to find.
* @param checkBases if true, the field is also searched in the base classes of the class.
* @return the field instance, or null if the field cannot be found.
*/
@Nullable
PsiField findFieldByName(@NonNls String name, boolean checkBases);
/**
* Searches the class (and optionally its superclasses) for the method with
* the signature matching the signature of the specified method.
*
* @param patternMethod the method used as a pattern for the search.
* @param checkBases if true, the method is also searched in the base classes of the class.
* @return the method instance, or null if the method cannot be found.
*/
@Nullable
PsiMethod findMethodBySignature(PsiMethod patternMethod, boolean checkBases);
/**
* Searches the class (and optionally its superclasses) for the methods with the signature
* matching the signature of the specified method. If the superclasses are not searched,
* the method returns multiple results only in case of a syntax error (duplicate method).
*
* @param patternMethod the method used as a pattern for the search.
* @param checkBases if true, the method is also searched in the base classes of the class.
* @return the found methods, or an empty array if no methods are found.
*/
@NotNull
PsiMethod[] findMethodsBySignature(PsiMethod patternMethod, boolean checkBases);
/**
* Searches the class (and optionally its superclasses) for the methods with the specified name.
*
* @param name the name of the methods to find.
* @param checkBases if true, the methods are also searched in the base classes of the class.
* @return the found methods, or an empty array if no methods are found.
*/
@NotNull
PsiMethod[] findMethodsByName(@NonNls String name, boolean checkBases);
/**
* Searches the class (and optionally its superclasses) for the methods with the specified name
* and returns the methods along with their substitutors.
*
* @param name the name of the methods to find.
* @param checkBases if true, the methods are also searched in the base classes of the class.
* @return the found methods and their substitutors, or an empty list if no methods are found.
*/
@NotNull
List<Pair<PsiMethod, PsiSubstitutor>> findMethodsAndTheirSubstitutorsByName(@NonNls String name, boolean checkBases);
/**
* Returns the list of methods in the class and all its superclasses, along with their
* substitutors.
*
* @return the list of methods and their substitutors
*/
@NotNull
List<Pair<PsiMethod, PsiSubstitutor>> getAllMethodsAndTheirSubstitutors();
/**
* Searches the class (and optionally its superclasses) for the inner class with the specified name.
*
* @param name the name of the inner class to find.
* @param checkBases if true, the inner class is also searched in the base classes of the class.
* @return the inner class instance, or null if the inner class cannot be found.
*/
@Nullable
PsiClass findInnerClassByName(@NonNls String name, boolean checkBases);
/**
* Returns the token representing the opening curly brace of the class.
*
* @return the token instance, or null if the token is missing in the source code file.
*/
@Nullable
PsiElement getLBrace();
/**
* Returns the token representing the closing curly brace of the class.
*
* @return the token instance, or null if the token is missing in the source code file.
*/
@Nullable
PsiElement getRBrace();
/**
* Returns the name identifier of the class.
*
* @return the name identifier, or null if the class is anonymous or synthetic jsp class
*/
@Override
@Nullable
PsiIdentifier getNameIdentifier();
/**
* Returns the PSI member in which the class has been declared (for example,
* the method containing the anonymous inner class, or the file containing a regular
* class, or the class owning a type parameter).
*
* @return the member in which the class has been declared.
*/
PsiElement getScope();
/**
* Checks if this class is an inheritor of the specified base class.
* Only java inheritance rules are considered.
* Note that {@link com.intellij.psi.search.searches.ClassInheritorsSearch}
* may return classes that are inheritors in broader, e.g. in ejb sense, but not in java sense.
*
* @param baseClass the base class to check the inheritance.
* @param checkDeep if false, only direct inheritance is checked; if true, the base class is
* searched in the entire inheritance chain
* @return true if the class is an inheritor, false otherwise
*/
boolean isInheritor(@NotNull PsiClass baseClass, boolean checkDeep);
/**
* Checks if this class is a deep inheritor of the specified base class possibly bypassing a class
* when checking inheritance chain.
* Only java inheritance rules are considered.
* Note that {@link com.intellij.psi.search.searches.ClassInheritorsSearch}
* may return classes that are inheritors in broader, e.g. in ejb sense, but not in java sense.
*
* @param baseClass the base class to check the inheritance.
* searched in the entire inheritance chain
* @param classToByPass class to bypass the inheratance check for
* @return true if the class is an inheritor, false otherwise
*/
boolean isInheritorDeep(PsiClass baseClass, @Nullable PsiClass classToByPass);
/**
* For an inner class, returns its containing class.
*
* @return the containing class, or null if the class is not an inner class.
*/
@Override
@Nullable
PsiClass getContainingClass();
/**
* Returns the hierarchical signatures for all methods in the specified class and
* its superclasses and superinterfaces.
*
* @return the collection of signatures.
* @since 5.1
*/
@NotNull
Collection<HierarchicalMethodSignature> getVisibleSignatures();
@Override
PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException;
}