summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/class_db.cpp29
-rw-r--r--core/class_db.h2
-rw-r--r--core/make_binders.py20
-rw-r--r--core/method_bind.cpp46
-rw-r--r--core/method_bind.h52
-rw-r--r--core/object.cpp4
-rw-r--r--core/object.h19
-rw-r--r--core/reference.h8
-rw-r--r--core/script_language.h2
-rw-r--r--core/type_info.h85
10 files changed, 148 insertions, 119 deletions
diff --git a/core/class_db.cpp b/core/class_db.cpp
index 6cd7586a54..cd55219b53 100644
--- a/core/class_db.cpp
+++ b/core/class_db.cpp
@@ -538,9 +538,7 @@ void ClassDB::get_method_list(StringName p_class, List<MethodInfo> *p_methods, b
minfo.arguments.push_back(method->get_argument_info(i));
}
- if (method->get_argument_type(-1) != Variant::NIL) {
- minfo.return_val = method->get_argument_info(-1);
- }
+ minfo.return_val = method->get_return_info();
minfo.flags = method->get_hint_flags();
p_methods->push_back(minfo);
@@ -600,14 +598,23 @@ void ClassDB::bind_integer_constant(const StringName &p_class, const StringName
type->constant_map[p_name] = p_constant;
#ifdef DEBUG_METHODS_ENABLED
- List<StringName> *constants_list = type->enum_map.getptr(p_enum);
- if (constants_list) {
- constants_list->push_back(p_name);
- } else {
- List<StringName> new_list;
- new_list.push_back(p_name);
- type->enum_map[p_enum] = new_list;
+ String enum_name = p_enum;
+ if (enum_name!=String()) {
+ if (enum_name.find(".")!=-1) {
+ enum_name=enum_name.get_slicec('.',1);
+ }
+
+ List<StringName> *constants_list = type->enum_map.getptr(enum_name);
+
+ if (constants_list) {
+ constants_list->push_back(p_name);
+ } else {
+ List<StringName> new_list;
+ new_list.push_back(p_name);
+ type->enum_map[enum_name] = new_list;
+ }
+
}
type->constant_order.push_back(p_name);
@@ -680,7 +687,7 @@ StringName ClassDB::get_integer_constant_enum(const StringName &p_class, const S
List<StringName> &constants_list = type->enum_map.get(*k);
const List<StringName>::Element *found = constants_list.find(p_name);
if (found)
- return found->get();
+ return *k;
}
if (p_no_inheritance)
diff --git a/core/class_db.h b/core/class_db.h
index 8d9192adcc..0943cd36cc 100644
--- a/core/class_db.h
+++ b/core/class_db.h
@@ -457,7 +457,7 @@ public:
}
type->method_map[p_name] = bind;
#ifdef DEBUG_METHODS_ENABLED
- bind->set_return_type("Variant");
+// bind->set_return_type("Variant");
type->method_order.push_back(p_name);
#endif
diff --git a/core/make_binders.py b/core/make_binders.py
index a5cdb78443..0252bb638b 100644
--- a/core/make_binders.py
+++ b/core/make_binders.py
@@ -16,12 +16,11 @@ public:
$
return Variant::NIL;
}
- virtual StringName _gen_argument_type_name(int p_arg) const { return _gen_argument_type_hint(p_arg); }
- StringName _gen_argument_type_hint(int p_argument) const {
- $ifret if (p_argument==-1) return GetTypeInfo<R>::get_class_name();$
- $arg if (p_argument==(@-1)) return GetTypeInfo<P@>::get_class_name();
+ virtual PropertyInfo _gen_argument_type_info(int p_argument) const {
+ $ifret if (p_argument==-1) return GetTypeInfo<R>::get_class_info();$
+ $arg if (p_argument==(@-1)) return GetTypeInfo<P@>::get_class_info();
$
- return StringName();
+ return PropertyInfo();
}
#endif
virtual String get_instance_class() const {
@@ -104,14 +103,13 @@ public:
return Variant::NIL;
}
- virtual StringName _gen_argument_type_name(int p_arg) const { return _gen_argument_type_hint(p_arg); }
-
- StringName _gen_argument_type_hint(int p_argument) const {
- $ifret if (p_argument==-1) return GetTypeInfo<R>::get_class_name();$
- $arg if (p_argument==(@-1)) return GetTypeInfo<P@>::get_class_name();
+ virtual PropertyInfo _gen_argument_type_info(int p_argument) const {
+ $ifret if (p_argument==-1) return GetTypeInfo<R>::get_class_info();$
+ $arg if (p_argument==(@-1)) return GetTypeInfo<P@>::get_class_info();
$
- return StringName();
+ return PropertyInfo();
}
+
#endif
virtual String get_instance_class() const {
return type_name;
diff --git a/core/method_bind.cpp b/core/method_bind.cpp
index 6792b62703..660350b899 100644
--- a/core/method_bind.cpp
+++ b/core/method_bind.cpp
@@ -36,31 +36,16 @@
#ifdef DEBUG_METHODS_ENABLED
PropertyInfo MethodBind::get_argument_info(int p_argument) const {
- if (p_argument >= 0) {
+ ERR_FAIL_INDEX_V(p_argument, get_argument_count(), PropertyInfo());
- String name = p_argument < arg_names.size() ? String(arg_names[p_argument]) : String("arg" + itos(p_argument));
- PropertyInfo pi(get_argument_type(p_argument), name);
-
- if (!is_vararg() && pi.type == Variant::OBJECT) {
- StringName type_hint = arg_type_hints[p_argument];
-
- if (type_hint != StringName()) {
- pi.hint = PROPERTY_HINT_RESOURCE_TYPE;
- pi.hint_string = type_hint.operator String();
- }
- }
- return pi;
+ PropertyInfo info = _gen_argument_type_info(p_argument);
+ info.name = p_argument < arg_names.size() ? String(arg_names[p_argument]) : String("arg" + itos(p_argument));
+ return info;
+}
- } else {
+PropertyInfo MethodBind::get_return_info() const {
- Variant::Type at = get_argument_type(-1);
- if (at == Variant::OBJECT && ret_type)
- return PropertyInfo(at, "ret", PROPERTY_HINT_RESOURCE_TYPE, ret_type);
- else
- return PropertyInfo(at, "ret");
- }
-
- return PropertyInfo();
+ return _gen_argument_type_info(-1);
}
#endif
@@ -91,16 +76,6 @@ Vector<StringName> MethodBind::get_argument_names() const {
return arg_names;
}
-void MethodBind::set_argument_type_hints(const Vector<StringName> &p_type_hints) {
-
- arg_type_hints = p_type_hints;
-}
-
-Vector<StringName> MethodBind::get_argument_type_hints() const {
-
- return arg_type_hints;
-}
-
#endif
void MethodBind::set_default_arguments(const Vector<Variant> &p_defargs) {
@@ -114,18 +89,13 @@ void MethodBind::_generate_argument_types(int p_count) {
set_argument_count(p_count);
Variant::Type *argt = memnew_arr(Variant::Type, p_count + 1);
-
- arg_type_hints.resize(p_count);
-
argt[0] = _gen_argument_type(-1); // return type
- set_return_type(_gen_argument_type_hint(-1));
for (int i = 0; i < p_count; i++) {
argt[i + 1] = _gen_argument_type(i);
- arg_type_hints[i] = _gen_argument_type_hint(i);
}
- set_argument_types(argt);
+ argument_types = argt;
}
#endif
diff --git a/core/method_bind.h b/core/method_bind.h
index 157a67ca20..1f4c3ff66b 100644
--- a/core/method_bind.h
+++ b/core/method_bind.h
@@ -188,23 +188,22 @@ class MethodBind {
Vector<Variant> default_arguments;
int default_argument_count;
int argument_count;
-#ifdef DEBUG_METHODS_ENABLED
- Vector<StringName> arg_names;
- Vector<StringName> arg_type_hints;
- Variant::Type *argument_types;
- StringName ret_type;
-#endif
+
bool _const;
bool _returns;
protected:
+#ifdef DEBUG_METHODS_ENABLED
+ Variant::Type *argument_types;
+ Vector<StringName> arg_names;
+#endif
void _set_const(bool p_const);
void _set_returns(bool p_returns);
#ifdef DEBUG_METHODS_ENABLED
virtual Variant::Type _gen_argument_type(int p_arg) const = 0;
- virtual StringName _gen_argument_type_hint(int p_arg) const = 0;
+ virtual PropertyInfo _gen_argument_type_info(int p_arg) const = 0;
void _generate_argument_types(int p_count);
- void set_argument_types(Variant::Type *p_types) { argument_types = p_types; }
+
#endif
void set_argument_count(int p_count) { argument_count = p_count; }
@@ -234,9 +233,6 @@ public:
#ifdef DEBUG_METHODS_ENABLED
- _FORCE_INLINE_ void set_return_type(const StringName &p_type) { ret_type = p_type; }
- _FORCE_INLINE_ StringName get_return_type() const { return ret_type; }
-
_FORCE_INLINE_ Variant::Type get_argument_type(int p_argument) const {
ERR_FAIL_COND_V(p_argument < -1 || p_argument > argument_count, Variant::NIL);
@@ -244,12 +240,11 @@ public:
}
PropertyInfo get_argument_info(int p_argument) const;
+ PropertyInfo get_return_info() const;
- void set_argument_names(const Vector<StringName> &p_names);
+ void set_argument_names(const Vector<StringName> &p_names); //set by class, db, cant be inferred otherwise
Vector<StringName> get_argument_names() const;
- void set_argument_type_hints(const Vector<StringName> &p_type_hints);
- Vector<StringName> get_argument_type_hints() const;
#endif
void set_hint_flags(uint32_t p_hint) { hint_flags = p_hint; }
uint32_t get_hint_flags() const { return hint_flags | (is_const() ? METHOD_FLAG_CONST : 0) | (is_vararg() ? METHOD_FLAG_VARARG : 0); }
@@ -305,18 +300,36 @@ public:
protected:
NativeCall call_method;
+#ifdef DEBUG_METHODS_ENABLED
+
+ MethodInfo arguments;
+#endif
public:
- virtual Variant::Type _gen_argument_type(int p_arg) const {
+#ifdef DEBUG_METHODS_ENABLED
- return Variant::NIL;
+ virtual PropertyInfo _gen_argument_type_info(int p_arg) const {
+
+ if (p_arg < 0) {
+ return arguments.return_val;
+ } else if (p_arg < arguments.arguments.size()) {
+ return arguments.arguments[p_arg];
+ } else {
+ return PropertyInfo(Variant::NIL, "arg_" + itos(p_arg), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT);
+ }
}
- virtual StringName _gen_argument_type_hint(int p_arg) const {
+ virtual Variant::Type _gen_argument_type(int p_arg) const {
+ return _gen_argument_type_info(p_arg).type;
+ }
+
+#else
- return "Variant";
+ virtual Variant::Type _gen_argument_type(int p_arg) const {
+ return Variant::NIL;
}
+#endif
virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Variant::CallError &r_error) {
T *instance = static_cast<T *>(p_object);
@@ -341,7 +354,8 @@ public:
set_argument_names(names);
}
- set_argument_types(at);
+ argument_types = at;
+ arguments = p_info;
#endif
}
diff --git a/core/object.cpp b/core/object.cpp
index a43a9c85b1..928e9bb978 100644
--- a/core/object.cpp
+++ b/core/object.cpp
@@ -65,6 +65,7 @@ PropertyInfo::operator Dictionary() const {
Dictionary d;
d["name"] = name;
+ d["class_name"] = class_name;
d["type"] = type;
d["hint"] = hint;
d["hint_string"] = hint_string;
@@ -82,6 +83,9 @@ PropertyInfo PropertyInfo::from_dict(const Dictionary &p_dict) {
if (p_dict.has("name"))
pi.name = p_dict["name"];
+ if (p_dict.has("class_name"))
+ pi.class_name = p_dict["class_name"];
+
if (p_dict.has("hint"))
pi.hint = PropertyHint(int(p_dict["hint"]));
diff --git a/core/object.h b/core/object.h
index 8a858b5b00..43d77ed49d 100644
--- a/core/object.h
+++ b/core/object.h
@@ -107,6 +107,8 @@ enum PropertyUsageFlags {
PROPERTY_USAGE_ANIMATE_AS_TRIGGER = 32768,
PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED = 65536,
PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE = 1 << 17,
+ PROPERTY_USAGE_CLASS_IS_ENUM = 1 << 18,
+ PROPERTY_USAGE_NIL_IS_VARIANT = 1 << 19,
PROPERTY_USAGE_DEFAULT = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK,
PROPERTY_USAGE_DEFAULT_INTL = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK | PROPERTY_USAGE_INTERNATIONALIZED,
@@ -126,6 +128,7 @@ struct PropertyInfo {
Variant::Type type;
String name;
+ StringName class_name; //for classes
PropertyHint hint;
String hint_string;
uint32_t usage;
@@ -145,13 +148,27 @@ struct PropertyInfo {
hint(PROPERTY_HINT_NONE),
usage(PROPERTY_USAGE_DEFAULT) {
}
- PropertyInfo(Variant::Type p_type, const String p_name, PropertyHint p_hint = PROPERTY_HINT_NONE, const String &p_hint_string = "", uint32_t p_usage = PROPERTY_USAGE_DEFAULT)
+ PropertyInfo(Variant::Type p_type, const String p_name, PropertyHint p_hint = PROPERTY_HINT_NONE, const String &p_hint_string = "", uint32_t p_usage = PROPERTY_USAGE_DEFAULT, const StringName &p_class_name = StringName())
: type(p_type),
name(p_name),
hint(p_hint),
hint_string(p_hint_string),
usage(p_usage) {
+
+ if (hint == PROPERTY_HINT_RESOURCE_TYPE) {
+ class_name = hint_string;
+ } else {
+ class_name = p_class_name;
+ }
+ }
+ PropertyInfo(const StringName &p_class_name)
+ : type(Variant::OBJECT),
+ hint(PROPERTY_HINT_NONE),
+ usage(PROPERTY_USAGE_DEFAULT) {
+
+ class_name = p_class_name;
}
+
bool operator<(const PropertyInfo &p_info) const {
return name < p_info.name;
}
diff --git a/core/reference.h b/core/reference.h
index 69250a4701..764c924cdb 100644
--- a/core/reference.h
+++ b/core/reference.h
@@ -382,8 +382,8 @@ template <class T>
struct GetTypeInfo<Ref<T> > {
enum { VARIANT_TYPE = Variant::OBJECT };
- static inline StringName get_class_name() {
- return T::get_class_static();
+ static inline PropertyInfo get_class_info() {
+ return PropertyInfo(Variant::OBJECT, String(), PROPERTY_HINT_RESOURCE_TYPE, T::get_class_static());
}
};
@@ -391,8 +391,8 @@ template <class T>
struct GetTypeInfo<const Ref<T> &> {
enum { VARIANT_TYPE = Variant::OBJECT };
- static inline StringName get_class_name() {
- return T::get_class_static();
+ static inline PropertyInfo get_class_info() {
+ return PropertyInfo(Variant::OBJECT, String(), PROPERTY_HINT_RESOURCE_TYPE, T::get_class_static());
}
};
diff --git a/core/script_language.h b/core/script_language.h
index 7aba3ec0f1..5baf2e6f80 100644
--- a/core/script_language.h
+++ b/core/script_language.h
@@ -207,7 +207,7 @@ public:
virtual String make_function(const String &p_class, const String &p_name, const PoolStringArray &p_args) const = 0;
virtual Error open_in_external_editor(const Ref<Script> &p_script, int p_line, int p_col) { return ERR_UNAVAILABLE; }
- virtual Error complete_code(const String &p_code, const String &p_base_path, Object *p_owner, List<String> *r_options, String &r_call_hint) { return ERR_UNAVAILABLE; }
+ virtual Error complete_code(const String &p_code, const String &p_base_path, Object *p_owner, List<String> *r_options, bool &r_force, String &r_call_hint) { return ERR_UNAVAILABLE; }
struct LookupResult {
enum Type {
diff --git a/core/type_info.h b/core/type_info.h
index 0603126996..a7d3fa20c8 100644
--- a/core/type_info.h
+++ b/core/type_info.h
@@ -41,9 +41,9 @@ template <class T, typename = void>
struct GetTypeInfo {
enum { VARIANT_TYPE = Variant::NIL };
- static inline StringName get_class_name() {
+ static inline PropertyInfo get_class_info() {
ERR_PRINT("GetTypeInfo fallback. Bug!");
- return StringName(); // Not "Nil", this is an error
+ return PropertyInfo(); // Not "Nil", this is an error
}
};
@@ -51,15 +51,15 @@ struct GetTypeInfo {
template <> \
struct GetTypeInfo<m_type> { \
enum { VARIANT_TYPE = m_var_type }; \
- static inline StringName get_class_name() { \
- return Variant::get_type_name((Variant::Type)VARIANT_TYPE); \
+ static inline PropertyInfo get_class_info() { \
+ return PropertyInfo((Variant::Type)VARIANT_TYPE,String()); \
} \
}; \
template <> \
struct GetTypeInfo<const m_type &> { \
enum { VARIANT_TYPE = m_var_type }; \
- static inline StringName get_class_name() { \
- return Variant::get_type_name((Variant::Type)VARIANT_TYPE); \
+ static inline PropertyInfo get_class_info() { \
+ return PropertyInfo((Variant::Type)VARIANT_TYPE,String()); \
} \
};
@@ -105,38 +105,54 @@ MAKE_TYPE_INFO(IP_Address, Variant::STRING)
class BSP_Tree;
MAKE_TYPE_INFO(BSP_Tree, Variant::DICTIONARY)
-#define MAKE_TYPE_INFO_WITH_NAME(m_type, m_var_type, m_class_name) \
- template <> \
- struct GetTypeInfo<m_type> { \
- enum { VARIANT_TYPE = m_var_type }; \
- static inline StringName get_class_name() { \
- return m_class_name; \
- } \
- }; \
- template <> \
- struct GetTypeInfo<const m_type &> { \
- enum { VARIANT_TYPE = m_var_type }; \
- static inline StringName get_class_name() { \
- return m_class_name; \
- } \
- };
+//for RefPtr
+template <>
+struct GetTypeInfo<RefPtr> {
+ enum { VARIANT_TYPE = Variant::OBJECT };
+ static inline PropertyInfo get_class_info() {
+ return PropertyInfo(Variant::OBJECT,String(),PROPERTY_HINT_RESOURCE_TYPE,"Reference");
+ }
+};
+template <>
+struct GetTypeInfo<const RefPtr &> {
+ enum { VARIANT_TYPE = Variant::OBJECT };
+ static inline PropertyInfo get_class_info() {
+ return PropertyInfo(Variant::OBJECT,String(),PROPERTY_HINT_RESOURCE_TYPE,"Reference");
+ }
+};
+
+
+//for variant
+template<>
+struct GetTypeInfo<Variant> {
+ enum { VARIANT_TYPE = Variant::NIL };
+ static inline PropertyInfo get_class_info() {
+ return PropertyInfo(Variant::NIL,String(),PROPERTY_HINT_NONE,String(),PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_NIL_IS_VARIANT);
+ }
+};
+
+template<>
+struct GetTypeInfo<const Variant&> {
+ enum { VARIANT_TYPE = Variant::NIL };
+ static inline PropertyInfo get_class_info() {
+ return PropertyInfo(Variant::NIL,String(),PROPERTY_HINT_NONE,String(),PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_NIL_IS_VARIANT);
+ }
+};
-MAKE_TYPE_INFO_WITH_NAME(RefPtr, Variant::OBJECT, "Reference")
-MAKE_TYPE_INFO_WITH_NAME(Variant, Variant::NIL, "Variant")
#define MAKE_TEMPLATE_TYPE_INFO(m_template, m_type, m_var_type) \
template <> \
struct GetTypeInfo<m_template<m_type> > { \
enum { VARIANT_TYPE = m_var_type }; \
- static inline StringName get_class_name() { \
- return Variant::get_type_name((Variant::Type)VARIANT_TYPE); \
+ static inline PropertyInfo get_class_info() { \
+ return PropertyInfo((Variant::Type)VARIANT_TYPE,String()); \
} \
}; \
template <> \
struct GetTypeInfo<const m_template<m_type> &> { \
enum { VARIANT_TYPE = m_var_type }; \
- static inline StringName get_class_name() { \
- return Variant::get_type_name((Variant::Type)VARIANT_TYPE); \
+ static inline PropertyInfo get_class_info() { \
+ return PropertyInfo((Variant::Type)VARIANT_TYPE,String()); \
} \
};
@@ -159,17 +175,18 @@ template <typename T>
struct GetTypeInfo<T *, typename EnableIf<TypeInherits<Object, T>::value>::type> {
enum { VARIANT_TYPE = Variant::OBJECT };
- static inline StringName get_class_name() {
- return T::get_class_static();
+ static inline PropertyInfo get_class_info() {
+ return PropertyInfo(StringName(T::get_class_static()));
}
+
};
template <typename T>
struct GetTypeInfo<const T *, typename EnableIf<TypeInherits<Object, T>::value>::type> {
enum { VARIANT_TYPE = Variant::OBJECT };
- static inline StringName get_class_name() {
- return T::get_class_static();
+ static inline PropertyInfo get_class_info() {
+ return PropertyInfo(StringName(T::get_class_static()));
}
};
@@ -177,7 +194,9 @@ struct GetTypeInfo<const T *, typename EnableIf<TypeInherits<Object, T>::value>:
template <> \
struct GetTypeInfo<m_impl> { \
enum { VARIANT_TYPE = Variant::INT }; \
- static inline StringName get_class_name() { return "enum." #m_enum; } \
+ static inline PropertyInfo get_class_info() { \
+ return PropertyInfo(Variant::INT,String(),PROPERTY_HINT_NONE,String(),PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_CLASS_IS_ENUM,String(#m_enum).replace("::",".")); \
+ } \
};
#define MAKE_ENUM_TYPE_INFO(m_enum) \
@@ -190,7 +209,7 @@ template <typename T>
inline StringName __constant_get_enum_name(T param, const String &p_constant) {
if (GetTypeInfo<T>::VARIANT_TYPE == Variant::NIL)
ERR_PRINTS("Missing VARIANT_ENUM_CAST for constant's enum: " + p_constant);
- return GetTypeInfo<T>::get_class_name();
+ return GetTypeInfo<T>::get_class_info().class_name;
}
#else