utils.notest.gd 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. static func get_type(property: Dictionary, is_return: bool = false) -> String:
  2. match property.type:
  3. TYPE_NIL:
  4. if property.usage & PROPERTY_USAGE_NIL_IS_VARIANT:
  5. return "Variant"
  6. return "void" if is_return else "null"
  7. TYPE_INT:
  8. if property.usage & PROPERTY_USAGE_CLASS_IS_ENUM:
  9. if property.class_name == &"":
  10. return "<unknown enum>"
  11. return property.class_name
  12. TYPE_ARRAY:
  13. if property.hint == PROPERTY_HINT_ARRAY_TYPE:
  14. if str(property.hint_string).is_empty():
  15. return "Array[<unknown type>]"
  16. return "Array[%s]" % property.hint_string
  17. TYPE_OBJECT:
  18. if not str(property.class_name).is_empty():
  19. return property.class_name
  20. return variant_get_type_name(property.type)
  21. static func get_property_signature(property: Dictionary, is_static: bool = false) -> String:
  22. var result: String = ""
  23. if not (property.usage & PROPERTY_USAGE_SCRIPT_VARIABLE):
  24. printerr("Missing `PROPERTY_USAGE_SCRIPT_VARIABLE` flag.")
  25. if property.usage & PROPERTY_USAGE_DEFAULT:
  26. result += "@export "
  27. if is_static:
  28. result += "static "
  29. result += "var " + property.name + ": " + get_type(property)
  30. return result
  31. static func get_property_additional_info(property: Dictionary) -> String:
  32. return 'hint=%s hint_string="%s" usage=%s' % [
  33. get_property_hint_name(property.hint).trim_prefix("PROPERTY_HINT_"),
  34. str(property.hint_string).c_escape(),
  35. get_property_usage_string(property.usage).replace("PROPERTY_USAGE_", ""),
  36. ]
  37. static func get_method_signature(method: Dictionary, is_signal: bool = false) -> String:
  38. var result: String = ""
  39. if method.flags & METHOD_FLAG_STATIC:
  40. result += "static "
  41. result += ("signal " if is_signal else "func ") + method.name + "("
  42. var args: Array[Dictionary] = method.args
  43. var default_args: Array = method.default_args
  44. var mandatory_argc: int = args.size() - default_args.size()
  45. for i in args.size():
  46. if i > 0:
  47. result += ", "
  48. var arg: Dictionary = args[i]
  49. result += arg.name + ": " + get_type(arg)
  50. if i >= mandatory_argc:
  51. result += " = " + var_to_str(default_args[i - mandatory_argc])
  52. result += ")"
  53. if is_signal:
  54. if get_type(method.return, true) != "void":
  55. printerr("Signal return type must be `void`.")
  56. else:
  57. result += " -> " + get_type(method.return, true)
  58. return result
  59. static func variant_get_type_name(type: Variant.Type) -> String:
  60. match type:
  61. TYPE_NIL:
  62. return "Nil" # `Nil` in core, `null` in GDScript.
  63. TYPE_BOOL:
  64. return "bool"
  65. TYPE_INT:
  66. return "int"
  67. TYPE_FLOAT:
  68. return "float"
  69. TYPE_STRING:
  70. return "String"
  71. TYPE_VECTOR2:
  72. return "Vector2"
  73. TYPE_VECTOR2I:
  74. return "Vector2i"
  75. TYPE_RECT2:
  76. return "Rect2"
  77. TYPE_RECT2I:
  78. return "Rect2i"
  79. TYPE_VECTOR3:
  80. return "Vector3"
  81. TYPE_VECTOR3I:
  82. return "Vector3i"
  83. TYPE_TRANSFORM2D:
  84. return "Transform2D"
  85. TYPE_VECTOR4:
  86. return "Vector4"
  87. TYPE_VECTOR4I:
  88. return "Vector4i"
  89. TYPE_PLANE:
  90. return "Plane"
  91. TYPE_QUATERNION:
  92. return "Quaternion"
  93. TYPE_AABB:
  94. return "AABB"
  95. TYPE_BASIS:
  96. return "Basis"
  97. TYPE_TRANSFORM3D:
  98. return "Transform3D"
  99. TYPE_PROJECTION:
  100. return "Projection"
  101. TYPE_COLOR:
  102. return "Color"
  103. TYPE_STRING_NAME:
  104. return "StringName"
  105. TYPE_NODE_PATH:
  106. return "NodePath"
  107. TYPE_RID:
  108. return "RID"
  109. TYPE_OBJECT:
  110. return "Object"
  111. TYPE_CALLABLE:
  112. return "Callable"
  113. TYPE_SIGNAL:
  114. return "Signal"
  115. TYPE_DICTIONARY:
  116. return "Dictionary"
  117. TYPE_ARRAY:
  118. return "Array"
  119. TYPE_PACKED_BYTE_ARRAY:
  120. return "PackedByteArray"
  121. TYPE_PACKED_INT32_ARRAY:
  122. return "PackedInt32Array"
  123. TYPE_PACKED_INT64_ARRAY:
  124. return "PackedInt64Array"
  125. TYPE_PACKED_FLOAT32_ARRAY:
  126. return "PackedFloat32Array"
  127. TYPE_PACKED_FLOAT64_ARRAY:
  128. return "PackedFloat64Array"
  129. TYPE_PACKED_STRING_ARRAY:
  130. return "PackedStringArray"
  131. TYPE_PACKED_VECTOR2_ARRAY:
  132. return "PackedVector2Array"
  133. TYPE_PACKED_VECTOR3_ARRAY:
  134. return "PackedVector3Array"
  135. TYPE_PACKED_COLOR_ARRAY:
  136. return "PackedColorArray"
  137. push_error("Argument `type` is invalid. Use `TYPE_*` constants.")
  138. return "<invalid type>"
  139. static func get_property_hint_name(hint: PropertyHint) -> String:
  140. match hint:
  141. PROPERTY_HINT_NONE:
  142. return "PROPERTY_HINT_NONE"
  143. PROPERTY_HINT_RANGE:
  144. return "PROPERTY_HINT_RANGE"
  145. PROPERTY_HINT_ENUM:
  146. return "PROPERTY_HINT_ENUM"
  147. PROPERTY_HINT_ENUM_SUGGESTION:
  148. return "PROPERTY_HINT_ENUM_SUGGESTION"
  149. PROPERTY_HINT_EXP_EASING:
  150. return "PROPERTY_HINT_EXP_EASING"
  151. PROPERTY_HINT_LINK:
  152. return "PROPERTY_HINT_LINK"
  153. PROPERTY_HINT_FLAGS:
  154. return "PROPERTY_HINT_FLAGS"
  155. PROPERTY_HINT_LAYERS_2D_RENDER:
  156. return "PROPERTY_HINT_LAYERS_2D_RENDER"
  157. PROPERTY_HINT_LAYERS_2D_PHYSICS:
  158. return "PROPERTY_HINT_LAYERS_2D_PHYSICS"
  159. PROPERTY_HINT_LAYERS_2D_NAVIGATION:
  160. return "PROPERTY_HINT_LAYERS_2D_NAVIGATION"
  161. PROPERTY_HINT_LAYERS_3D_RENDER:
  162. return "PROPERTY_HINT_LAYERS_3D_RENDER"
  163. PROPERTY_HINT_LAYERS_3D_PHYSICS:
  164. return "PROPERTY_HINT_LAYERS_3D_PHYSICS"
  165. PROPERTY_HINT_LAYERS_3D_NAVIGATION:
  166. return "PROPERTY_HINT_LAYERS_3D_NAVIGATION"
  167. PROPERTY_HINT_LAYERS_AVOIDANCE:
  168. return "PROPERTY_HINT_LAYERS_AVOIDANCE"
  169. PROPERTY_HINT_FILE:
  170. return "PROPERTY_HINT_FILE"
  171. PROPERTY_HINT_DIR:
  172. return "PROPERTY_HINT_DIR"
  173. PROPERTY_HINT_GLOBAL_FILE:
  174. return "PROPERTY_HINT_GLOBAL_FILE"
  175. PROPERTY_HINT_GLOBAL_DIR:
  176. return "PROPERTY_HINT_GLOBAL_DIR"
  177. PROPERTY_HINT_RESOURCE_TYPE:
  178. return "PROPERTY_HINT_RESOURCE_TYPE"
  179. PROPERTY_HINT_MULTILINE_TEXT:
  180. return "PROPERTY_HINT_MULTILINE_TEXT"
  181. PROPERTY_HINT_EXPRESSION:
  182. return "PROPERTY_HINT_EXPRESSION"
  183. PROPERTY_HINT_PLACEHOLDER_TEXT:
  184. return "PROPERTY_HINT_PLACEHOLDER_TEXT"
  185. PROPERTY_HINT_COLOR_NO_ALPHA:
  186. return "PROPERTY_HINT_COLOR_NO_ALPHA"
  187. PROPERTY_HINT_OBJECT_ID:
  188. return "PROPERTY_HINT_OBJECT_ID"
  189. PROPERTY_HINT_TYPE_STRING:
  190. return "PROPERTY_HINT_TYPE_STRING"
  191. PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE:
  192. return "PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE"
  193. PROPERTY_HINT_OBJECT_TOO_BIG:
  194. return "PROPERTY_HINT_OBJECT_TOO_BIG"
  195. PROPERTY_HINT_NODE_PATH_VALID_TYPES:
  196. return "PROPERTY_HINT_NODE_PATH_VALID_TYPES"
  197. PROPERTY_HINT_SAVE_FILE:
  198. return "PROPERTY_HINT_SAVE_FILE"
  199. PROPERTY_HINT_GLOBAL_SAVE_FILE:
  200. return "PROPERTY_HINT_GLOBAL_SAVE_FILE"
  201. PROPERTY_HINT_INT_IS_OBJECTID:
  202. return "PROPERTY_HINT_INT_IS_OBJECTID"
  203. PROPERTY_HINT_INT_IS_POINTER:
  204. return "PROPERTY_HINT_INT_IS_POINTER"
  205. PROPERTY_HINT_ARRAY_TYPE:
  206. return "PROPERTY_HINT_ARRAY_TYPE"
  207. PROPERTY_HINT_LOCALE_ID:
  208. return "PROPERTY_HINT_LOCALE_ID"
  209. PROPERTY_HINT_LOCALIZABLE_STRING:
  210. return "PROPERTY_HINT_LOCALIZABLE_STRING"
  211. PROPERTY_HINT_NODE_TYPE:
  212. return "PROPERTY_HINT_NODE_TYPE"
  213. PROPERTY_HINT_HIDE_QUATERNION_EDIT:
  214. return "PROPERTY_HINT_HIDE_QUATERNION_EDIT"
  215. PROPERTY_HINT_PASSWORD:
  216. return "PROPERTY_HINT_PASSWORD"
  217. push_error("Argument `hint` is invalid. Use `PROPERTY_HINT_*` constants.")
  218. return "<invalid hint>"
  219. static func get_property_usage_string(usage: int) -> String:
  220. if usage == PROPERTY_USAGE_NONE:
  221. return "PROPERTY_USAGE_NONE"
  222. const FLAGS: Array[Array] = [
  223. [PROPERTY_USAGE_DEFAULT, "PROPERTY_USAGE_DEFAULT"],
  224. [PROPERTY_USAGE_STORAGE, "PROPERTY_USAGE_STORAGE"],
  225. [PROPERTY_USAGE_EDITOR, "PROPERTY_USAGE_EDITOR"],
  226. [PROPERTY_USAGE_INTERNAL, "PROPERTY_USAGE_INTERNAL"],
  227. [PROPERTY_USAGE_CHECKABLE, "PROPERTY_USAGE_CHECKABLE"],
  228. [PROPERTY_USAGE_CHECKED, "PROPERTY_USAGE_CHECKED"],
  229. [PROPERTY_USAGE_GROUP, "PROPERTY_USAGE_GROUP"],
  230. [PROPERTY_USAGE_CATEGORY, "PROPERTY_USAGE_CATEGORY"],
  231. [PROPERTY_USAGE_SUBGROUP, "PROPERTY_USAGE_SUBGROUP"],
  232. [PROPERTY_USAGE_CLASS_IS_BITFIELD, "PROPERTY_USAGE_CLASS_IS_BITFIELD"],
  233. [PROPERTY_USAGE_NO_INSTANCE_STATE, "PROPERTY_USAGE_NO_INSTANCE_STATE"],
  234. [PROPERTY_USAGE_RESTART_IF_CHANGED, "PROPERTY_USAGE_RESTART_IF_CHANGED"],
  235. [PROPERTY_USAGE_SCRIPT_VARIABLE, "PROPERTY_USAGE_SCRIPT_VARIABLE"],
  236. [PROPERTY_USAGE_STORE_IF_NULL, "PROPERTY_USAGE_STORE_IF_NULL"],
  237. [PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED, "PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED"],
  238. [PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE, "PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE"],
  239. [PROPERTY_USAGE_CLASS_IS_ENUM, "PROPERTY_USAGE_CLASS_IS_ENUM"],
  240. [PROPERTY_USAGE_NIL_IS_VARIANT, "PROPERTY_USAGE_NIL_IS_VARIANT"],
  241. [PROPERTY_USAGE_ARRAY, "PROPERTY_USAGE_ARRAY"],
  242. [PROPERTY_USAGE_ALWAYS_DUPLICATE, "PROPERTY_USAGE_ALWAYS_DUPLICATE"],
  243. [PROPERTY_USAGE_NEVER_DUPLICATE, "PROPERTY_USAGE_NEVER_DUPLICATE"],
  244. [PROPERTY_USAGE_HIGH_END_GFX, "PROPERTY_USAGE_HIGH_END_GFX"],
  245. [PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT, "PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT"],
  246. [PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT, "PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT"],
  247. [PROPERTY_USAGE_KEYING_INCREMENTS, "PROPERTY_USAGE_KEYING_INCREMENTS"],
  248. [PROPERTY_USAGE_DEFERRED_SET_RESOURCE, "PROPERTY_USAGE_DEFERRED_SET_RESOURCE"],
  249. [PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT, "PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT"],
  250. [PROPERTY_USAGE_EDITOR_BASIC_SETTING, "PROPERTY_USAGE_EDITOR_BASIC_SETTING"],
  251. [PROPERTY_USAGE_READ_ONLY, "PROPERTY_USAGE_READ_ONLY"],
  252. [PROPERTY_USAGE_SECRET, "PROPERTY_USAGE_SECRET"],
  253. ]
  254. var result: String = ""
  255. for flag in FLAGS:
  256. if usage & flag[0]:
  257. result += flag[1] + "|"
  258. usage &= ~flag[0]
  259. if usage != PROPERTY_USAGE_NONE:
  260. push_error("Argument `usage` is invalid. Use `PROPERTY_USAGE_*` constants.")
  261. return "<invalid usage flags>"
  262. return result.left(-1)