2017-10-02 23:24:00 +02:00
/*************************************************************************/
/* gd_mono_class.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
2019-01-01 12:53:14 +01:00
/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
2017-10-02 23:24:00 +02:00
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
2018-01-05 00:50:27 +01:00
2017-10-02 23:24:00 +02:00
# ifndef GD_MONO_CLASS_H
# define GD_MONO_CLASS_H
# include <mono/metadata/debug-helpers.h>
2018-09-11 18:13:45 +02:00
# include "core/map.h"
# include "core/ustring.h"
2017-10-02 23:24:00 +02:00
# include "gd_mono_field.h"
# include "gd_mono_header.h"
# include "gd_mono_method.h"
2018-01-04 21:05:46 +01:00
# include "gd_mono_property.h"
2017-10-02 23:24:00 +02:00
# include "gd_mono_utils.h"
class GDMonoClass {
struct MethodKey {
struct Hasher {
static _FORCE_INLINE_ uint32_t hash ( const MethodKey & p_key ) {
uint32_t hash = 0 ;
GDMonoUtils : : hash_combine ( hash , p_key . name . hash ( ) ) ;
GDMonoUtils : : hash_combine ( hash , HashMapHasherDefault : : hash ( p_key . params_count ) ) ;
return hash ;
}
} ;
_FORCE_INLINE_ bool operator = = ( const MethodKey & p_a ) const {
return p_a . params_count = = params_count & & p_a . name = = name ;
}
MethodKey ( ) { }
MethodKey ( const StringName & p_name , int p_params_count ) {
name = p_name ;
params_count = p_params_count ;
}
StringName name ;
int params_count ;
} ;
StringName namespace_name ;
StringName class_name ;
MonoClass * mono_class ;
GDMonoAssembly * assembly ;
bool attrs_fetched ;
MonoCustomAttrInfo * attributes ;
2018-11-01 16:35:16 +01:00
// This contains both the original method names and remapped method names from the native Godot identifiers to the C# functions.
// Most method-related functions refer to this and it's possible this is unintuitive for outside users; this may be a prime location for refactoring or renaming.
2017-10-02 23:24:00 +02:00
bool methods_fetched ;
HashMap < MethodKey , GDMonoMethod * , MethodKey : : Hasher > methods ;
2018-11-01 16:35:16 +01:00
bool method_list_fetched ;
Vector < GDMonoMethod * > method_list ;
2017-10-02 23:24:00 +02:00
bool fields_fetched ;
Map < StringName , GDMonoField * > fields ;
Vector < GDMonoField * > fields_list ;
2018-01-04 21:05:46 +01:00
bool properties_fetched ;
Map < StringName , GDMonoProperty * > properties ;
Vector < GDMonoProperty * > properties_list ;
2018-01-18 18:17:29 +01:00
bool delegates_fetched ;
Map < StringName , GDMonoClass * > delegates ;
Vector < GDMonoClass * > delegates_list ;
2017-10-02 23:24:00 +02:00
friend class GDMonoAssembly ;
GDMonoClass ( const StringName & p_namespace , const StringName & p_name , MonoClass * p_class , GDMonoAssembly * p_assembly ) ;
public :
2018-07-18 23:07:57 +02:00
static String get_full_name ( MonoClass * p_mono_class ) ;
static MonoType * get_mono_type ( MonoClass * p_mono_class ) ;
String get_full_name ( ) const ;
MonoType * get_mono_type ( ) ;
2017-10-02 23:24:00 +02:00
2019-02-19 22:36:27 +01:00
uint32_t get_flags ( ) const ;
bool is_static ( ) const ;
2017-10-02 23:24:00 +02:00
bool is_assignable_from ( GDMonoClass * p_from ) const ;
_FORCE_INLINE_ StringName get_namespace ( ) const { return namespace_name ; }
_FORCE_INLINE_ StringName get_name ( ) const { return class_name ; }
2018-01-04 21:05:46 +01:00
_FORCE_INLINE_ MonoClass * get_mono_ptr ( ) const { return mono_class ; }
2017-10-02 23:24:00 +02:00
_FORCE_INLINE_ const GDMonoAssembly * get_assembly ( ) const { return assembly ; }
GDMonoClass * get_parent_class ( ) ;
2017-10-17 14:02:19 +02:00
# ifdef TOOLS_ENABLED
Vector < MonoClassField * > get_enum_fields ( ) ;
# endif
2018-01-09 17:19:03 +01:00
GDMonoMethod * get_fetched_method_unknown_params ( const StringName & p_name ) ;
bool has_fetched_method_unknown_params ( const StringName & p_name ) ;
2017-10-02 23:24:00 +02:00
bool has_attribute ( GDMonoClass * p_attr_class ) ;
MonoObject * get_attribute ( GDMonoClass * p_attr_class ) ;
void fetch_attributes ( ) ;
void fetch_methods_with_godot_api_checks ( GDMonoClass * p_native_base ) ;
2018-01-09 17:19:03 +01:00
GDMonoMethod * get_method ( const StringName & p_name , int p_params_count = 0 ) ;
2017-10-02 23:24:00 +02:00
GDMonoMethod * get_method ( MonoMethod * p_raw_method ) ;
GDMonoMethod * get_method ( MonoMethod * p_raw_method , const StringName & p_name ) ;
GDMonoMethod * get_method ( MonoMethod * p_raw_method , const StringName & p_name , int p_params_count ) ;
2018-02-01 09:57:10 +01:00
GDMonoMethod * get_method_with_desc ( const String & p_description , bool p_include_namespace ) ;
2017-10-02 23:24:00 +02:00
2018-07-25 21:30:11 +02:00
void * get_method_thunk ( const StringName & p_name , int p_params_count = 0 ) ;
2017-10-02 23:24:00 +02:00
GDMonoField * get_field ( const StringName & p_name ) ;
const Vector < GDMonoField * > & get_all_fields ( ) ;
2018-01-04 21:05:46 +01:00
GDMonoProperty * get_property ( const StringName & p_name ) ;
const Vector < GDMonoProperty * > & get_all_properties ( ) ;
2018-01-18 18:17:29 +01:00
const Vector < GDMonoClass * > & get_all_delegates ( ) ;
2018-11-01 16:35:16 +01:00
const Vector < GDMonoMethod * > & get_all_methods ( ) ;
2017-10-02 23:24:00 +02:00
~ GDMonoClass ( ) ;
} ;
# endif // GD_MONO_CLASS_H