Fix lookup code to pass functions with the same name as built-ins

This commit is contained in:
Yuri Rubinsky 2022-11-28 15:36:51 +03:00
parent 166066d9f7
commit afbea19a22
1 changed files with 15 additions and 11 deletions

View File

@ -3265,15 +3265,6 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co
} }
} }
// Need special checks for assert and preload as they are technically
// keywords, so are not registered in GDScriptUtilityFunctions.
if (GDScriptUtilityFunctions::function_exists(p_symbol) || "assert" == p_symbol || "preload" == p_symbol) {
r_result.type = ScriptLanguage::LOOKUP_RESULT_CLASS_METHOD;
r_result.class_name = "@GDScript";
r_result.class_member = p_symbol;
return OK;
}
if ("PI" == p_symbol || "TAU" == p_symbol || "INF" == p_symbol || "NAN" == p_symbol) { if ("PI" == p_symbol || "TAU" == p_symbol || "INF" == p_symbol || "NAN" == p_symbol) {
r_result.type = ScriptLanguage::LOOKUP_RESULT_CLASS_CONSTANT; r_result.type = ScriptLanguage::LOOKUP_RESULT_CLASS_CONSTANT;
r_result.class_name = "@GDScript"; r_result.class_name = "@GDScript";
@ -3283,11 +3274,24 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co
GDScriptParser parser; GDScriptParser parser;
parser.parse(p_code, p_path, true); parser.parse(p_code, p_path, true);
GDScriptAnalyzer analyzer(&parser);
analyzer.analyze();
GDScriptParser::CompletionContext context = parser.get_completion_context(); GDScriptParser::CompletionContext context = parser.get_completion_context();
// Allows class functions with the names like built-ins to be handled properly.
if (context.type != GDScriptParser::COMPLETION_ATTRIBUTE) {
// Need special checks for assert and preload as they are technically
// keywords, so are not registered in GDScriptUtilityFunctions.
if (GDScriptUtilityFunctions::function_exists(p_symbol) || "assert" == p_symbol || "preload" == p_symbol) {
r_result.type = ScriptLanguage::LOOKUP_RESULT_CLASS_METHOD;
r_result.class_name = "@GDScript";
r_result.class_member = p_symbol;
return OK;
}
}
GDScriptAnalyzer analyzer(&parser);
analyzer.analyze();
if (context.current_class && context.current_class->extends.size() > 0) { if (context.current_class && context.current_class->extends.size() > 0) {
bool success = false; bool success = false;
ClassDB::get_integer_constant(context.current_class->extends[0], p_symbol, &success); ClassDB::get_integer_constant(context.current_class->extends[0], p_symbol, &success);