utils.notest.gd 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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 type_string(property.type)
  21. static func get_property_signature(property: Dictionary, base: Object = null, is_static: bool = false) -> String:
  22. if property.usage & PROPERTY_USAGE_CATEGORY:
  23. return '@export_category("%s")' % str(property.name).c_escape()
  24. if property.usage & PROPERTY_USAGE_GROUP:
  25. return '@export_group("%s")' % str(property.name).c_escape()
  26. if property.usage & PROPERTY_USAGE_SUBGROUP:
  27. return '@export_subgroup("%s")' % str(property.name).c_escape()
  28. var result: String = ""
  29. if not (property.usage & PROPERTY_USAGE_SCRIPT_VARIABLE):
  30. printerr("Missing `PROPERTY_USAGE_SCRIPT_VARIABLE` flag.")
  31. if is_static:
  32. result += "static "
  33. result += "var " + property.name + ": " + get_type(property)
  34. if is_instance_valid(base):
  35. result += " = " + var_to_str(base.get(property.name))
  36. return result
  37. static func print_property_extended_info(property: Dictionary, base: Object = null, is_static: bool = false) -> void:
  38. print(get_property_signature(property, base, is_static))
  39. print(' hint=%s hint_string="%s" usage=%s' % [
  40. get_property_hint_name(property.hint).trim_prefix("PROPERTY_HINT_"),
  41. str(property.hint_string).c_escape(),
  42. get_property_usage_string(property.usage).replace("PROPERTY_USAGE_", ""),
  43. ])
  44. static func get_method_signature(method: Dictionary, is_signal: bool = false) -> String:
  45. var result: String = ""
  46. if method.flags & METHOD_FLAG_STATIC:
  47. result += "static "
  48. result += ("signal " if is_signal else "func ") + method.name + "("
  49. var args: Array[Dictionary] = method.args
  50. var default_args: Array = method.default_args
  51. var mandatory_argc: int = args.size() - default_args.size()
  52. for i in args.size():
  53. if i > 0:
  54. result += ", "
  55. var arg: Dictionary = args[i]
  56. result += arg.name + ": " + get_type(arg)
  57. if i >= mandatory_argc:
  58. result += " = " + var_to_str(default_args[i - mandatory_argc])
  59. result += ")"
  60. if is_signal:
  61. if get_type(method.return, true) != "void":
  62. printerr("Signal return type must be `void`.")
  63. else:
  64. result += " -> " + get_type(method.return, true)
  65. return result
  66. static func get_property_hint_name(hint: PropertyHint) -> String:
  67. match hint:
  68. PROPERTY_HINT_NONE:
  69. return "PROPERTY_HINT_NONE"
  70. PROPERTY_HINT_RANGE:
  71. return "PROPERTY_HINT_RANGE"
  72. PROPERTY_HINT_ENUM:
  73. return "PROPERTY_HINT_ENUM"
  74. PROPERTY_HINT_ENUM_SUGGESTION:
  75. return "PROPERTY_HINT_ENUM_SUGGESTION"
  76. PROPERTY_HINT_EXP_EASING:
  77. return "PROPERTY_HINT_EXP_EASING"
  78. PROPERTY_HINT_LINK:
  79. return "PROPERTY_HINT_LINK"
  80. PROPERTY_HINT_FLAGS:
  81. return "PROPERTY_HINT_FLAGS"
  82. PROPERTY_HINT_LAYERS_2D_RENDER:
  83. return "PROPERTY_HINT_LAYERS_2D_RENDER"
  84. PROPERTY_HINT_LAYERS_2D_PHYSICS:
  85. return "PROPERTY_HINT_LAYERS_2D_PHYSICS"
  86. PROPERTY_HINT_LAYERS_2D_NAVIGATION:
  87. return "PROPERTY_HINT_LAYERS_2D_NAVIGATION"
  88. PROPERTY_HINT_LAYERS_3D_RENDER:
  89. return "PROPERTY_HINT_LAYERS_3D_RENDER"
  90. PROPERTY_HINT_LAYERS_3D_PHYSICS:
  91. return "PROPERTY_HINT_LAYERS_3D_PHYSICS"
  92. PROPERTY_HINT_LAYERS_3D_NAVIGATION:
  93. return "PROPERTY_HINT_LAYERS_3D_NAVIGATION"
  94. PROPERTY_HINT_LAYERS_AVOIDANCE:
  95. return "PROPERTY_HINT_LAYERS_AVOIDANCE"
  96. PROPERTY_HINT_FILE:
  97. return "PROPERTY_HINT_FILE"
  98. PROPERTY_HINT_DIR:
  99. return "PROPERTY_HINT_DIR"
  100. PROPERTY_HINT_GLOBAL_FILE:
  101. return "PROPERTY_HINT_GLOBAL_FILE"
  102. PROPERTY_HINT_GLOBAL_DIR:
  103. return "PROPERTY_HINT_GLOBAL_DIR"
  104. PROPERTY_HINT_RESOURCE_TYPE:
  105. return "PROPERTY_HINT_RESOURCE_TYPE"
  106. PROPERTY_HINT_MULTILINE_TEXT:
  107. return "PROPERTY_HINT_MULTILINE_TEXT"
  108. PROPERTY_HINT_EXPRESSION:
  109. return "PROPERTY_HINT_EXPRESSION"
  110. PROPERTY_HINT_PLACEHOLDER_TEXT:
  111. return "PROPERTY_HINT_PLACEHOLDER_TEXT"
  112. PROPERTY_HINT_COLOR_NO_ALPHA:
  113. return "PROPERTY_HINT_COLOR_NO_ALPHA"
  114. PROPERTY_HINT_OBJECT_ID:
  115. return "PROPERTY_HINT_OBJECT_ID"
  116. PROPERTY_HINT_TYPE_STRING:
  117. return "PROPERTY_HINT_TYPE_STRING"
  118. PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE:
  119. return "PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE"
  120. PROPERTY_HINT_OBJECT_TOO_BIG:
  121. return "PROPERTY_HINT_OBJECT_TOO_BIG"
  122. PROPERTY_HINT_NODE_PATH_VALID_TYPES:
  123. return "PROPERTY_HINT_NODE_PATH_VALID_TYPES"
  124. PROPERTY_HINT_SAVE_FILE:
  125. return "PROPERTY_HINT_SAVE_FILE"
  126. PROPERTY_HINT_GLOBAL_SAVE_FILE:
  127. return "PROPERTY_HINT_GLOBAL_SAVE_FILE"
  128. PROPERTY_HINT_INT_IS_OBJECTID:
  129. return "PROPERTY_HINT_INT_IS_OBJECTID"
  130. PROPERTY_HINT_INT_IS_POINTER:
  131. return "PROPERTY_HINT_INT_IS_POINTER"
  132. PROPERTY_HINT_ARRAY_TYPE:
  133. return "PROPERTY_HINT_ARRAY_TYPE"
  134. PROPERTY_HINT_LOCALE_ID:
  135. return "PROPERTY_HINT_LOCALE_ID"
  136. PROPERTY_HINT_LOCALIZABLE_STRING:
  137. return "PROPERTY_HINT_LOCALIZABLE_STRING"
  138. PROPERTY_HINT_NODE_TYPE:
  139. return "PROPERTY_HINT_NODE_TYPE"
  140. PROPERTY_HINT_HIDE_QUATERNION_EDIT:
  141. return "PROPERTY_HINT_HIDE_QUATERNION_EDIT"
  142. PROPERTY_HINT_PASSWORD:
  143. return "PROPERTY_HINT_PASSWORD"
  144. push_error("Argument `hint` is invalid. Use `PROPERTY_HINT_*` constants.")
  145. return "<invalid hint>"
  146. static func get_property_usage_string(usage: int) -> String:
  147. if usage == PROPERTY_USAGE_NONE:
  148. return "PROPERTY_USAGE_NONE"
  149. const FLAGS: Array[Array] = [
  150. [PROPERTY_USAGE_STORAGE, "PROPERTY_USAGE_STORAGE"],
  151. [PROPERTY_USAGE_EDITOR, "PROPERTY_USAGE_EDITOR"],
  152. [PROPERTY_USAGE_INTERNAL, "PROPERTY_USAGE_INTERNAL"],
  153. [PROPERTY_USAGE_CHECKABLE, "PROPERTY_USAGE_CHECKABLE"],
  154. [PROPERTY_USAGE_CHECKED, "PROPERTY_USAGE_CHECKED"],
  155. [PROPERTY_USAGE_GROUP, "PROPERTY_USAGE_GROUP"],
  156. [PROPERTY_USAGE_CATEGORY, "PROPERTY_USAGE_CATEGORY"],
  157. [PROPERTY_USAGE_SUBGROUP, "PROPERTY_USAGE_SUBGROUP"],
  158. [PROPERTY_USAGE_CLASS_IS_BITFIELD, "PROPERTY_USAGE_CLASS_IS_BITFIELD"],
  159. [PROPERTY_USAGE_NO_INSTANCE_STATE, "PROPERTY_USAGE_NO_INSTANCE_STATE"],
  160. [PROPERTY_USAGE_RESTART_IF_CHANGED, "PROPERTY_USAGE_RESTART_IF_CHANGED"],
  161. [PROPERTY_USAGE_SCRIPT_VARIABLE, "PROPERTY_USAGE_SCRIPT_VARIABLE"],
  162. [PROPERTY_USAGE_STORE_IF_NULL, "PROPERTY_USAGE_STORE_IF_NULL"],
  163. [PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED, "PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED"],
  164. [PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE, "PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE"],
  165. [PROPERTY_USAGE_CLASS_IS_ENUM, "PROPERTY_USAGE_CLASS_IS_ENUM"],
  166. [PROPERTY_USAGE_NIL_IS_VARIANT, "PROPERTY_USAGE_NIL_IS_VARIANT"],
  167. [PROPERTY_USAGE_ARRAY, "PROPERTY_USAGE_ARRAY"],
  168. [PROPERTY_USAGE_ALWAYS_DUPLICATE, "PROPERTY_USAGE_ALWAYS_DUPLICATE"],
  169. [PROPERTY_USAGE_NEVER_DUPLICATE, "PROPERTY_USAGE_NEVER_DUPLICATE"],
  170. [PROPERTY_USAGE_HIGH_END_GFX, "PROPERTY_USAGE_HIGH_END_GFX"],
  171. [PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT, "PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT"],
  172. [PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT, "PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT"],
  173. [PROPERTY_USAGE_KEYING_INCREMENTS, "PROPERTY_USAGE_KEYING_INCREMENTS"],
  174. [PROPERTY_USAGE_DEFERRED_SET_RESOURCE, "PROPERTY_USAGE_DEFERRED_SET_RESOURCE"],
  175. [PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT, "PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT"],
  176. [PROPERTY_USAGE_EDITOR_BASIC_SETTING, "PROPERTY_USAGE_EDITOR_BASIC_SETTING"],
  177. [PROPERTY_USAGE_READ_ONLY, "PROPERTY_USAGE_READ_ONLY"],
  178. [PROPERTY_USAGE_SECRET, "PROPERTY_USAGE_SECRET"],
  179. ]
  180. var result: String = ""
  181. if (usage & PROPERTY_USAGE_DEFAULT) == PROPERTY_USAGE_DEFAULT:
  182. result += "PROPERTY_USAGE_DEFAULT|"
  183. usage &= ~PROPERTY_USAGE_DEFAULT
  184. for flag in FLAGS:
  185. if usage & flag[0]:
  186. result += flag[1] + "|"
  187. usage &= ~flag[0]
  188. if usage != PROPERTY_USAGE_NONE:
  189. push_error("Argument `usage` is invalid. Use `PROPERTY_USAGE_*` constants.")
  190. return "<invalid usage flags>"
  191. return result.left(-1)