Files

73 lines
2.4 KiB
GDScript

@tool
extends RefCounted
# docs.class_ref — return the public API of a Godot class so the agent can plan
# work without guessing method/property/signal names.
# Params: {class_name, include_inherited?: false}
# Returns: {class, parent, methods: [{name, args, return}], properties, signals, constants}
static func class_ref(params: Dictionary) -> Dictionary:
var cname: String = params.get("class_name", "")
var include_inherited: bool = params.get("include_inherited", false)
if cname == "":
return _err(-32602, "missing 'class_name'")
if not ClassDB.class_exists(cname):
return _err(-32602, "unknown class: %s" % cname)
var no_inheritance := not include_inherited
var methods: Array = []
for m in ClassDB.class_get_method_list(cname, no_inheritance):
# Skip internal / editor-only methods — they're noise for an agent.
if (m.flags as int) & METHOD_FLAG_OBJECT_CORE:
continue
var args: Array = []
for a in m.args:
args.append({"name": a.name, "type": type_string(a.type)})
methods.append({
"name": m.name,
"args": args,
"return": type_string(m.return.type) if m.has("return") else "void",
"virtual": bool((m.flags as int) & METHOD_FLAG_VIRTUAL),
"static": bool((m.flags as int) & METHOD_FLAG_STATIC),
})
var properties: Array = []
for p in ClassDB.class_get_property_list(cname, no_inheritance):
# Only user-facing properties (storage + editor). Internal group markers have usage=0.
if not ((p.usage as int) & PROPERTY_USAGE_EDITOR):
continue
properties.append({
"name": p.name,
"type": type_string(p.type),
"hint": p.get("hint_string", ""),
})
var signals: Array = []
for s in ClassDB.class_get_signal_list(cname, no_inheritance):
var args: Array = []
for a in s.args:
args.append({"name": a.name, "type": type_string(a.type)})
signals.append({"name": s.name, "args": args})
var constants: Array = []
for c in ClassDB.class_get_integer_constant_list(cname, no_inheritance):
constants.append({"name": c, "value": ClassDB.class_get_integer_constant(cname, c)})
return _ok({
"class": cname,
"parent": ClassDB.get_parent_class(cname),
"inherited_included": include_inherited,
"methods": methods,
"properties": properties,
"signals": signals,
"constants": constants,
})
static func _ok(data) -> Dictionary:
return {"data": data}
static func _err(code: int, msg: String) -> Dictionary:
return {"error": {"code": code, "message": msg}}