### Godot version

4.2 247c354

### System information

Windows 10.0.19045 - Vulkan (Forward+) - dedicated NVIDIA GeForce GTX 1060 (NVIDIA; 30.0.15.1403) - Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz (8 Threads)

### Issue description

#75778 exposed `_validate_property()` to scripting. It's implemented in GDScript and C#, but not GDExtension (depends on #78634).
https://github.com/godotengine/godot/blob/247c3548d810136ffe9c1694cd76db3236efaa90/core/object/script_language_extension.h#L685-L687

Relevant discussion: https://github.com/godotengine/godot/pull/75778#discussion_r1307294940

### Steps to reproduce

1. Add GDExtension script
2. Use `_validate_property()`

### Minimal reproduction project

N/A
ate_script, ret);
		return Object::cast_to<Script>(ret);
	}
	EXBIND0RC(bool, has_named_classes)
	EXBIND0RC(bool, supports_builtin_mode)
	EXBIND0RC(bool, supports_documentation)
	EXBIND0RC(bool, can_inherit_from_file)
	EXBIND2RC(int, find_function, const String &, const String &)
	EXBIND3RC(String, make_function, const String &, const String &, const PackedStringArray &)
	EXBIND3R(Error, open_in_external_editor, const Ref<Script> &, int, int)
	EXBIND0R(bool, overrides_external_editor)
	GDVIRTUAL3RC(Dictionary, _complete_code, const String &, const String &, Object *)
	virtual Error complete_code(const String &p_code, const String &p_path, Object *p_owner, List<CodeCompletionOption> *r_options, bool &r_force, String &r_call_hint) override {
		Dictionary ret;
		GDVIRTUAL_REQUIRED_CALL(_complete_code, p_code, p_path, p_owner, ret);
		if (!ret.has("result")) {
			return ERR_UNAVAILABLE;
		}
		if (r_options != nullptr && ret.has("options")) {
			Array options = ret["options"];
			for (int i = 0; i < options.size(); i++) {
				Dictionary op = options[i];
				CodeCompletionOption option;
				ERR_CONTINUE(!op.has("kind"));
				option.kind = CodeCompletionKind(int(op["kind"]));
				ERR_CONTINUE(!op.has("display"));
				option.display = op["display"];
				ERR_CONTINUE(!op.has("insert_text"));
				option.insert_text = op["insert_text"];
				ERR_CONTINUE(!op.has("font_color"));
				option.font_color = op["font_color"];
				ERR_CONTINUE(!op.has("icon"));
				option.icon = op["icon"];
				ERR_CONTINUE(!op.has("default_value"));
				option.default_value = op["default_value"];
				ERR_CONTINUE(!op.has("location"));
				option.location = op["location"];
				if (op.has("matches")) {
					PackedInt32Array matches = op["matches"];
					ERR_CONTINUE(matches.size() & 1);
					for (int j = 0; j < matches.size(); j += 2) {
						option.matches.push_back(Pair<int, int>(matches[j], matches[j + 1]));
					}
				}
				r_options->push_back(option);
			}
		}
		ERR_FAIL_COND_V(!ret.has("force"), E