Assorted enum and native type fixes
This commit is contained in:
@ -995,9 +995,8 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base
|
||||
ERR_FAIL_COND(p_recursion_depth > COMPLETION_RECURSION_LIMIT);
|
||||
|
||||
GDScriptParser::DataType base_type = p_base.type;
|
||||
bool _static = base_type.is_meta_type;
|
||||
|
||||
if (_static && base_type.kind != GDScriptParser::DataType::BUILTIN) {
|
||||
if (base_type.is_meta_type && base_type.kind != GDScriptParser::DataType::BUILTIN && base_type.kind != GDScriptParser::DataType::ENUM) {
|
||||
ScriptLanguage::CodeCompletionOption option("new", ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, ScriptLanguage::LOCATION_LOCAL);
|
||||
option.insert_text += "(";
|
||||
r_result.insert(option.display, option);
|
||||
@ -1006,7 +1005,7 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base
|
||||
while (!base_type.has_no_type()) {
|
||||
switch (base_type.kind) {
|
||||
case GDScriptParser::DataType::CLASS: {
|
||||
_find_identifiers_in_class(base_type.class_type, p_only_functions, _static, false, r_result, p_recursion_depth + 1);
|
||||
_find_identifiers_in_class(base_type.class_type, p_only_functions, base_type.is_meta_type, false, r_result, p_recursion_depth + 1);
|
||||
// This already finds all parent identifiers, so we are done.
|
||||
base_type = GDScriptParser::DataType();
|
||||
} break;
|
||||
@ -1014,7 +1013,7 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base
|
||||
Ref<Script> scr = base_type.script_type;
|
||||
if (scr.is_valid()) {
|
||||
if (!p_only_functions) {
|
||||
if (!_static) {
|
||||
if (!base_type.is_meta_type) {
|
||||
List<PropertyInfo> members;
|
||||
scr->get_script_property_list(&members);
|
||||
for (const PropertyInfo &E : members) {
|
||||
@ -1090,7 +1089,7 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base
|
||||
r_result.insert(option.display, option);
|
||||
}
|
||||
|
||||
if (!_static || Engine::get_singleton()->has_singleton(type)) {
|
||||
if (!base_type.is_meta_type || Engine::get_singleton()->has_singleton(type)) {
|
||||
List<PropertyInfo> pinfo;
|
||||
ClassDB::get_property_list(type, &pinfo);
|
||||
for (const PropertyInfo &E : pinfo) {
|
||||
@ -1107,7 +1106,7 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base
|
||||
}
|
||||
}
|
||||
|
||||
bool only_static = _static && !Engine::get_singleton()->has_singleton(type);
|
||||
bool only_static = base_type.is_meta_type && !Engine::get_singleton()->has_singleton(type);
|
||||
|
||||
List<MethodInfo> methods;
|
||||
ClassDB::get_method_list(type, &methods, false, true);
|
||||
@ -1129,6 +1128,7 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base
|
||||
}
|
||||
return;
|
||||
} break;
|
||||
case GDScriptParser::DataType::ENUM:
|
||||
case GDScriptParser::DataType::BUILTIN: {
|
||||
Callable::CallError err;
|
||||
Variant tmp;
|
||||
@ -1156,6 +1156,10 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base
|
||||
List<MethodInfo> methods;
|
||||
tmp.get_method_list(&methods);
|
||||
for (const MethodInfo &E : methods) {
|
||||
if (base_type.kind == GDScriptParser::DataType::ENUM && base_type.is_meta_type && !(E.flags & METHOD_FLAG_CONST)) {
|
||||
// Enum types are static and cannot change, therefore we skip non-const dictionary methods.
|
||||
continue;
|
||||
}
|
||||
ScriptLanguage::CodeCompletionOption option(E.name, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION);
|
||||
if (E.arguments.size()) {
|
||||
option.insert_text += "(";
|
||||
@ -1364,6 +1368,9 @@ static bool _guess_expression_type(GDScriptParser::CompletionContext &p_context,
|
||||
if (p_expression->is_constant) {
|
||||
// Already has a value, so just use that.
|
||||
r_type = _type_from_variant(p_expression->reduced_value);
|
||||
if (p_expression->get_datatype().kind == GDScriptParser::DataType::ENUM) {
|
||||
r_type.type = p_expression->get_datatype();
|
||||
}
|
||||
found = true;
|
||||
} else {
|
||||
switch (p_expression->type) {
|
||||
|
||||
Reference in New Issue
Block a user