blob: 37c4773730a501576a12a497bed333e2b5683aa6 [file] [log] [blame]
/* 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::Model::Method - Metadata describing an instance method.
*
* Clownfish::CFC::Model::Method is a specialized subclass of
* Clownfish::CFC::Model::Function, with the first argument required to be an
* Obj.
*
* When compiling Clownfish code to C, Method objects generate all the code
* that Function objects do, but also create symbols for indirect invocation
* via vtables.
*/
#ifndef H_CFCMETHOD
#define H_CFCMETHOD
#ifdef __cplusplus
extern "C" {
#endif
typedef struct CFCMethod CFCMethod;
struct CFCType;
struct CFCClass;
struct CFCParamList;
struct CFCDocuComment;
struct CFCJson;
/**
* @param exposure See Clownfish::CFC::Model::Symbol. Defaults to "parcel"
* if not supplied.
* @param name - The mixed case name which will be used when invoking the
* method.
* @param return_type See Clownfish::CFC::Model::Function.
* @param param_list - A Clownfish::CFC::Model::ParamList. The first element
* must be an object of the class identified by C<class_name>.
* @param docucomment see Clownfish::CFC::Model::Function. May be NULL.
* @param class_name The full name of the class in whose namespace the
* method is fresh.
* @param is_final - Indicate whether the method is final.
* @param is_abstract - Indicate whether the method is abstract.
*/
CFCMethod*
CFCMethod_new(const char *exposure, const char *name,
struct CFCType *return_type, struct CFCParamList *param_list,
struct CFCDocuComment *docucomment, const char *class_name,
int is_final, int is_abstract);
CFCMethod*
CFCMethod_init(CFCMethod *self, const char *exposure, const char *name,
struct CFCType *return_type, struct CFCParamList *param_list,
struct CFCDocuComment *docucomment, const char *class_name,
int is_final, int is_abstract);
void
CFCMethod_resolve_types(CFCMethod *self);
void
CFCMethod_destroy(CFCMethod *self);
/** Returns true if the methods have signatures and attributes which allow one
* to override the other.
*/
int
CFCMethod_compatible(CFCMethod *self, CFCMethod *other);
/** Let the Method know that it is overriding a method which was defined in a
* parent class, and verify that the override is valid.
*
* All methods start out believing that they are "novel", because we don't
* know about inheritance until we build the hierarchy after all files have
* been parsed. override() is a way of going back and relabeling a method as
* overridden when new information has become available: in this case, that a
* parent class has defined a method with the same name.
*/
void
CFCMethod_override(CFCMethod *self, CFCMethod *orig);
/** As with override, above, this is for going back and changing the nature of
* a Method after new information has become available -- typically, when we
* discover that the method has been inherited by a "final" class.
*
* However, we don't modify the original Method as with override(). Inherited
* Method objects are shared between parent and child classes; if a shared
* Method object were to become final, it would interfere with its own
* inheritance. So, we make a copy, slightly modified to indicate that it is
* "final".
*/
CFCMethod*
CFCMethod_finalize(CFCMethod *self);
/** Test whether bindings should be generated for a method.
*/
int
CFCMethod_can_be_bound(CFCMethod *method);
/** Read host-specific data for the method from a JSON hash.
*/
void
CFCMethod_read_host_data_json(CFCMethod *self, struct CFCJson *hash,
const char *path);
/**
* Find the first declaration of the method in the class hierarchy.
*/
CFCMethod*
CFCMethod_find_novel_method(CFCMethod *self);
/**
* Create the symbol used to invoke the method without the parcel Prefix, e.g.
* "LobClaw_Pinch".
* @param invoker Class for which the symbol is created. If invoker is NULL,
* use the class where the method is defined.
*
* @return the symbol.
*/
char*
CFCMethod_short_method_sym(CFCMethod *self, struct CFCClass *invoker);
/**
* Create the fully-qualified symbol used to invoke the method, e.g.
* "Crust_LobClaw_Pinch".
* @param invoker Class for which the symbol is created. If invoker is NULL,
* use the class where the method is defined.
*
* @return the symbol.
*/
char*
CFCMethod_full_method_sym(CFCMethod *self, struct CFCClass *invoker);
/** Create the fully qualified name of the variable which stores the method
* pointer's offset, e.g. "Crust_LobClaw_Pinch_OFFSET".
* @param invoker Class for which the symbol is created. If invoker is NULL,
* use the class where the method is defined.
*
* @return the symbol.
*/
char*
CFCMethod_full_offset_sym(CFCMethod *self, struct CFCClass *invoker);
const char*
CFCMethod_get_name(CFCMethod *self);
/** Create the typedef symbol for this method, e.g "Claw_Pinch_t".
* @param invoker Class for which the symbol is created. If invoker is NULL,
* use the class where the method is defined.
*
* @return the symbol.
*/
char*
CFCMethod_short_typedef(CFCMethod *self, struct CFCClass *invoker);
/** Create the fully-qualified typedef symbol, e.g. "Crust_Claw_Pinch_t".
* @param invoker Class for which the symbol is created. If invoker is NULL,
* use the class where the method is defined.
*
* @return the symbol.
*/
char*
CFCMethod_full_typedef(CFCMethod *self, struct CFCClass *invoker);
/** Returns the fully qualified name of the function which implements the
* callback to the host in the event that a host method has been defined which
* overrides this method, e.g. "crust_LobClaw_pinch_OVERRIDE".
*/
char*
CFCMethod_full_override_sym(CFCMethod *self, struct CFCClass *klass);
int
CFCMethod_final(CFCMethod *self);
int
CFCMethod_abstract(CFCMethod *self);
/** Returns true if this method is the first implemenation in the inheritance
* hierarchy in which the method was declared.
*/
int
CFCMethod_novel(CFCMethod *self);
/** Return the Clownfish::CFC::Model::Type for `self`.
*/
struct CFCType*
CFCMethod_self_type(CFCMethod *self);
void
CFCMethod_set_host_alias(CFCMethod *self, const char *alias);
const char*
CFCMethod_get_host_alias(CFCMethod *self);
void
CFCMethod_exclude_from_host(CFCMethod *self);
int
CFCMethod_excluded_from_host(CFCMethod *self);
const char*
CFCMethod_get_exposure(CFCMethod *self);
/** Return true if the method is fresh in `klass`.
*/
int
CFCMethod_is_fresh(CFCMethod *self, struct CFCClass *klass);
int
CFCMethod_public(CFCMethod *self);
struct CFCType*
CFCMethod_get_return_type(CFCMethod *self);
struct CFCParamList*
CFCMethod_get_param_list(CFCMethod *self);
char*
CFCMethod_imp_func(CFCMethod *self, struct CFCClass *klass);
char*
CFCMethod_short_imp_func(CFCMethod *self, struct CFCClass *klass);
#ifdef __cplusplus
}
#endif
#endif /* H_CFCMETHOD */