summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/gdscript/gdscript_analyzer.cpp2
-rw-r--r--modules/gdscript/tests/scripts/analyzer/features/warning_ignore_annotation.gd2
-rw-r--r--modules/gdscript/tests/scripts/analyzer/warnings/redundant_await.gd53
-rw-r--r--modules/gdscript/tests/scripts/analyzer/warnings/redundant_await.out37
-rw-r--r--modules/gdscript/tests/scripts/runtime/features/await_without_coroutine.gd2
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/Array.cs6
-rw-r--r--modules/multiplayer/scene_replication_config.cpp16
-rw-r--r--modules/openxr/register_types.cpp18
-rw-r--r--modules/openxr/scene/openxr_hand.cpp2
9 files changed, 124 insertions, 14 deletions
diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp
index 38d5ae6b77..c233d51801 100644
--- a/modules/gdscript/gdscript_analyzer.cpp
+++ b/modules/gdscript/gdscript_analyzer.cpp
@@ -2548,7 +2548,7 @@ void GDScriptAnalyzer::reduce_await(GDScriptParser::AwaitNode *p_await) {
#ifdef DEBUG_ENABLED
GDScriptParser::DataType to_await_type = p_await->to_await->get_datatype();
- if (!(to_await_type.has_no_type() || to_await_type.is_coroutine || to_await_type.builtin_type == Variant::SIGNAL)) {
+ if (!to_await_type.is_coroutine && !to_await_type.is_variant() && to_await_type.builtin_type != Variant::SIGNAL) {
parser->push_warning(p_await, GDScriptWarning::REDUNDANT_AWAIT);
}
#endif
diff --git a/modules/gdscript/tests/scripts/analyzer/features/warning_ignore_annotation.gd b/modules/gdscript/tests/scripts/analyzer/features/warning_ignore_annotation.gd
index 4c02fd4b0d..292db30bcd 100644
--- a/modules/gdscript/tests/scripts/analyzer/features/warning_ignore_annotation.gd
+++ b/modules/gdscript/tests/scripts/analyzer/features/warning_ignore_annotation.gd
@@ -11,5 +11,5 @@ func test():
print("done")
-func regular_func():
+func regular_func() -> int:
return 0
diff --git a/modules/gdscript/tests/scripts/analyzer/warnings/redundant_await.gd b/modules/gdscript/tests/scripts/analyzer/warnings/redundant_await.gd
new file mode 100644
index 0000000000..f8844d66a7
--- /dev/null
+++ b/modules/gdscript/tests/scripts/analyzer/warnings/redundant_await.gd
@@ -0,0 +1,53 @@
+signal my_signal()
+
+# CI cannot test async things.
+func test_signals():
+ await my_signal
+ var t: Signal = my_signal
+ await t
+
+func coroutine() -> void:
+ @warning_ignore("redundant_await")
+ await 0
+
+func not_coroutine_variant():
+ pass
+
+func not_coroutine_void() -> void:
+ pass
+
+func test():
+ const CONST_NULL = null
+ var var_null = null
+ var var_int: int = 1
+ var var_variant: Variant = 1
+ var var_array: Array = [1]
+
+ await CONST_NULL
+ await var_null
+ await var_int
+ await var_variant
+ await var_array[0]
+
+ await coroutine
+ await coroutine()
+ await coroutine.call()
+ await self.coroutine()
+ await call(&"coroutine")
+
+ await not_coroutine_variant
+ await not_coroutine_variant()
+ await self.not_coroutine_variant()
+ await not_coroutine_variant.call()
+ await call(&"not_coroutine_variant")
+
+ await not_coroutine_void
+ await not_coroutine_void()
+ await self.not_coroutine_void()
+ await not_coroutine_void.call()
+ await call(&"not_coroutine_void")
+
+ var callable: Callable = coroutine
+ await callable
+ await callable.call()
+ await callable.get_method()
diff --git a/modules/gdscript/tests/scripts/analyzer/warnings/redundant_await.out b/modules/gdscript/tests/scripts/analyzer/warnings/redundant_await.out
new file mode 100644
index 0000000000..3d251c2906
--- /dev/null
+++ b/modules/gdscript/tests/scripts/analyzer/warnings/redundant_await.out
@@ -0,0 +1,37 @@
+GDTEST_OK
+>> WARNING
+>> Line: 26
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 28
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 32
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 38
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 44
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 45
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 46
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 51
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 53
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
diff --git a/modules/gdscript/tests/scripts/runtime/features/await_without_coroutine.gd b/modules/gdscript/tests/scripts/runtime/features/await_without_coroutine.gd
index 9da61ab184..1c39073be9 100644
--- a/modules/gdscript/tests/scripts/runtime/features/await_without_coroutine.gd
+++ b/modules/gdscript/tests/scripts/runtime/features/await_without_coroutine.gd
@@ -4,5 +4,5 @@ func test():
print(await not_coroutine())
-func not_coroutine():
+func not_coroutine() -> String:
return "awaited"
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Array.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Array.cs
index 8598c32760..5163ea5113 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Array.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Array.cs
@@ -554,6 +554,7 @@ namespace Godot.Collections
// instead of growing it as we add items.
if (collection.TryGetNonEnumeratedCount(out int count))
{
+ int oldCount = Count;
Resize(Count + count);
using var enumerator = collection.GetEnumerator();
@@ -561,7 +562,7 @@ namespace Godot.Collections
for (int i = 0; i < count; i++)
{
enumerator.MoveNext();
- this[count + i] = Variant.From(enumerator.Current);
+ this[oldCount + i] = Variant.From(enumerator.Current);
}
return;
@@ -1578,6 +1579,7 @@ namespace Godot.Collections
// instead of growing it as we add items.
if (collection.TryGetNonEnumeratedCount(out int count))
{
+ int oldCount = Count;
Resize(Count + count);
using var enumerator = collection.GetEnumerator();
@@ -1585,7 +1587,7 @@ namespace Godot.Collections
for (int i = 0; i < count; i++)
{
enumerator.MoveNext();
- this[count + i] = enumerator.Current;
+ this[oldCount + i] = enumerator.Current;
}
return;
diff --git a/modules/multiplayer/scene_replication_config.cpp b/modules/multiplayer/scene_replication_config.cpp
index f8006228de..b91c755c62 100644
--- a/modules/multiplayer/scene_replication_config.cpp
+++ b/modules/multiplayer/scene_replication_config.cpp
@@ -51,6 +51,9 @@ bool SceneReplicationConfig::_set(const StringName &p_name, const Variant &p_val
ERR_FAIL_INDEX_V(idx, properties.size(), false);
ReplicationProperty &prop = properties[idx];
if (what == "sync") {
+ if ((bool)p_value == prop.sync) {
+ return true;
+ }
prop.sync = p_value;
if (prop.sync) {
sync_props.push_back(prop.name);
@@ -59,6 +62,9 @@ bool SceneReplicationConfig::_set(const StringName &p_name, const Variant &p_val
}
return true;
} else if (what == "spawn") {
+ if ((bool)p_value == prop.spawn) {
+ return true;
+ }
prop.spawn = p_value;
if (prop.spawn) {
spawn_props.push_back(prop.name);
@@ -132,16 +138,18 @@ void SceneReplicationConfig::add_property(const NodePath &p_path, int p_index) {
spawn_props.clear();
for (const ReplicationProperty &prop : properties) {
if (prop.sync) {
- sync_props.push_back(p_path);
+ sync_props.push_back(prop.name);
}
if (prop.spawn) {
- spawn_props.push_back(p_path);
+ spawn_props.push_back(prop.name);
}
}
}
void SceneReplicationConfig::remove_property(const NodePath &p_path) {
properties.erase(p_path);
+ sync_props.erase(p_path);
+ spawn_props.erase(p_path);
}
bool SceneReplicationConfig::has_property(const NodePath &p_path) const {
@@ -178,7 +186,7 @@ void SceneReplicationConfig::property_set_spawn(const NodePath &p_path, bool p_e
spawn_props.clear();
for (const ReplicationProperty &prop : properties) {
if (prop.spawn) {
- spawn_props.push_back(p_path);
+ spawn_props.push_back(prop.name);
}
}
}
@@ -199,7 +207,7 @@ void SceneReplicationConfig::property_set_sync(const NodePath &p_path, bool p_en
sync_props.clear();
for (const ReplicationProperty &prop : properties) {
if (prop.sync) {
- sync_props.push_back(p_path);
+ sync_props.push_back(prop.name);
}
}
}
diff --git a/modules/openxr/register_types.cpp b/modules/openxr/register_types.cpp
index c39e49387a..b7d239fc73 100644
--- a/modules/openxr/register_types.cpp
+++ b/modules/openxr/register_types.cpp
@@ -29,6 +29,7 @@
/**************************************************************************/
#include "register_types.h"
+#include "core/config/project_settings.h"
#include "main/main.h"
#include "openxr_interface.h"
@@ -113,10 +114,19 @@ void initialize_openxr_module(ModuleInitializationLevel p_level) {
ERR_FAIL_NULL(openxr_api);
if (!openxr_api->initialize(Main::get_rendering_driver_name())) {
- OS::get_singleton()->alert("OpenXR was requested but failed to start.\n"
- "Please check if your HMD is connected.\n"
- "When using Windows MR please note that WMR only has DirectX support, make sure SteamVR is your default OpenXR runtime.\n"
- "Godot will start in normal mode.\n");
+ const char *init_error_message =
+ "OpenXR was requested but failed to start.\n"
+ "Please check if your HMD is connected.\n"
+ "When using Windows MR please note that WMR only has DirectX support, make sure SteamVR is your default OpenXR runtime.\n"
+ "Godot will start in normal mode.\n";
+
+ WARN_PRINT(init_error_message);
+
+ bool init_show_startup_alert = GLOBAL_GET("xr/openxr/startup_alert");
+ if (init_show_startup_alert) {
+ OS::get_singleton()->alert(init_error_message);
+ }
+
memdelete(openxr_api);
openxr_api = nullptr;
return;
diff --git a/modules/openxr/scene/openxr_hand.cpp b/modules/openxr/scene/openxr_hand.cpp
index e4bd2dab52..e341d2b1d4 100644
--- a/modules/openxr/scene/openxr_hand.cpp
+++ b/modules/openxr/scene/openxr_hand.cpp
@@ -216,7 +216,7 @@ void OpenXRHand::_update_skeleton() {
const auto &pose = location.pose;
if (location.locationFlags & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT) {
- if (pose.orientation.x != 0 || pose.orientation.y != 0 || pose.orientation.y != 0 || pose.orientation.w != 0) {
+ if (pose.orientation.x != 0 || pose.orientation.y != 0 || pose.orientation.z != 0 || pose.orientation.w != 0) {
quaternions[i] = Quaternion(pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w);
inv_quaternions[i] = quaternions[i].inverse();