diff options
Diffstat (limited to 'editor/plugins/script_text_editor.cpp')
-rw-r--r-- | editor/plugins/script_text_editor.cpp | 86 |
1 files changed, 81 insertions, 5 deletions
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 5fdfb21176..321c0f34b5 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -282,6 +282,22 @@ void ScriptTextEditor::_error_clicked(Variant p_line) { if (p_line.get_type() == Variant::INT) { code_editor->get_text_editor()->remove_secondary_carets(); code_editor->get_text_editor()->set_caret_line(p_line.operator int64_t()); + } else if (p_line.get_type() == Variant::DICTIONARY) { + Dictionary meta = p_line.operator Dictionary(); + const String path = meta["path"].operator String(); + const int line = meta["line"].operator int64_t(); + const int column = meta["column"].operator int64_t(); + if (path.is_empty()) { + code_editor->get_text_editor()->remove_secondary_carets(); + code_editor->get_text_editor()->set_caret_line(line); + } else { + Ref<Resource> scr = ResourceLoader::load(path); + if (!scr.is_valid()) { + EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!")); + } else { + ScriptEditor::get_singleton()->edit(scr, line, column); + } + } } } @@ -458,9 +474,17 @@ void ScriptTextEditor::_validate_script() { warnings.clear(); errors.clear(); + depended_errors.clear(); safe_lines.clear(); if (!script->get_language()->validate(text, script->get_path(), &fnc, &errors, &warnings, &safe_lines)) { + for (List<ScriptLanguage::ScriptError>::Element *E = errors.front(); E; E = E->next()) { + if (E->get().path.is_empty() || E->get().path != script->get_path()) { + depended_errors[E->get().path].push_back(E->get()); + E->erase(); + } + } + // TRANSLATORS: Script error pointing to a line and column number. String error_text = vformat(TTR("Error at (%d, %d):"), errors[0].line, errors[0].column) + " " + errors[0].message; code_editor->set_error(error_text); @@ -560,6 +584,10 @@ void ScriptTextEditor::_update_errors() { errors_panel->clear(); errors_panel->push_table(2); for (const ScriptLanguage::ScriptError &err : errors) { + Dictionary click_meta; + click_meta["line"] = err.line; + click_meta["column"] = err.column; + errors_panel->push_cell(); errors_panel->push_meta(err.line - 1); errors_panel->push_color(warnings_panel->get_theme_color(SNAME("error_color"), SNAME("Editor"))); @@ -575,6 +603,41 @@ void ScriptTextEditor::_update_errors() { } errors_panel->pop(); // Table + for (const KeyValue<String, List<ScriptLanguage::ScriptError>> &KV : depended_errors) { + Dictionary click_meta; + click_meta["path"] = KV.key; + click_meta["line"] = 1; + + errors_panel->add_newline(); + errors_panel->add_newline(); + errors_panel->push_meta(click_meta); + errors_panel->add_text(vformat(R"(%s:)", KV.key)); + errors_panel->pop(); // Meta goto. + errors_panel->add_newline(); + + errors_panel->push_indent(1); + errors_panel->push_table(2); + String filename = KV.key.get_file(); + for (const ScriptLanguage::ScriptError &err : KV.value) { + click_meta["line"] = err.line; + click_meta["column"] = err.column; + + errors_panel->push_cell(); + errors_panel->push_meta(click_meta); + errors_panel->push_color(errors_panel->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + errors_panel->add_text(TTR("Line") + " " + itos(err.line) + ":"); + errors_panel->pop(); // Color. + errors_panel->pop(); // Meta goto. + errors_panel->pop(); // Cell. + + errors_panel->push_cell(); + errors_panel->add_text(err.message); + errors_panel->pop(); // Cell. + } + errors_panel->pop(); // Table + errors_panel->pop(); // Indent. + } + CodeEdit *te = code_editor->get_text_editor(); bool highlight_safe = EDITOR_GET("text_editor/appearance/gutters/highlight_type_safe_lines"); bool last_is_safe = false; @@ -811,6 +874,8 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c } ScriptLanguage::LookupResult result; + String code_text = code_editor->get_text_editor()->get_text_with_cursor_char(p_row, p_column); + Error lc_error = script->get_language()->lookup_code(code_text, p_symbol, script->get_path(), base, result); if (ScriptServer::is_global_class(p_symbol)) { EditorNode::get_singleton()->load_resource(ScriptServer::get_global_class_path(p_symbol)); } else if (p_symbol.is_resource_file()) { @@ -823,7 +888,7 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c EditorNode::get_singleton()->load_resource(p_symbol); } - } else if (script->get_language()->lookup_code(code_editor->get_text_editor()->get_text_for_symbol_lookup(), p_symbol, script->get_path(), base, result) == OK) { + } else if (lc_error == OK) { _goto_line(p_row); switch (result.type) { @@ -944,7 +1009,10 @@ void ScriptTextEditor::_validate_symbol(const String &p_symbol) { } ScriptLanguage::LookupResult result; - if (ScriptServer::is_global_class(p_symbol) || p_symbol.is_resource_file() || script->get_language()->lookup_code(code_editor->get_text_editor()->get_text_for_symbol_lookup(), p_symbol, script->get_path(), base, result) == OK || (ProjectSettings::get_singleton()->has_autoload(p_symbol) && ProjectSettings::get_singleton()->get_autoload(p_symbol).is_singleton)) { + String lc_text = code_editor->get_text_editor()->get_text_for_symbol_lookup(); + Error lc_error = script->get_language()->lookup_code(lc_text, p_symbol, script->get_path(), base, result); + bool is_singleton = ProjectSettings::get_singleton()->has_autoload(p_symbol) && ProjectSettings::get_singleton()->get_autoload(p_symbol).is_singleton; + if (ScriptServer::is_global_class(p_symbol) || p_symbol.is_resource_file() || lc_error == OK || is_singleton) { text_edit->set_symbol_lookup_word_as_valid(true); } else if (p_symbol.is_relative_path()) { String path = _get_absolute_path(p_symbol); @@ -1726,9 +1794,17 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data String variable_name = String(node->get_name()).to_snake_case().validate_identifier(); if (use_type) { - text_to_drop += vformat("@onready var %s: %s = %s%s\n", variable_name, node->get_class_name(), is_unique ? "%" : "$", path); + StringName class_name = node->get_class_name(); + Ref<Script> node_script = node->get_script(); + if (node_script.is_valid()) { + StringName global_node_script_name = node_script->get_global_name(); + if (global_node_script_name != StringName()) { + class_name = global_node_script_name; + } + } + text_to_drop += vformat("@onready var %s: %s = %c%s\n", variable_name, class_name, is_unique ? '%' : '$', path); } else { - text_to_drop += vformat("@onready var %s = %s%s\n", variable_name, is_unique ? "%" : "$", path); + text_to_drop += vformat("@onready var %s = %c%s\n", variable_name, is_unique ? '%' : '$', path); } } } else { @@ -1841,7 +1917,7 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { bool open_docs = false; bool goto_definition = false; - if (word_at_pos.is_resource_file()) { + if (ScriptServer::is_global_class(word_at_pos) || word_at_pos.is_resource_file()) { open_docs = true; } else { Node *base = get_tree()->get_edited_scene_root(); |