Files
game-cards/addons/gut/scratch/demo_generate_all_warnings.gd

106 lines
3.4 KiB
GDScript3
Raw Normal View History

2026-05-29 09:16:10 +08:00
# ------------------------------------------------------------------------------
# This script loads scripts so you can see a list of all the warnings that
# are generated by your scripts.
# * Sets all ERROR warnings to WARN
# * Loads all scripts in "res" and all subdirectories (by default)
# * If you specify a path after the script it will load that path instead
#
# You must run this script with the -d option or errors/warnings are not
# printed by Godot.
#
# Example:
# godot -d -s scratch/demo_generate_all_warnings.gd
# godot -d -s scratch/demo_generate_all_warnings.gd res://addons/my_addon
# ------------------------------------------------------------------------------
extends SceneTree
var include_subdirectories := true
const GDSCRIPT_WARNING = 'debug/gdscript/warnings/'
# ------------------------------------------------------------------------------
# Gets all the files in a directory and all subdirectories if include_subdirectories
# is true. The files returned are all sorted by name.
# ------------------------------------------------------------------------------
func get_files(path: String, prefix: String, suffix: String) -> Array[String]:
var files: Array[String] = []
var directories: Array[String] = []
var d := DirAccess.open(path)
d.list_dir_begin()
# Traversing a directory is kinda odd. You have to start the process of listing
# the contents of a directory with list_dir_begin then use get_next until it
# returns an empty string. Then I guess you should end it.
var fs_item := d.get_next()
var full_path := ''
while fs_item != '':
full_path = path.path_join(fs_item)
#file_exists returns fasle for directories
if d.file_exists(full_path):
if fs_item.begins_with(prefix) and fs_item.ends_with(suffix):
files.append(full_path)
elif include_subdirectories and d.dir_exists(full_path):
directories.append(full_path)
fs_item = d.get_next()
d.list_dir_end()
for dir in range(directories.size()):
var dir_files := get_files(directories[dir], prefix, suffix)
for i in range(dir_files.size()):
files.append(dir_files[i])
files.sort()
return files
func set_all_errors_to_warnings() -> void:
var props := ProjectSettings.get_property_list()
for prop in props:
var prop_name: String = prop.name
var prop_hint_string: String = prop.hint_string
if prop_name.begins_with(GDSCRIPT_WARNING) and\
prop_hint_string == 'Ignore,Warn,Error' and \
ProjectSettings.get_setting(prop_name) == 2:
print('Changed [', prop_name.replace(GDSCRIPT_WARNING, ''), '] to WARN')
ProjectSettings.set_setting(prop_name, 1)
func load_all_scripts(path:String) -> void:
var files := get_files(path, '', '.gd')
for f in files:
print("---- ", f, " ----")
var _thing := load(f)
# get_cmdline_args always has -s as first and the script path as the second
# argument. All other arguments used by the engine do not appear in
# get_cmdline_args.
#
# This treats the 3rd argument as the directory. All other arguments are
# ignored.
func get_directory_to_load(default) -> String:
var args = OS.get_cmdline_args()
var to_return = default
if(args.size() > 2):
to_return = args[2]
return to_return
func _init() -> void:
if(EngineDebugger.is_active()):
var dir = get_directory_to_load('res://')
print('Loading scripts from ', dir)
set_all_errors_to_warnings()
load_all_scripts(dir)
else:
print("This script must be run with -d flag or warnings/errors will not be displayed.")
quit()