소스 검색

Ensure C# script properties are added to the end

Ensures that the `get_property_list` and `get_script_property_list`
methods push the script properties to the end of the given list, this
prevents the script property from appearing after the script variables.
Raul Santos 3 년 전
부모
커밋
21f68e7bdb
1개의 변경된 파일15개의 추가작업 그리고 4개의 파일을 삭제
  1. 15 4
      modules/mono/csharp_script.cpp

+ 15 - 4
modules/mono/csharp_script.cpp

@@ -1585,8 +1585,9 @@ void CSharpInstance::get_properties_state_for_reloading(List<Pair<StringName, Va
 }
 
 void CSharpInstance::get_property_list(List<PropertyInfo> *p_properties) const {
+	List<PropertyInfo> props;
 	for (OrderedHashMap<StringName, PropertyInfo>::ConstElement E = script->member_info.front(); E; E = E.next()) {
-		p_properties->push_front(E.value());
+		props.push_front(E.value());
 	}
 
 	// Call _get_property_list
@@ -1609,15 +1610,19 @@ void CSharpInstance::get_property_list(List<PropertyInfo> *p_properties) const {
 			if (ret) {
 				Array array = Array(GDMonoMarshal::mono_object_to_variant(ret));
 				for (int i = 0, size = array.size(); i < size; i++) {
-					p_properties->push_back(PropertyInfo::from_dict(array.get(i)));
+					props.push_back(PropertyInfo::from_dict(array.get(i)));
 				}
 			}
 
-			return;
+			break;
 		}
 
 		top = top->get_parent_class();
 	}
+
+	for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
+		p_properties->push_back(E->get());
+	}
 }
 
 Variant::Type CSharpInstance::get_property_type(const StringName &p_name, bool *r_is_valid) const {
@@ -3280,8 +3285,14 @@ Ref<Script> CSharpScript::get_base_script() const {
 }
 
 void CSharpScript::get_script_property_list(List<PropertyInfo> *p_list) const {
+	List<PropertyInfo> props;
+
 	for (OrderedHashMap<StringName, PropertyInfo>::ConstElement E = member_info.front(); E; E = E.next()) {
-		p_list->push_front(E.value());
+		props.push_front(E.value());
+	}
+
+	for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
+		p_list->push_back(E->get());
 	}
 }