ronantakizawa/codereview-bench huggingface dataset:
Repository: godotengine/godot
File: editor/inspector/editor_inspector.cpp (C++)

Code before:
		}
		if (!(current_category + "/" + current_group + "/" + current_subgroup).begins_with(get_inspector_path())) {
			if (current_category.ends_with(".gd")) {
				String section_path = inspector_path;
				section_path = section_path.replace(section_path.split("/")[0] + "/", "");
				if (!(current_group + "/" + current_subgroup).begins_with(section_path)) {
					continue;
				}
			} else {
				continue;
			}
		}

		p_properties.push_back(prop_info.name);
	}
}

void EditorInspectorSection::menu_option(int p_option) const {
	switch (p_option) {
		case MENU_COPY_VALUE: {
			Vector<String> properties;
			Dictionary clipboard;
			_collect_properties(properties);

			clipboard["path"] = get_inspector_path();
			for (String property_name : properties) {
				clipboard[property_name] = object->get(property_name);
			}
			InspectorDock::get_inspector_singleton()->set_property_clipboard(clipboard);
		} break;
		case MENU_PASTE_VALUE: {
			Dictionary clipboard = InspectorDock::get_inspector_singleton()->get_property_clipboard();
			String group_name = clipboard["path"];

			if (!get_inspector_path().begins_with(group_name)) {
				break;
			}

			Vector<String> properties;
			String action_name = "Set group " + group_name;

			_collect_properties(properties);

			EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
			undo_redo->create_action(action_name);

			for (String property_name : properties) {
				Variant value = clipboard[property_name];
				undo_redo->add_do_property(object, property_name, value);
				undo_redo->add_undo_property(object, property_name, object->get(property_name));
			}

Review comment (suggestion):
```suggestion
			for (const String &property_name : properties) {
```

Code after:
}

void EditorInspectorSection::_accessibility_action_collapse(const Variant &p_data) {
	fold();
}

void EditorInspectorSection::_accessibility_action_expand(const Variant &p_data) {
	unfold();
}

void EditorInspectorSection::unfold() {
	if ((!foldable && !checkable) || (!checkbox_only && checkable && !checked)) {
		return;
	}

	_test_unfold();

	if (foldable) {
		object->editor_set_section_unfold(section, true);
	}

	vbox->show();
	queue_redraw();
}

void EditorInspectorSection::fold() {
	if (!foldable || !vbox_added) {
		return;
	}

	object->editor_set_section_unfold(section, false);
	vbox->hide();
	queue_redraw();
}

void EditorInspectorSection::set_bg_color(const Color &p_bg_color) {
	bg_color = p_bg_color;
	queue_redraw();
}

void EditorInspectorSection::set_keying(bool p_keying) {
	if (keying == (checkable && p_keying)) {
		return;
	}

	keying = checkable && p_keying;
	if (checkable) {
		queue_redraw();
	}
}
Repository: godotengine/godot
File: editor/inspector/editor_inspector.cpp (C++)

Code before:
void EditorInspectorSection::_collect_properties(Vector<String> &p_properties) const {
	List<PropertyInfo> property_list;
	object->get_property_list(&property_list, true);

	String current_category = "";
	String current_group = "";
	String current_subgroup = "";
	for (const PropertyInfo &prop_info : property_list) {
		if (prop_info.usage & PROPERTY_USAGE_GROUP) {
			current_group = prop_info.name;
			continue;
		}
		if (prop_info.usage & PROPERTY_USAGE_SUBGROUP) {
			current_subgroup = prop_info.name;
			continue;
		}
		if (prop_info.usage & PROPERTY_USAGE_CATEGORY) {
			current_category = prop_info.name;
			current_group = "";
			current_subgroup = "";
			continue;
		}
		if (!(prop_info.usage & PROPERTY_USAGE_EDITOR)) {
			continue;
		}
		if (prop_info.name.split("/").size() > 1) {
			current_group = prop_info.name.split("/")[0];
		}
		if (!(current_category + "/" + current_group + "/" + current_subgroup).begins_with(get_inspector_path())) {
			if (current_category.ends_with(".gd")) {
				String section_path = inspector_path;
				section_path = section_path.replace(section_path.split("/")[0] + "/", "");
				if (!(current_group + "/" + current_subgroup).begins_with(section_path)) {
					continue;
				}
			} else {
				continue;
			}
		}

		p_properties.push_back(prop_info.name);
	}
}

void EditorInspectorSection::menu_option(int p_option) const {
	switch (p_option) {
		case MENU_COPY_VALUE: {
			Vector<String> properties;
			Dictionary clipboard;
			_collect_properties(properties);


Review comment (suggestion):
```suggestion
		if (prop_info.name.get_slice_count("/") > 1) {
```

Code after:
		} else if (keying && keying_rect.has_point(pos)) {
			emit_signal(SNAME("property_keyed"), related_enable_property, false);
		} else if (foldable) {
			bool should_unfold = can_click_unfold && !object->editor_is_section_unfolded(section);
			if (should_unfold) {
				unfold();
			} else {
				fold();
			}
		}
	} else if ((!checkable || checked) && !inspector_path.is_empty() && mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
		accept_event();
		_update_popup();
		menu->set_position(get_screen_position() + get_local_mouse_position());
		menu->reset_size();
		menu->popup();
	} else if (mb.is_valid() && !mb->is_pressed()) {
		queue_redraw();
	}
}

String EditorInspectorSection::get_section() const {
	return section;
}

VBoxContainer *EditorInspectorSection::get_vbox() {
	return vbox;
}

void EditorInspectorSection::_accessibility_action_collapse(const Variant &p_data) {
	fold();
}

void EditorInspectorSection::_accessibility_action_expand(const Variant &p_data) {
	unfold();
}

void EditorInspectorSection::unfold() {
	if ((!foldable && !checkable) || (!checkbox_only && checkable && !checked)) {
		return;
	}

	_test_unfold();

	if (foldable) {
		object->editor_set_section_unfold(section, true);
	}

	vbox->show();
	queue_redraw();
}
Repository: godotengine/godot
File: editor/inspector/editor_inspector.cpp (C++)

Code before:
	List<PropertyInfo> property_list;
	object->get_property_list(&property_list, true);

	String current_category = "";
	String current_group = "";
	String current_subgroup = "";
	for (const PropertyInfo &prop_info : property_list) {
		if (prop_info.usage & PROPERTY_USAGE_GROUP) {
			current_group = prop_info.name;
			continue;
		}
		if (prop_info.usage & PROPERTY_USAGE_SUBGROUP) {
			current_subgroup = prop_info.name;
			continue;
		}
		if (prop_info.usage & PROPERTY_USAGE_CATEGORY) {
			current_category = prop_info.name;
			current_group = "";
			current_subgroup = "";
			continue;
		}
		if (!(prop_info.usage & PROPERTY_USAGE_EDITOR)) {
			continue;
		}
		if (prop_info.name.split("/").size() > 1) {
			current_group = prop_info.name.split("/")[0];
		}
		if (!(current_category + "/" + current_group + "/" + current_subgroup).begins_with(get_inspector_path())) {
			if (current_category.ends_with(".gd")) {
				String section_path = inspector_path;
				section_path = section_path.replace(section_path.split("/")[0] + "/", "");
				if (!(current_group + "/" + current_subgroup).begins_with(section_path)) {
					continue;
				}
			} else {
				continue;
			}
		}

		p_properties.push_back(prop_info.name);
	}
}

void EditorInspectorSection::menu_option(int p_option) const {
	switch (p_option) {
		case MENU_COPY_VALUE: {
			Vector<String> properties;
			Dictionary clipboard;
			_collect_properties(properties);

			clipboard["path"] = get_inspector_path();

Review comment (suggestion):
```suggestion
			current_group = prop_info.name.get_slicec('/', 0);
```

Code after:
			emit_signal(SNAME("property_keyed"), related_enable_property, false);
		} else if (foldable) {
			bool should_unfold = can_click_unfold && !object->editor_is_section_unfolded(section);
			if (should_unfold) {
				unfold();
			} else {
				fold();
			}
		}
	} else if ((!checkable || checked) && !inspector_path.is_empty() && mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
		accept_event();
		_update_popup();
		menu->set_position(get_screen_position() + get_local_mouse_position());
		menu->reset_size();
		menu->popup();
	} else if (mb.is_valid() && !mb->is_pressed()) {
		queue_redraw();
	}
}

String EditorInspectorSection::get_section() const {
	return section;
}

VBoxContainer *EditorInspectorSection::get_vbox() {
	return vbox;
}

void EditorInspectorSection::_accessibility_action_collapse(const Variant &p_data) {
	fold();
}

void EditorInspectorSection::_accessibility_action_expand(const Variant &p_data) {
	unfold();
}

void EditorInspectorSection::unfold() {
	if ((!foldable && !checkable) || (!checkbox_only && checkable && !checked)) {
		return;
	}

	_test_unfold();

	if (foldable) {
		object->editor_set_section_unfold(section, true);
	}

	vbox->show();
	queue_redraw();
}
Repository: godotengine/godot
File: editor/inspector/editor_inspector.cpp (C++)

Code before:
			if (pos.y >= header_height) {
				return;
			}
		}

		accept_event();

		if (checkable && check_rect.has_point(pos)) {
			checked = !checked;
			emit_signal(SNAME("section_toggled_by_user"), related_enable_property, checked);
			if (checked) {
				unfold();
			} else if (!checkbox_only) {
				vbox->hide();
			}
		} else if (keying && keying_rect.has_point(pos)) {
			emit_signal(SNAME("property_keyed"), related_enable_property, false);
		} else if (foldable) {
			bool should_unfold = can_click_unfold && !object->editor_is_section_unfolded(section);
			if (should_unfold) {
				unfold();
			} else {
				fold();
			}
		}
	} else if ((!checkable || checked) && inspector_path != "" && mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
		accept_event();
		_update_popup();
		menu->set_position(get_screen_position() + get_local_mouse_position());
		menu->reset_size();
		menu->popup();
	} else if (mb.is_valid() && !mb->is_pressed()) {
		queue_redraw();
	}
}

