blob: 7027c67889572ee1c8509db838b9989b6e4ed84b [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.psi;
import com.intellij.psi.meta.PsiMetaOwner;
import com.intellij.util.ArrayFactory;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Represents a Java annotation.
*
* @author ven
*/
public interface PsiAnnotation extends PsiAnnotationMemberValue, PsiMetaOwner {
/**
* The empty array of PSI annotations which can be reused to avoid unnecessary allocations.
*/
PsiAnnotation[] EMPTY_ARRAY = new PsiAnnotation[0];
ArrayFactory<PsiAnnotation> ARRAY_FACTORY = new ArrayFactory<PsiAnnotation>() {
@NotNull
@Override
public PsiAnnotation[] create(final int count) {
return count == 0 ? EMPTY_ARRAY : new PsiAnnotation[count];
}
};
@NonNls String DEFAULT_REFERENCED_METHOD_NAME = "value";
/**
* Kinds of element to which an annotation type is applicable (see {@link java.lang.annotation.ElementType}).
*/
enum TargetType {
// see java.lang.annotation.ElementType
TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE, TYPE_USE, TYPE_PARAMETER,
// auxiliary value, used when it's impossible to determine annotation's targets
UNKNOWN;
public static final TargetType[] EMPTY_ARRAY = {};
}
/**
* Returns the list of parameters for the annotation.
*
* @return the parameter list instance.
*/
@NotNull
PsiAnnotationParameterList getParameterList();
/**
* Returns the fully qualified name of the annotation class.
*
* @return the class name, or null if the annotation is unresolved.
*/
@Nullable
@NonNls
String getQualifiedName();
/**
* Returns the reference element representing the name of the annotation.
*
* @return the annotation name element.
*/
@Nullable
PsiJavaCodeReferenceElement getNameReferenceElement();
/**
* Returns the value of the annotation element with the specified name.
*
* @param attributeName name of the annotation element for which the value is requested. If it isn't defined in annotation,
* the default value is returned.
* @return the element value, or null if the annotation does not contain a value for
* the element and the element has no default value.
*/
@Nullable
PsiAnnotationMemberValue findAttributeValue(@Nullable @NonNls String attributeName);
/**
* Returns the value of the annotation element with the specified name.
*
* @param attributeName name of the annotation element for which the value is requested, declared in this annotation.
* @return the element value, or null if the annotation does not contain a value for
* the element.
*/
@Nullable
PsiAnnotationMemberValue findDeclaredAttributeValue(@Nullable @NonNls String attributeName);
/**
* Set annotation attribute value. Adds new name-value pair or uses an existing one, expands unnamed 'value' attribute name if needed.
*
* @param attributeName attribute name
* @param value new value template element
* @return new declared attribute value
*/
<T extends PsiAnnotationMemberValue> T setDeclaredAttributeValue(@Nullable @NonNls String attributeName, @Nullable T value);
/**
* Returns an owner of the annotation - usually a parent, but for type annotations the owner might be a type element.
*
* @return annotation owner
*/
@Nullable
PsiAnnotationOwner getOwner();
}