From d53f5b55ecee030da636b66b40afb3b4afd68a26 Mon Sep 17 00:00:00 2001 From: Thakee Nathees Date: Mon, 17 Aug 2020 12:54:01 +0530 Subject: [PATCH] Auto completion enhanced for extends and class level identifier --- modules/gdscript/gdscript_editor.cpp | 44 ++++++++++++++++++++++++++-- modules/gdscript/gdscript_parser.cpp | 18 ++++++++++++ modules/gdscript/gdscript_parser.h | 1 + 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 1069819bc3d..438230cb02e 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -519,18 +519,24 @@ struct GDScriptCompletionIdentifier { assigned_expression(NULL) {} }; -static void _get_directory_contents(EditorFileSystemDirectory *p_dir, Map &r_list) { +static void _get_directory_contents(EditorFileSystemDirectory *p_dir, Map &r_list, String p_ends_with = "") { const String quote_style = EDITOR_DEF("text_editor/completion/use_single_quotes", false) ? "'" : "\""; for (int i = 0; i < p_dir->get_file_count(); i++) { ScriptCodeCompletionOption option(p_dir->get_file_path(i), ScriptCodeCompletionOption::KIND_FILE_PATH); option.insert_text = quote_style + option.display + quote_style; - r_list.insert(option.display, option); + if (!p_ends_with.empty()) { + if (option.display.ends_with(p_ends_with)) { + r_list.insert(option.display, option); + } + } else { + r_list.insert(option.display, option); + } } for (int i = 0; i < p_dir->get_subdir_count(); i++) { - _get_directory_contents(p_dir->get_subdir(i), r_list); + _get_directory_contents(p_dir->get_subdir(i), r_list, p_ends_with); } } @@ -2579,6 +2585,38 @@ Error GDScriptLanguage::complete_code(const String &p_code, const String &p_path case GDScriptParser::COMPLETION_IDENTIFIER: { _find_identifiers(context, is_function, options); } break; + case GDScriptParser::COMPLETION_EXTENDS: { + + // Native classes. + List class_list; + ClassDB::get_class_list(&class_list); + for (int i = 0; i < class_list.size(); i++) { + ScriptCodeCompletionOption option(class_list[i], ScriptCodeCompletionOption::KIND_CLASS); + options.insert(option.display, option); + } + + // GDScript classes. + if (EditorSettings::get_singleton()->get("text_editor/completion/complete_file_paths")) { + for (int i = 0; i < ScriptServer::get_language_count(); i++) { + if (ScriptServer::get_language(i)->get_name() == "GDScript") { + List extensions; + ScriptServer::get_language(i)->get_recognized_extensions(&extensions); + for (List::Element *E = extensions.front(); E; E = E->next()) { + _get_directory_contents(EditorFileSystem::get_singleton()->get_filesystem(), options, String("." + E->get())); + } + } + } + r_forced = true; + } + + // Named Scripts. + List named_scripts; + ScriptServer::get_global_class_list(&named_scripts); + for (List::Element *E = named_scripts.front(); E; E = E->next()) { + ScriptCodeCompletionOption option(E->get().operator String(), ScriptCodeCompletionOption::KIND_CLASS); + options.insert(option.display, option); + } + } break; case GDScriptParser::COMPLETION_GET_NODE: { if (p_owner) { List opts; diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index f0f7e36dd80..9aec22a6b90 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -3575,6 +3575,14 @@ void GDScriptParser::_parse_extends(ClassNode *p_class) { case GDScriptTokenizer::TK_IDENTIFIER: { + completion_type = COMPLETION_EXTENDS; + completion_class = current_class; + completion_function = current_function; + completion_line = tokenizer->get_token_line(); + completion_block = current_block; + completion_ident_is_call = false; + completion_found = true; + StringName identifier = tokenizer->get_token_identifier(); p_class->extends_class.push_back(identifier); } break; @@ -5371,6 +5379,16 @@ void GDScriptParser::_parse_class(ClassNode *p_class) { default: { + if (token == GDScriptTokenizer::TK_IDENTIFIER) { + completion_type = COMPLETION_IDENTIFIER; + completion_class = current_class; + completion_function = current_function; + completion_line = tokenizer->get_token_line(); + completion_block = current_block; + completion_ident_is_call = false; + completion_found = true; + } + _set_error(String() + "Unexpected token: " + tokenizer->get_token_name(tokenizer->get_token()) + ":" + tokenizer->get_token_identifier()); return; diff --git a/modules/gdscript/gdscript_parser.h b/modules/gdscript/gdscript_parser.h index b785c9b5576..d03a10562b9 100644 --- a/modules/gdscript/gdscript_parser.h +++ b/modules/gdscript/gdscript_parser.h @@ -513,6 +513,7 @@ public: COMPLETION_GET_NODE, COMPLETION_FUNCTION, COMPLETION_IDENTIFIER, + COMPLETION_EXTENDS, COMPLETION_PARENT_FUNCTION, COMPLETION_METHOD, COMPLETION_CALL_ARGUMENTS,