Files
game-cards/addons/gut/scratch/new_method_parsing.gd
2026-05-29 09:16:10 +08:00

154 lines
4.0 KiB
GDScript

extends SceneTree
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
class ParsedMethod:
var _meta = {}
var _parameters = []
var is_local = false
const NO_DEFAULT = '__no__default__'
func _init(metadata):
_meta = metadata
var start_default = _meta.args.size() - _meta.default_args.size()
for i in range(_meta.args.size()):
var arg = _meta.args[i]
# Add a "default" property to the metadata so we don't have to do
# weird default position math again.
if(i >= start_default):
arg['default'] = _meta.default_args[start_default - i]
else:
arg['default'] = NO_DEFAULT
_parameters.append(arg)
func to_s():
var s = _meta.name + "("
for i in range(_meta.args.size()):
var arg = _meta.args[i]
if(str(arg.default) != NO_DEFAULT):
var val = str(arg.default)
if(val == ''):
val = '""'
s += str(arg.name, ' = ', val)
else:
s += str(arg.name)
if(i != _meta.args.size() -1):
s += ', '
s += ")"
return s
# ------------------------------------------------------------------------------
# Doesn't know if a method is local and in super, but not sure if that will
# ever matter.
# ------------------------------------------------------------------------------
class ParsedScript:
# All methods indexed by name.
var _methods_by_name = {}
func _init(thing):
print(thing.get_path())
var methods = thing.get_method_list()
for m in methods:
var meth = ParsedMethod.new(m)
_methods_by_name[m.name] = meth
# This loop will overwrite all entries in _methods_by_name with the local
# method object so there is only ever one listing for a function with
# the right "is_local" flag.
methods = thing.get_script_method_list()
for m in methods:
var meth = ParsedMethod.new(m)
meth.is_local = true
_methods_by_name[m.name] = meth
func print_it():
var names = _methods_by_name.keys()
names.sort()
for n in names:
print(_methods_by_name[n].to_s())
func print_super():
var names = _methods_by_name.keys()
names.sort()
for n in names:
if(!_methods_by_name[n].is_local):
print(_methods_by_name[n].to_s())
func print_local():
var names = _methods_by_name.keys()
names.sort()
for n in names:
if(_methods_by_name[n].is_local):
print(_methods_by_name[n].to_s())
func get_method(name):
return _methods_by_name[name]
func get_sorted_method_names():
var keys = _methods_by_name.keys()
keys.sort()
return keys
# ------------------------------------------------------------------------------
# Issues
# * without typed parameters, I'm not sure you can know what type the defaults
# are.
# * When the default is set to a class variable, you get null. So this might
# mean we can never fully know what the default values are. This is true for
# class and instance metadata.
# * Appears you can get all info about a thing without having to make an
# instance.
# ------------------------------------------------------------------------------
const DOUBLE_ME_PATH = 'res://test/resources/doubler_test_objects/double_me.gd'
var DoubleMe = load(DOUBLE_ME_PATH)
var json = JSON.new()
func pp(dict):
print(json.stringify(dict, ' '))
func _init():
var Thing = Node2D
print(Thing)
print(Thing.new().get_class())
var id_str = str(Thing).replace("<", '').replace(">", '').split('#')[1]
print(id_str)
var by_id = instance_from_id(id_str.to_int())
print(by_id)
# var dbl_inst = DoubleMe.new()
# print(dbl_inst.get_script().get_path())
# # print(DoubleMe.get_method_list())
# print(DoubleMe.get_script_method_list())
# print('************************************************')
# print(DoubleMe.get_method_list())
# var ps = ParsedScript.new(DoubleMe)
# print('************************************************')
# ps.print_super()
# print('************************************************')
# ps.print_local()
# var m_assert_eq = ps.get_method('default_is_value')
# print(m_assert_eq.to_s())
# pp(m_assert_eq._meta)
quit()