Implement alternative enum syntax
https://trello.com/c/8SWTk9jt/29-alternative-enum-syntax
This commit is contained in:
parent
c26fc81a2b
commit
c4da1c4fad
|
@ -58,7 +58,9 @@ def get_type_info(types, typename, aliases={}):
|
||||||
alias = tp['alias']
|
alias = tp['alias']
|
||||||
tp = get_type_info(types, tp['alias']).copy()
|
tp = get_type_info(types, tp['alias']).copy()
|
||||||
tp['alias'] = alias
|
tp['alias'] = alias
|
||||||
if tp['generic'] == True:
|
generic = 'generic' in tp and tp['generic'] == True
|
||||||
|
# primitive types are always generic
|
||||||
|
if generic or not 'method' in tp:
|
||||||
tp['type'] = name
|
tp['type'] = name
|
||||||
|
|
||||||
if alias_name:
|
if alias_name:
|
||||||
|
@ -105,15 +107,6 @@ def get_type_size(types, typename, aliases={}):
|
||||||
|
|
||||||
return int(size)
|
return int(size)
|
||||||
|
|
||||||
def print_enum(name, dict, primitive = 'int32_t'):
|
|
||||||
add_text('enum class {} : {}', name, primitive)
|
|
||||||
add_text('{{')
|
|
||||||
indent()
|
|
||||||
for key, value in dict.items():
|
|
||||||
add_text('{} = {},', key, value)
|
|
||||||
unindent()
|
|
||||||
add_text('}};')
|
|
||||||
|
|
||||||
def get_rw_func(types, typename, read, aliases={}):
|
def get_rw_func(types, typename, read, aliases={}):
|
||||||
method = 'Read' if read else 'Write'
|
method = 'Read' if read else 'Write'
|
||||||
|
|
||||||
|
@ -133,8 +126,30 @@ def get_rw_func(types, typename, read, aliases={}):
|
||||||
#print('{} -> {}'.format(typename, method))
|
#print('{} -> {}'.format(typename, method))
|
||||||
|
|
||||||
return method
|
return method
|
||||||
|
|
||||||
|
def get_enum_type(dict, fallback = 'int32'):
|
||||||
|
return dict['.type'] if '.type' in dict else fallback
|
||||||
|
|
||||||
|
def print_enum(name, dict, types={}, fallback = None):
|
||||||
|
primType = get_enum_type(dict, fallback)
|
||||||
|
|
||||||
|
if primType == None:
|
||||||
|
# if we have nothing to resolve with and no fallback then use int32_t
|
||||||
|
primitive = 'int32_t'
|
||||||
|
else:
|
||||||
|
primitive = resolve_type(types, primType)
|
||||||
|
|
||||||
def print_messages(list, types):
|
add_text('enum class {} : {}', name, primitive)
|
||||||
|
add_text('{{')
|
||||||
|
indent()
|
||||||
|
for key, value in dict.items():
|
||||||
|
if key.startswith('.'):
|
||||||
|
continue # ignore metadata
|
||||||
|
add_text('{} = {},', key, value)
|
||||||
|
unindent()
|
||||||
|
add_text('}};')
|
||||||
|
|
||||||
|
def print_messages(list, globalTypes):
|
||||||
global text
|
global text
|
||||||
for state, direction_list in list.items():
|
for state, direction_list in list.items():
|
||||||
add_text('namespace {}', state.capitalize())
|
add_text('namespace {}', state.capitalize())
|
||||||
|
@ -143,6 +158,9 @@ def print_messages(list, types):
|
||||||
for direction, messages in direction_list.items():
|
for direction, messages in direction_list.items():
|
||||||
serverbound = direction == 'serverbound'
|
serverbound = direction == 'serverbound'
|
||||||
for message_name, message in messages.items():
|
for message_name, message in messages.items():
|
||||||
|
|
||||||
|
# global and local types
|
||||||
|
types = globalTypes.copy()
|
||||||
|
|
||||||
# add any local aliases
|
# add any local aliases
|
||||||
aliases = {}
|
aliases = {}
|
||||||
|
@ -150,6 +168,12 @@ def print_messages(list, types):
|
||||||
for alias in message['aliases']:
|
for alias in message['aliases']:
|
||||||
aliases[alias] = message['aliases'][alias]
|
aliases[alias] = message['aliases'][alias]
|
||||||
|
|
||||||
|
# add enums to local types
|
||||||
|
if 'enums' in message:
|
||||||
|
for enum in message['enums']:
|
||||||
|
if not enum in aliases:
|
||||||
|
types[enum] = {'alias': get_enum_type(message['enums'][enum])}
|
||||||
|
|
||||||
global varint_max_size
|
global varint_max_size
|
||||||
size = varint_max_size # Packet Length
|
size = varint_max_size # Packet Length
|
||||||
size += varint_max_size # Packet Id
|
size += varint_max_size # Packet Id
|
||||||
|
@ -170,9 +194,9 @@ def print_messages(list, types):
|
||||||
if enum in aliases:
|
if enum in aliases:
|
||||||
# lookup enum primitive type from aliases
|
# lookup enum primitive type from aliases
|
||||||
prim = resolve_type(types, aliases[enum])
|
prim = resolve_type(types, aliases[enum])
|
||||||
print_enum(enum, message['enums'][enum], prim)
|
print_enum(enum, message['enums'][enum], types, prim)
|
||||||
else:
|
else:
|
||||||
print_enum(enum, message['enums'][enum])
|
print_enum(enum, message['enums'][enum], types)
|
||||||
newline()
|
newline()
|
||||||
if serverbound:
|
if serverbound:
|
||||||
add_text('{}(PacketReader& reader)', struct_name)
|
add_text('{}(PacketReader& reader)', struct_name)
|
||||||
|
|
|
@ -257,6 +257,8 @@
|
||||||
id: 0x36
|
id: 0x36
|
||||||
enums: {
|
enums: {
|
||||||
RelativeFlags: {
|
RelativeFlags: {
|
||||||
|
.type: byte
|
||||||
|
|
||||||
X: 1,
|
X: 1,
|
||||||
Y: 2,
|
Y: 2,
|
||||||
Z: 4,
|
Z: 4,
|
||||||
|
@ -264,9 +266,6 @@
|
||||||
X_ROT: 16,
|
X_ROT: 16,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
aliases: {
|
|
||||||
RelativeFlags: byte
|
|
||||||
}
|
|
||||||
vars: {
|
vars: {
|
||||||
x: double
|
x: double
|
||||||
y: double
|
y: double
|
||||||
|
|
Loading…
Reference in New Issue