String EditorInspectorSection::get_section() const {
	return section;
}

VBoxContainer *EditorInspectorSection::get_vbox() {
	return vbox;
}

void EditorInspectorSection::_accessibility_action_collapse(const Variant &p_data) {
	fold();
}

void EditorInspectorSection::_accessibility_action_expand(const Variant &p_data) {
	unfold();
}

Review comment (suggestion):
```suggestion
	} else if ((!checkable || checked) && !inspector_path.is_empty() && mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
```

Code after:
			}
		}

		accept_event();

		if (checkable && check_rect.has_point(pos)) {
			checked = !checked;
			emit_signal(SNAME("section_toggled_by_user"), related_enable_property, checked);
			if (checked) {
				unfold();
			} else if (!checkbox_only) {
				vbox->hide();
			}
		} else if (keying && keying_rect.has_point(pos)) {
			emit_signal(SNAME("property_keyed"), related_enable_property, false);
		} else if (foldable) {
			bool should_unfold = can_click_unfold && !object->editor_is_section_unfolded(section);
			if (should_unfold) {
				unfold();
			} else {
				fold();
			}
		}
	} else if ((!checkable || checked) && !inspector_path.is_empty() && mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
		accept_event();
		_update_popup();
		menu->set_position(get_screen_position() + get_local_mouse_position());
		menu->reset_size();
		menu->popup();
	} else if (mb.is_valid() && !mb->is_pressed()) {
		queue_redraw();
	}
}

String EditorInspectorSection::get_section() const {
	return section;
}

VBoxContainer *EditorInspectorSection::get_vbox() {
	return vbox;
}

void EditorInspectorSection::_accessibility_action_collapse(const Variant &p_data) {
	fold();
}

void EditorInspectorSection::_accessibility_action_expand(const Variant &p_data) {
	unfold();
}

void EditorInspectorSection::unfold() {
Repository: godotengine/godot
File: scene/gui/code_edit.h (C/C++)

Code before:
	void confirm_code_completion(bool p_replace = false);
	void cancel_code_completion();

	/* Line length guidelines */
	void set_line_length_guidelines(TypedArray<int> p_guideline_columns);
	TypedArray<int> get_line_length_guidelines() const;

	/* Symbol lookup */
	void set_symbol_lookup_on_click_enabled(bool p_enabled);
	bool is_symbol_lookup_on_click_enabled() const;

	String get_text_for_symbol_lookup() const;
	String get_text_with_cursor_char(int p_line, int p_column) const;
	String get_lookup_word(int p_line, int p_column) const;

	void set_symbol_lookup_word_as_valid(bool p_valid);

	/* Symbol tooltip */
	void set_symbol_tooltip_on_hover_enabled(bool p_enabled);
	bool is_symbol_tooltip_on_hover_enabled() const;

	/* Text manipulation */
	void move_lines_up();
	void move_lines_down();
	void delete_lines();
	void join_lines(const String &p_line_ending = String(" "));
	void duplicate_selection();
	void duplicate_lines();

	CodeEdit();
	~CodeEdit();
};

VARIANT_ENUM_CAST(CodeEdit::CodeCompletionKind);
VARIANT_ENUM_CAST(CodeEdit::CodeCompletionLocation);

// The custom comparer which will sort completion options.
struct CodeCompletionOptionCompare {
	_FORCE_INLINE_ bool operator()(const ScriptLanguage::CodeCompletionOption &l, const ScriptLanguage::CodeCompletionOption &r) const;
};


Review comment (suggestion):
```suggestion
	void join_lines(const String &p_line_ending = " ");
```

Code after:

	int get_code_completion_selected_index() const;
	void set_code_completion_selected_index(int p_index);

	void confirm_code_completion(bool p_replace = false);
	void cancel_code_completion();

	/* Line length guidelines */
	void set_line_length_guidelines(TypedArray<int> p_guideline_columns);
	TypedArray<int> get_line_length_guidelines() const;

	/* Symbol lookup */
	void set_symbol_lookup_on_click_enabled(bool p_enabled);
	bool is_symbol_lookup_on_click_enabled() const;

	String get_text_for_symbol_lookup() const;
	String get_text_with_cursor_char(int p_line, int p_column) const;
	String get_lookup_word(int p_line, int p_column) const;

	void set_symbol_lookup_word_as_valid(bool p_valid);

	/* Symbol tooltip */
	void set_symbol_tooltip_on_hover_enabled(bool p_enabled);
	bool is_symbol_tooltip_on_hover_enabled() const;

	/* Text manipulation */
	void move_lines_up();
	void move_lines_down();
	void delete_lines();
	void join_lines(const String &p_line_ending = " ");
	void duplicate_selection();
	void duplicate_lines();

	CodeEdit();
	~CodeEdit();
};

VARIANT_ENUM_CAST(CodeEdit::CodeCompletionKind);
VARIANT_ENUM_CAST(CodeEdit::CodeCompletionLocation);

// The custom comparer which will sort completion options.
struct CodeCompletionOptionCompare {
	_FORCE_INLINE_ bool operator()(const ScriptLanguage::CodeCompletionOption &l, const ScriptLanguage::CodeCompletionOption &r) const;
};
Repository: godotengine/godot
File: scene/gui/code_edit.cpp (C++)

Code before:
	Vector<Point2i> line_ranges = get_line_ranges_from_carets();
	int line_offset = 0;
	for (Point2i line_range : line_ranges) {
		// Remove last line of range separately to preserve carets.
		unfold_line(line_range.y + line_offset);
		remove_line_at(line_range.y + line_offset);
		if (line_range.x != line_range.y) {
			remove_text(line_range.x + line_offset, 0, line_range.y + line_offset, 0);
		}
		line_offset += line_range.x - line_range.y - 1;
	}

	// Deselect all.
	deselect();

	end_multicaret_edit();
	end_complex_operation();
}

void CodeEdit::join_lines(const String &p_line_ending) {
	begin_complex_operation();
	begin_multicaret_edit();

	Vector<Point2i> line_ranges = get_line_ranges_from_carets();
	int line_offset = 0;
	for (Point2i line_range : line_ranges) {
		for (int32_t line = line_range.x; line <= line_range.y; line++) {
			int32_t real_line = line + line_offset;
			if (real_line + 1 >= get_line_count()) {
				break;
			}
			unfold_line(real_line);
			int line_length = get_line(real_line).length();
			int next_line_leading_whitespace_length = get_first_non_whitespace_column(real_line + 1);
			int next_line_length = get_line(real_line + 1).length();
			remove_text(real_line, line_length, real_line + 1, next_line_leading_whitespace_length);
			if (next_line_leading_whitespace_length != next_line_length) {
				insert_text(p_line_ending, real_line, line_length);
			}
			line_offset--;
		}
	}

	// Deselect all.
	deselect();

	end_multicaret_edit();
	end_complex_operation();
}

void CodeEdit::duplicate_selection() {

Review comment (suggestion):
```suggestion
	for (const Point2i &line_range : line_ranges) {
```

Code after:
		}
	}
	adjust_viewport_to_caret();

	end_multicaret_edit();
	end_complex_operation();
}

void CodeEdit::move_lines_down() {
	begin_complex_operation();
	begin_multicaret_edit();

	// Move lines down by swapping each line with the one below it.
	Vector<Point2i> line_ranges = get_line_ranges_from_carets();
	// Reverse in case line ranges are adjacent, if the first ends at column 0.
	line_ranges.reverse();
	for (Point2i line_range : line_ranges) {
		if (line_range.y == get_line_count() - 1) {
			continue;
		}
		// Fix selection if the last one ends at column 0, since it won't be moved.
		bool selection_to_line_at_end = false;
		for (int i = 0; i < get_caret_count(); i++) {
			if (has_selection(i) && get_selection_to_column(i) == 0 && get_selection_to_line(i) == line_range.y + 1) {
				selection_to_line_at_end = get_selection_to_line(i) == get_line_count() - 1;
				if (selection_to_line_at_end) {
					break;
				}
				if (is_caret_after_selection_origin(i)) {
					set_caret_line(get_caret_line(i) + 1, false, true, -1, i);
				} else {
					set_selection_origin_line(get_selection_origin_line(i) + 1, true, -1, i);
				}
				break;
			}
		}
		if (selection_to_line_at_end) {
			continue;
		}

		unfold_line(line_range.y + 1);
		for (int line = line_range.y; line >= line_range.x; line--) {
			unfold_line(line);
			swap_lines(line + 1, line);
		}
	}
	adjust_viewport_to_caret();

	end_multicaret_edit();
	end_complex_operation();
}
Repository: godotengine/godot
File: editor/script/script_text_editor.h (C/C++)

Code before:
	Color folded_code_region_color = Color(1, 1, 1);
	int previous_line = 0;

	PopupPanel *color_panel = nullptr;
	ColorPicker *color_picker = nullptr;
	Vector3i color_position;
	String color_args;

	bool theme_loaded = false;

	enum {
		EDIT_AUTO_INDENT = CODE_ENUM_COUNT,
		EDIT_PICK_COLOR,
		EDIT_EVALUATE,
		EDIT_CREATE_CODE_REGION,

		SEARCH_LOCATE_FUNCTION,

		DEBUG_TOGGLE_BREAKPOINT,
		DEBUG_REMOVE_ALL_BREAKPOINTS,
		DEBUG_GOTO_NEXT_BREAKPOINT,
		DEBUG_GOTO_PREV_BREAKPOINT,

		HELP_CONTEXTUAL,
		LOOKUP_SYMBOL,
		EDIT_EMOJI_AND_SYMBOL,
	};

	enum COLOR_MODE {
		MODE_RGB,
		MODE_STRING,
		MODE_HSV,
		MODE_OKHSL,
		MODE_RGB8,
		MODE_HEX,
		MODE_MAX
	};

	class EditMenusSTE : public EditMenusCEB {
		GDCLASS(EditMenusSTE, EditMenusCEB);
		PopupMenu *breakpoints_menu = nullptr;

		void _update_breakpoint_list();
		void _breakpoint_item_pressed(int p_idx);

	public:
		EditMenusSTE();
	};

	void _enable_code_editor();


Review comment (suggestion):
```suggestion
```
Already in the base enum, no need to add.

