/* 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.
 */

/** Clownfish::CFC::Function - Metadata describing a function.
 */

#ifndef H_CFCFUNCTION
#define H_CFCFUNCTION

#ifdef __cplusplus
extern "C" {
#endif

typedef struct CFCFunction CFCFunction;
struct CFCParcel;
struct CFCType;
struct CFCDocuComment;
struct CFCParamList;

#ifdef CFC_NEED_FUNCTION_STRUCT_DEF
#define CFC_NEED_SYMBOL_STRUCT_DEF
#include "CFCSymbol.h"
struct CFCFunction {
    CFCSymbol symbol;
    struct CFCType *return_type;
    struct CFCParamList *param_list;
    struct CFCDocuComment *docucomment;
    int is_inline;
};
#endif

/**
 * @param parcel A Clownfish::CFC::Parcel.
 * @param exposure The function's exposure (see L<Clownfish::CFC::Symbol>).
 * @param class_name The full name of the class in whose namespace the
 * function resides.
 * @param class_cnick The C nickname for the class.
 * @param micro_sym The lower case name of the function, without any
 * namespacing prefixes.
 * @param return_type A Clownfish::CFC::Type representing the function's
 * return type.
 * @param param_list A Clownfish::CFC::ParamList representing the
 * function's argument list.
 * @param docucomment A Clownfish::CFC::DocuComment describing the
 * function.
 * @param is_inline Should be true if the function should be inlined by the
 * compiler.
 */
CFCFunction*
CFCFunction_new(struct CFCParcel *parcel, const char *exposure,
                const char *class_name, const char *class_cnick,
                const char *micro_sym, struct CFCType *return_type,
                struct CFCParamList *param_list,
                struct CFCDocuComment *docucomment, int is_inline);

CFCFunction*
CFCFunction_init(CFCFunction *self, struct CFCParcel *parcel,
                 const char *exposure, const char *class_name,
                 const char *class_cnick, const char *micro_sym,
                 struct CFCType *return_type, struct CFCParamList *param_list,
                 struct CFCDocuComment *docucomment, int is_inline);

void
CFCFunction_destroy(CFCFunction *self);

struct CFCType*
CFCFunction_get_return_type(CFCFunction *self);

struct CFCParamList*
CFCFunction_get_param_list(CFCFunction *self);

struct CFCDocuComment*
CFCFunction_get_docucomment(CFCFunction *self);

int
CFCFunction_inline(CFCFunction *self);

/** Returns true if the function has a void return type, false otherwise.
 */
int
CFCFunction_void(CFCFunction *self);

/** A synonym for full_sym().
 */
const char*
CFCFunction_full_func_sym(CFCFunction *self);

/** A synonym for short_sym().
 */
const char*
CFCFunction_short_func_sym(CFCFunction *self);

const char*
CFCFunction_micro_sym(CFCFunction *self);

#ifdef __cplusplus
}
#endif

#endif /* H_CFCFUNCTION */

