|
@@ -1107,99 +1107,112 @@ void ScriptTextEditor::_show_symbol_tooltip(const String &p_symbol, int p_row, i
|
|
}
|
|
}
|
|
|
|
|
|
ScriptLanguage::LookupResult result;
|
|
ScriptLanguage::LookupResult result;
|
|
|
|
+ String doc_symbol;
|
|
const String code_text = code_editor->get_text_editor()->get_text_with_cursor_char(p_row, p_column);
|
|
const String code_text = code_editor->get_text_editor()->get_text_with_cursor_char(p_row, p_column);
|
|
const Error lc_error = script->get_language()->lookup_code(code_text, p_symbol, script->get_path(), base, result);
|
|
const Error lc_error = script->get_language()->lookup_code(code_text, p_symbol, script->get_path(), base, result);
|
|
- if (lc_error != OK) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- String doc_symbol;
|
|
|
|
- switch (result.type) {
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_CLASS: {
|
|
|
|
- doc_symbol = "class|" + result.class_name + "|";
|
|
|
|
- } break;
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_CLASS_CONSTANT: {
|
|
|
|
- StringName cname = result.class_name;
|
|
|
|
- while (ClassDB::class_exists(cname)) {
|
|
|
|
- if (ClassDB::has_integer_constant(cname, result.class_member, true)) {
|
|
|
|
- result.class_name = cname;
|
|
|
|
- break;
|
|
|
|
|
|
+ if (lc_error == OK) {
|
|
|
|
+ switch (result.type) {
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_CLASS: {
|
|
|
|
+ doc_symbol = "class|" + result.class_name + "|";
|
|
|
|
+ } break;
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_CLASS_CONSTANT: {
|
|
|
|
+ StringName cname = result.class_name;
|
|
|
|
+ while (ClassDB::class_exists(cname)) {
|
|
|
|
+ if (ClassDB::has_integer_constant(cname, result.class_member, true)) {
|
|
|
|
+ result.class_name = cname;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ cname = ClassDB::get_parent_class(cname);
|
|
}
|
|
}
|
|
- cname = ClassDB::get_parent_class(cname);
|
|
|
|
- }
|
|
|
|
- doc_symbol = "constant|" + result.class_name + "|" + result.class_member;
|
|
|
|
- } break;
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_CLASS_PROPERTY: {
|
|
|
|
- StringName cname = result.class_name;
|
|
|
|
- while (ClassDB::class_exists(cname)) {
|
|
|
|
- if (ClassDB::has_property(cname, result.class_member, true)) {
|
|
|
|
- result.class_name = cname;
|
|
|
|
- break;
|
|
|
|
|
|
+ doc_symbol = "constant|" + result.class_name + "|" + result.class_member;
|
|
|
|
+ } break;
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_CLASS_PROPERTY: {
|
|
|
|
+ StringName cname = result.class_name;
|
|
|
|
+ while (ClassDB::class_exists(cname)) {
|
|
|
|
+ if (ClassDB::has_property(cname, result.class_member, true)) {
|
|
|
|
+ result.class_name = cname;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ cname = ClassDB::get_parent_class(cname);
|
|
}
|
|
}
|
|
- cname = ClassDB::get_parent_class(cname);
|
|
|
|
- }
|
|
|
|
- doc_symbol = "property|" + result.class_name + "|" + result.class_member;
|
|
|
|
- } break;
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_CLASS_METHOD: {
|
|
|
|
- StringName cname = result.class_name;
|
|
|
|
- while (ClassDB::class_exists(cname)) {
|
|
|
|
- if (ClassDB::has_method(cname, result.class_member, true)) {
|
|
|
|
- result.class_name = cname;
|
|
|
|
- break;
|
|
|
|
|
|
+ doc_symbol = "property|" + result.class_name + "|" + result.class_member;
|
|
|
|
+ } break;
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_CLASS_METHOD: {
|
|
|
|
+ StringName cname = result.class_name;
|
|
|
|
+ while (ClassDB::class_exists(cname)) {
|
|
|
|
+ if (ClassDB::has_method(cname, result.class_member, true)) {
|
|
|
|
+ result.class_name = cname;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ cname = ClassDB::get_parent_class(cname);
|
|
}
|
|
}
|
|
- cname = ClassDB::get_parent_class(cname);
|
|
|
|
- }
|
|
|
|
- doc_symbol = "method|" + result.class_name + "|" + result.class_member;
|
|
|
|
- } break;
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_CLASS_SIGNAL: {
|
|
|
|
- StringName cname = result.class_name;
|
|
|
|
- while (ClassDB::class_exists(cname)) {
|
|
|
|
- if (ClassDB::has_signal(cname, result.class_member, true)) {
|
|
|
|
- result.class_name = cname;
|
|
|
|
- break;
|
|
|
|
|
|
+ doc_symbol = "method|" + result.class_name + "|" + result.class_member;
|
|
|
|
+ } break;
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_CLASS_SIGNAL: {
|
|
|
|
+ StringName cname = result.class_name;
|
|
|
|
+ while (ClassDB::class_exists(cname)) {
|
|
|
|
+ if (ClassDB::has_signal(cname, result.class_member, true)) {
|
|
|
|
+ result.class_name = cname;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ cname = ClassDB::get_parent_class(cname);
|
|
}
|
|
}
|
|
- cname = ClassDB::get_parent_class(cname);
|
|
|
|
- }
|
|
|
|
- doc_symbol = "signal|" + result.class_name + "|" + result.class_member;
|
|
|
|
- } break;
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_CLASS_ENUM: {
|
|
|
|
- StringName cname = result.class_name;
|
|
|
|
- while (ClassDB::class_exists(cname)) {
|
|
|
|
- if (ClassDB::has_enum(cname, result.class_member, true)) {
|
|
|
|
- result.class_name = cname;
|
|
|
|
- break;
|
|
|
|
|
|
+ doc_symbol = "signal|" + result.class_name + "|" + result.class_member;
|
|
|
|
+ } break;
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_CLASS_ENUM: {
|
|
|
|
+ StringName cname = result.class_name;
|
|
|
|
+ while (ClassDB::class_exists(cname)) {
|
|
|
|
+ if (ClassDB::has_enum(cname, result.class_member, true)) {
|
|
|
|
+ result.class_name = cname;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ cname = ClassDB::get_parent_class(cname);
|
|
}
|
|
}
|
|
- cname = ClassDB::get_parent_class(cname);
|
|
|
|
- }
|
|
|
|
- doc_symbol = "enum|" + result.class_name + "|" + result.class_member;
|
|
|
|
- } break;
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_CLASS_ANNOTATION: {
|
|
|
|
- doc_symbol = "annotation|" + result.class_name + "|" + result.class_member;
|
|
|
|
- } break;
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_LOCAL_CONSTANT:
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_LOCAL_VARIABLE: {
|
|
|
|
- const String item_type = (result.type == ScriptLanguage::LOOKUP_RESULT_LOCAL_CONSTANT) ? "local_constant" : "local_variable";
|
|
|
|
- Dictionary item_data;
|
|
|
|
- item_data["description"] = result.description;
|
|
|
|
- item_data["is_deprecated"] = result.is_deprecated;
|
|
|
|
- item_data["deprecated_message"] = result.deprecated_message;
|
|
|
|
- item_data["is_experimental"] = result.is_experimental;
|
|
|
|
- item_data["experimental_message"] = result.experimental_message;
|
|
|
|
- item_data["doc_type"] = result.doc_type;
|
|
|
|
- item_data["enumeration"] = result.enumeration;
|
|
|
|
- item_data["is_bitfield"] = result.is_bitfield;
|
|
|
|
- item_data["value"] = result.value;
|
|
|
|
- doc_symbol = item_type + "||" + p_symbol + "|" + JSON::stringify(item_data);
|
|
|
|
- } break;
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_SCRIPT_LOCATION:
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_CLASS_TBD_GLOBALSCOPE: // Deprecated.
|
|
|
|
- case ScriptLanguage::LOOKUP_RESULT_MAX: {
|
|
|
|
- // Nothing to do.
|
|
|
|
- } break;
|
|
|
|
|
|
+ doc_symbol = "enum|" + result.class_name + "|" + result.class_member;
|
|
|
|
+ } break;
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_CLASS_ANNOTATION: {
|
|
|
|
+ doc_symbol = "annotation|" + result.class_name + "|" + result.class_member;
|
|
|
|
+ } break;
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_LOCAL_CONSTANT:
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_LOCAL_VARIABLE: {
|
|
|
|
+ const String item_type = (result.type == ScriptLanguage::LOOKUP_RESULT_LOCAL_CONSTANT) ? "local_constant" : "local_variable";
|
|
|
|
+ Dictionary item_data;
|
|
|
|
+ item_data["description"] = result.description;
|
|
|
|
+ item_data["is_deprecated"] = result.is_deprecated;
|
|
|
|
+ item_data["deprecated_message"] = result.deprecated_message;
|
|
|
|
+ item_data["is_experimental"] = result.is_experimental;
|
|
|
|
+ item_data["experimental_message"] = result.experimental_message;
|
|
|
|
+ item_data["doc_type"] = result.doc_type;
|
|
|
|
+ item_data["enumeration"] = result.enumeration;
|
|
|
|
+ item_data["is_bitfield"] = result.is_bitfield;
|
|
|
|
+ item_data["value"] = result.value;
|
|
|
|
+ doc_symbol = item_type + "||" + p_symbol + "|" + JSON::stringify(item_data);
|
|
|
|
+ } break;
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_SCRIPT_LOCATION:
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_CLASS_TBD_GLOBALSCOPE: // Deprecated.
|
|
|
|
+ case ScriptLanguage::LOOKUP_RESULT_MAX: {
|
|
|
|
+ // Nothing to do.
|
|
|
|
+ } break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String debug_value = EditorDebuggerNode::get_singleton()->get_var_value(p_symbol);
|
|
|
|
+ if (!debug_value.is_empty()) {
|
|
|
|
+ constexpr int DISPLAY_LIMIT = 1024;
|
|
|
|
+ if (debug_value.size() > DISPLAY_LIMIT) {
|
|
|
|
+ debug_value = debug_value.left(DISPLAY_LIMIT) + "... " + TTR("(truncated)");
|
|
|
|
+ }
|
|
|
|
+ debug_value = debug_value.replace("[", "[lb]");
|
|
|
|
+
|
|
|
|
+ if (doc_symbol.is_empty()) {
|
|
|
|
+ debug_value = p_symbol + ": " + debug_value;
|
|
|
|
+ } else {
|
|
|
|
+ debug_value = TTR("Current value: ") + debug_value;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- if (!doc_symbol.is_empty()) {
|
|
|
|
- EditorHelpBitTooltip::show_tooltip(code_editor->get_text_editor(), doc_symbol, String(), true);
|
|
|
|
|
|
+ if (!doc_symbol.is_empty() || !debug_value.is_empty()) {
|
|
|
|
+ EditorHelpBitTooltip::show_tooltip(code_editor->get_text_editor(), doc_symbol, debug_value, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|