/*
 * 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.jetbrains.python.psi;

import com.intellij.psi.StubBasedPsiElement;
import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.stubs.PyDecoratorStub;
import org.jetbrains.annotations.Nullable;

/**
 * Covers a decorator call, e.g. <tt>@staticmethod</tt>.
 * Decorators happen contextually above the function definition, but are stored inside it for convenience.
 * <b>Note:</b>
 * In <code>@foo</code> form, <code>PyCallExpression</code>'s methods are related to invocation of <code>foo</code>
 * as decorator. In <code>@foo(...)</code> form, these very methods are related to the call that returns the decorator
 * to be applied. In either case, they are related to an invocation of <code>foo</code>.
 * User: dcheryasov
 * Date: Sep 26, 2008
 */
public interface PyDecorator extends PyCallExpression, StubBasedPsiElement<PyDecoratorStub> {
  /**
   * @return the function being decorated, or null.
   */
  @Nullable
  PyFunction getTarget();

  /**
   * True if the annotating function is a builtin, useful togeter with getName(). Implementation uses stub info.
   * @see com.jetbrains.python.psi.PyElement#getName()
   */
  boolean isBuiltin();

  /**
   * @return true if invocation has a form of <code>@foo(...)</code>.
   */
  boolean hasArgumentList();

  /**
   * For cases when decorators are referenced via a qualified name, e.g. @property.setter.
   * @return dot-separated qualified name, or just {@link #getName()}'s value if no qualifiers are present.
   */
  @Nullable
  QualifiedName getQualifiedName();

}