Code after:
	Color folded_code_region_color = Color(1, 1, 1);
	int previous_line = 0;

	PopupPanel *color_panel = nullptr;
	ColorPicker *color_picker = nullptr;
	Vector3i color_position;
	String color_args;

	bool theme_loaded = false;

	enum {
		EDIT_AUTO_INDENT = CODE_ENUM_COUNT,
		EDIT_PICK_COLOR,
		EDIT_EVALUATE,
		EDIT_CREATE_CODE_REGION,

		SEARCH_LOCATE_FUNCTION,

		DEBUG_TOGGLE_BREAKPOINT,
		DEBUG_REMOVE_ALL_BREAKPOINTS,
		DEBUG_GOTO_NEXT_BREAKPOINT,
		DEBUG_GOTO_PREV_BREAKPOINT,

		HELP_CONTEXTUAL,
		LOOKUP_SYMBOL,
	};

	enum COLOR_MODE {
		MODE_RGB,
		MODE_STRING,
		MODE_HSV,
		MODE_OKHSL,
		MODE_RGB8,
		MODE_HEX,
		MODE_MAX
	};

	class EditMenusSTE : public EditMenusCEB {
		GDCLASS(EditMenusSTE, EditMenusCEB);
		PopupMenu *breakpoints_menu = nullptr;

		void _update_breakpoint_list();
		void _breakpoint_item_pressed(int p_idx);

	public:
		EditMenusSTE();
	};

	void _enable_code_editor();

	struct DraggedExport {
Repository: godotengine/godot
File: core/io/resource.h (C/C++)

Code before:
#include "core/templates/self_list.h"

class Node;
class RWLock;

#define RES_BASE_EXTENSION(m_ext) \
public: \
	static void register_custom_data_to_otdb() { \
		Resource::register_custom_data_to_otdb(m_ext, get_class_static()); \
	} \
	virtual String get_base_extension() const override { \
		return m_ext; \
	} \
\
private:

class Resource : public RefCounted {
	GDCLASS(Resource, RefCounted);

public:
	static constexpr AncestralClass static_ancestral_class = AncestralClass::RESOURCE;

	static void register_custom_data_to_otdb(String p_extension = "res", String p_class = get_class_static());
	virtual String get_base_extension() const { return "res"; }

protected:
	struct DuplicateParams {
		bool deep = false;
		ResourceDeepDuplicateMode subres_mode = RESOURCE_DEEP_DUPLICATE_MAX;
		Node *local_scene = nullptr;
	};

private:
	friend class ResBase;
	friend class ResourceCache;

	String name;
	String path_cache;
	String scene_unique_id;

#ifdef TOOLS_ENABLED
	uint64_t last_modified_time = 0;
	uint64_t import_last_modified_time = 0;
	String import_path;
#endif

	enum EmitChangedState {
		EMIT_CHANGED_UNBLOCKED,
		EMIT_CHANGED_BLOCKED,
		EMIT_CHANGED_BLOCKED_PENDING_EMIT,
	};

Review comment (suggestion):
I see what you're going for by adjusting the existing function to take the arguments directly with default arguments for `Resource` specifically, but I would encourage following the precedent set in `Object` by making the re-routed `ClassDB` function explicit and internal:
```suggestion
	static void register_custom_data_to_otdb();
	virtual String get_base_extension() const { return "res"; }

protected:
    static void _add_resource_base_extension_to_classdb(const String &p_extension, const String &p_class);
``` 

Code after:
#include "core/templates/self_list.h"

class Node;
class RWLock;

#define RES_BASE_EXTENSION(m_ext) \
public: \
	static void register_custom_data_to_otdb() { \
		Resource::_add_resource_base_extension_to_classdb(m_ext, get_class_static()); \
	} \
	virtual String get_base_extension() const override { \
		return m_ext; \
	} \
\
private:

class Resource : public RefCounted {
	GDCLASS(Resource, RefCounted);

public:
	static constexpr AncestralClass static_ancestral_class = AncestralClass::RESOURCE;

	static void register_custom_data_to_otdb();
	virtual String get_base_extension() const { return "res"; }

protected:
	static void _add_resource_base_extension_to_classdb(const String &p_extension, const String &p_class);
	struct DuplicateParams {
		bool deep = false;
		ResourceDeepDuplicateMode subres_mode = RESOURCE_DEEP_DUPLICATE_MAX;
		Node *local_scene = nullptr;
	};

private:
	friend class ResBase;
	friend class ResourceCache;

	String name;
	String path_cache;
	String scene_unique_id;

#ifdef TOOLS_ENABLED
	uint64_t last_modified_time = 0;
	uint64_t import_last_modified_time = 0;
	String import_path;
#endif

	enum EmitChangedState {
		EMIT_CHANGED_UNBLOCKED,
		EMIT_CHANGED_BLOCKED,
		EMIT_CHANGED_BLOCKED_PENDING_EMIT,