/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.flex.compiler.definitions; import org.apache.flex.compiler.definitions.references.IReference; import org.apache.flex.compiler.projects.ICompilerProject; import org.apache.flex.compiler.tree.as.IFunctionNode; /** * A definition representing a <code>function</code> declaration. * <p> * An <code>IFunctionDefinition</code is created from an <code>IFunctionNode</code>. * <p> * For example, the function declaration * <pre>public function f(i:int):int;</pre> * creates a function definition whose base name is <code>"f"</code>, * whose namespace reference is to the <code>public</code> namespace, * and whose type reference is named <code>"Function"</code>. * It has an <code>IReference</code> named <code>"int"</code> * representing its return type. * It also owns one parameter definition named <code>"i"</code>. * <p> * A function definition is contained within a file scope, a package scope, * a class scope, an interface scope, or a function scope; * it contains a function scope. */ public interface IFunctionDefinition extends IScopedDefinition { /** * Function classifications (local, class member, interface member, and * package member) */ static enum FunctionClassification { /** * Local function contained with a non-visible scope */ LOCAL, /** * A function that is a member of a class */ CLASS_MEMBER, /** * A function that is a member of a interface */ INTERFACE_MEMBER, /** * A function that is a member of a package */ PACKAGE_MEMBER, /** * A function that is a member of a file */ FILE_MEMBER } /** * Get the classification for this function (local, argument, class member, * etc) * * @return function classification */ FunctionClassification getFunctionClassification(); /** * Get the parameters of this function as an array of * {@link IParameterDefinition} elements * * @return the parameters of this function */ IParameterDefinition[] getParameters(); /** * Returns <code>true</code> if the function has required parameters. */ boolean hasRequiredParameters(); /** * Gets a reference to the return type for this function. * <p> * For example, for the function <code>private function f(i:int):String</code>, * this is a reference to the <code>String</code> class. * * @return An {@link IReference} to a class or interface. */ IReference getReturnTypeReference(); /** * Resolve this function's return type in the given scope and find its * definition * * @param project the {@link ICompilerProject} in which to resolve * references * @return an {@link ITypeDefinition} representing this function's return * type, or null */ ITypeDefinition resolveReturnType(ICompilerProject project); /** * Converts this definition's {@link IReference} for its return type * to a human-readable String. * <p> * If the definition does not have a return type reference, * this method returns the empty string. * <p> * This method should only be used for displaying return types in problems, * and not for making semantic decisions. * <p> * Note: * * @return The result of calling {@link IReference#getDisplayString}() * on the {@link IReference} representing this definition's return type. */ // TODO Builder is currently using this functionality in inconsistent ways; // sometimes it interprets empty string to as <code>void</code> and sometimes as <code>*</code>. String getReturnTypeAsDisplayString(); /** * Is this a constructor? * * @return true if the member is a constructor */ boolean isConstructor(); /** * Is this a cast function? * * @return true if the member is a cast function */ boolean isCastFunction(); /** * Is this function marked as <code>inline</code>? * * @return <code>true</code> if the function is <code>inline</code>. */ boolean isInline(); /** * Can this function be inlined * * @return true if function can be inlined */ boolean inlineFunction(); /** * Is this function actually overriding a function in a base class * * @return true if overriding Note that for valid code, isOverride and * overridesAncestor are the same, but overridesAncestor can return true * even if the override keyword is missing. Conversely, isOverride can * return true, even if there is no matching function in a parent interface */ boolean overridesAncestor(ICompilerProject project); /** * Finds the definition of the IFunctionDefinition that we are overriding * * @return an {@link IFunctionDefinition} or null */ IFunctionDefinition resolveOverriddenFunction(ICompilerProject project); /** * Determines whether this function is an implementation of a function from * an implements Interface * * @return true if this is an implementation */ boolean isImplementation(ICompilerProject project); /** * Finds the definition of the IFunctionDefinition that defines this * function * * @return the parent {@link IFunctionDefinition} or null */ IFunctionDefinition resolveImplementedFunction(ICompilerProject project); /** * Returns the {@link IFunctionNode} from which this definition was created, * if the definition came from the AST for a source file. * <p> * This method may require the AST to be reloaded or regenerated and * therefore may be slow. */ IFunctionNode getFunctionNode(); }