Ver Fonte

nim bindings: change enum naming conventions

Enum items are now prefixes instead of relying on the enum
name for scoping. This was necessary because Nim's
'pure' doesn't enforce putting the enum name in front
of the enum items.
Andre Weissflog há 3 anos atrás
pai
commit
c5bec4a415
1 ficheiros alterados com 36 adições e 26 exclusões
  1. 36 26
      bindgen/gen_nim.py

+ 36 - 26
bindgen/gen_nim.py

@@ -42,21 +42,38 @@ overrides = {
     'SG_BUFFERTYPE_VERTEXBUFFER':   'SG_BUFFERTYPE_VERTEX_BUFFER',
     'SG_BUFFERTYPE_INDEXBUFFER':    'SG_BUFFERTYPE_INDEX_BUFFER',
     'SG_ACTION_DONTCARE':           'SG_ACTION_DONT_CARE',
-    'SAPP_KEYCODE_0':               'SAPP_KEYCODE_DIGIT_0',
-    'SAPP_KEYCODE_1':               'SAPP_KEYCODE_DIGIT_1',
-    'SAPP_KEYCODE_2':               'SAPP_KEYCODE_DIGIT_2',
-    'SAPP_KEYCODE_3':               'SAPP_KEYCODE_DIGIT_3',
-    'SAPP_KEYCODE_4':               'SAPP_KEYCODE_DIGIT_4',
-    'SAPP_KEYCODE_5':               'SAPP_KEYCODE_DIGIT_5',
-    'SAPP_KEYCODE_6':               'SAPP_KEYCODE_DIGIT_6',
-    'SAPP_KEYCODE_7':               'SAPP_KEYCODE_DIGIT_7',
-    'SAPP_KEYCODE_8':               'SAPP_KEYCODE_DIGIT_8',
-    'SAPP_KEYCODE_9':               'SAPP_KEYCODE_DIGIT_9',
-    'SG_IMAGETYPE_2D':              'SG_IMAGETYPE_TWO_DEE',
-    'SG_IMAGETYPE_3D':              'SG_IMAGETYPE_THREE_DEE',
     'ptr':                          'pointer', # range ptr
 }
 
+enumPrefixOverrides = {
+    # sokol_gfx.h
+    'PIXELFORMAT': 'pixelFormat',
+    'RESOURCESTATE': 'resourceState',
+    'BUFFERTYPE': 'bufferType',
+    'INDEXTYPE': 'indexType',
+    'IMAGETYPE': 'imageType',
+    'SAMPLERTYPE': 'samplerType',
+    'CUBEFACE': 'cubeFace',
+    'SHADERSTAGE': 'shaderStage',
+    'PRIMITIVETYPE': 'primitiveType',
+    'BORDERCOLOR': 'borderColor',
+    'VERTEXFORMAT': 'vertexFormat',
+    'VERTEXSTEP': 'vertexStep',
+    'UNIFORMTYPE': 'uniformType',
+    'UNIFORMLAYOUT': 'uniformLayout',
+    'CULLMODE': 'cullMode',
+    'FACEWINDING': 'faceWinding',
+    'COMPAREFUNC': 'compareFunc',
+    'STENCILOP': 'stencilOp',
+    'BLENDFACTOR': 'blendFactor',
+    'BLENDOP': 'blendOp',
+    'COLORMASK': 'colorMask',
+    # sokol_app.h
+    'EVENTTYPE': 'eventType',
+    'KEYCODE': 'keyCode',
+    'MOUSEBUTTON': 'mouseButton',
+}
+
 prim_types = {
     'int':          'cint',
     'bool':         'bool',
@@ -133,17 +150,14 @@ yield
 
 struct_types = []
 enum_types = []
-enum_items = {}
 out_lines = ''
 
 def reset_globals():
     global struct_types
     global enum_types
-    global enum_items
     global out_lines
     struct_types = []
     enum_types = []
-    enum_items = {}
     out_lines = ''
 
 re_1d_array = re.compile("^(?:const )?\w*\s\*?\[\d*\]$")
@@ -200,20 +214,19 @@ def as_camel_case(s, prefix):
         outp += part.capitalize()
     return wrap_keywords(outp)
 
-# PREFIX_ENUM_BLA_BLO => Bla, _PREFIX_ENUM_BLA_BLO => blaBlo
+# PREFIX_ENUM_BLA_BLO => blaBlo
 def as_enum_item_name(s):
     outp = s.lstrip('_')
-    parts = outp.lower().split('_')[2:]
+    parts = outp.split('_')[1:]
+    if parts[0] in enumPrefixOverrides:
+        parts[0] = enumPrefixOverrides[parts[0]]
+    else:
+        parts[0] = parts[0].lower()
     outp = parts[0]
     for part in parts[1:]:
         outp += part.capitalize()
-    if outp[0].isdigit():
-        outp = '_' + outp
     return wrap_keywords(outp)
 
-def enum_default_item(enum_name):
-    return enum_items[enum_name][0]
-
 def is_prim_type(s):
     return s in prim_types
 
@@ -383,7 +396,7 @@ def gen_enum(decl, prefix):
             item_names_by_value[value] = as_enum_item_name(item_name)
     enum_name_nim = as_nim_type_name(decl['name'], prefix)
     l('type')
-    l(f"  {enum_name_nim}* {{.pure, size:sizeof(int32).}} = enum")
+    l(f"  {enum_name_nim}* {{.size:sizeof(int32).}} = enum")
     if has_explicit_values:
         # Nim requires explicit enum values to be declared in ascending order
         for value in sorted(item_names_by_value):
@@ -483,9 +496,6 @@ def pre_parse(inp):
         elif kind == 'enum':
             enum_name = decl['name']
             enum_types.append(enum_name)
-            enum_items[enum_name] = []
-            for item in decl['items']:
-                enum_items[enum_name].append(as_enum_item_name(item['name']))
 
 def gen_imports(inp, dep_prefixes):
     for dep_prefix in dep_prefixes: