diff mbox

[v5,04/14] qapi: Adjust names of implicit types

Message ID 1457571335-10938-5-git-send-email-eblake@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Eric Blake March 10, 2016, 12:55 a.m. UTC
The original choice of ':obj-' as the prefix for implicit types
made it obvious that we weren't going to clash with any user-defined
names.  But now we want to create structs for implicit types.  We
could transliterate ':' to '_', except that C99 says that a leading
underscore and lower-case letter should be used only for file scope
identifiers, while we would be exposing it in qapi-types.h.  So it's
time to change our naming convention; we can instead use the 'q_'
prefix that we reserved for ourselves back in commit 9fb081e0.  As
long as we don't declare 'empty' or 'obj' ticklish, it shouldn't
clash with c_name() prepending 'q_' to the user's ticklish names.

Signed-off-by: Eric Blake <eblake@redhat.com>

---
v5: new patch
---
 scripts/qapi.py                          |  18 ++--
 docs/qapi-code-gen.txt                   |  14 +--
 tests/qapi-schema/comments.out           |   2 +-
 tests/qapi-schema/empty.out              |   2 +-
 tests/qapi-schema/event-case.out         |   2 +-
 tests/qapi-schema/ident-with-escape.out  |   8 +-
 tests/qapi-schema/include-relpath.out    |   2 +-
 tests/qapi-schema/include-repetition.out |   2 +-
 tests/qapi-schema/include-simple.out     |   2 +-
 tests/qapi-schema/indented-expr.out      |   2 +-
 tests/qapi-schema/qapi-schema-test.out   | 154 +++++++++++++++----------------
 11 files changed, 105 insertions(+), 103 deletions(-)

Comments

Markus Armbruster March 10, 2016, 1:39 p.m. UTC | #1
Eric Blake <eblake@redhat.com> writes:

> The original choice of ':obj-' as the prefix for implicit types
> made it obvious that we weren't going to clash with any user-defined
> names.  But now we want to create structs for implicit types.

Why?  I know, but the commit message should still give a hint.  Perhaps:
"to get rid of special cases in the generators"?

>                                                                We
> could transliterate ':' to '_', except that C99 says that a leading
> underscore and lower-case letter should be used only for file scope
> identifiers, while we would be exposing it in qapi-types.h.  So it's

Misunderstanding!  When the standard says "identifiers that X are
reserved for Y use", it reserves these identifiers for itself and the
implementation.  You shouldn't use them for Y then.

Suggest to simply quote the standard instead of interpreting it:
... except that C99 mandates that "identifiers that begin with an
underscore are always reserved for use as identifiers with file scope in
both the ordinary and tag name spaces"

> time to change our naming convention; we can instead use the 'q_'
> prefix that we reserved for ourselves back in commit 9fb081e0.  As
> long as we don't declare 'empty' or 'obj' ticklish, it shouldn't
> clash with c_name() prepending 'q_' to the user's ticklish names.

Do we really want to rename :empty?  We're not going to generate C for
it, are we?

> Signed-off-by: Eric Blake <eblake@redhat.com>
Eric Blake March 10, 2016, 4:11 p.m. UTC | #2
On 03/10/2016 06:39 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> The original choice of ':obj-' as the prefix for implicit types
>> made it obvious that we weren't going to clash with any user-defined
>> names.  But now we want to create structs for implicit types.
> 
> Why?  I know, but the commit message should still give a hint.  Perhaps:
> "to get rid of special cases in the generators"?
> 
>>                                                                We
>> could transliterate ':' to '_', except that C99 says that a leading
>> underscore and lower-case letter should be used only for file scope
>> identifiers, while we would be exposing it in qapi-types.h.  So it's
> 
> Misunderstanding!  When the standard says "identifiers that X are
> reserved for Y use", it reserves these identifiers for itself and the
> implementation.  You shouldn't use them for Y then.
> 
> Suggest to simply quote the standard instead of interpreting it:
> ... except that C99 mandates that "identifiers that begin with an
> underscore are always reserved for use as identifiers with file scope in
> both the ordinary and tag name spaces"

Both those changes sound fine.

> 
>> time to change our naming convention; we can instead use the 'q_'
>> prefix that we reserved for ourselves back in commit 9fb081e0.  As
>> long as we don't declare 'empty' or 'obj' ticklish, it shouldn't
>> clash with c_name() prepending 'q_' to the user's ticklish names.
> 
> Do we really want to rename :empty?  We're not going to generate C for
> it, are we?

No, but it was easier to implement .is_implicit() as
"name.startswith('q_')" than as "name == ':empty' or
name.startswith('q_obj')".  I can stick with :empty if you want a
respin, though.
Markus Armbruster March 11, 2016, 7:48 a.m. UTC | #3
Eric Blake <eblake@redhat.com> writes:

> On 03/10/2016 06:39 AM, Markus Armbruster wrote:
>> Eric Blake <eblake@redhat.com> writes:
>> 
>>> The original choice of ':obj-' as the prefix for implicit types
>>> made it obvious that we weren't going to clash with any user-defined
>>> names.  But now we want to create structs for implicit types.
>> 
>> Why?  I know, but the commit message should still give a hint.  Perhaps:
>> "to get rid of special cases in the generators"?
>> 
>>>                                                                We
>>> could transliterate ':' to '_', except that C99 says that a leading
>>> underscore and lower-case letter should be used only for file scope
>>> identifiers, while we would be exposing it in qapi-types.h.  So it's
>> 
>> Misunderstanding!  When the standard says "identifiers that X are
>> reserved for Y use", it reserves these identifiers for itself and the
>> implementation.  You shouldn't use them for Y then.
>> 
>> Suggest to simply quote the standard instead of interpreting it:
>> ... except that C99 mandates that "identifiers that begin with an
>> underscore are always reserved for use as identifiers with file scope in
>> both the ordinary and tag name spaces"
>
> Both those changes sound fine.
>
>> 
>>> time to change our naming convention; we can instead use the 'q_'
>>> prefix that we reserved for ourselves back in commit 9fb081e0.  As
>>> long as we don't declare 'empty' or 'obj' ticklish, it shouldn't
>>> clash with c_name() prepending 'q_' to the user's ticklish names.
>> 
>> Do we really want to rename :empty?  We're not going to generate C for
>> it, are we?
>
> No, but it was easier to implement .is_implicit() as
> "name.startswith('q_')" than as "name == ':empty' or
> name.startswith('q_obj')".  I can stick with :empty if you want a
> respin, though.

You avoid complicating .is_implicit() slightly, and you pay for that
with a bit of patch churn elsewhere.  Sounds justified.

Is ':empty' the last use of the ':' prefix?

General maxims:

1. Keep the generator simple while generating something reasonable.  No
need to overcomplicate things when we can rely on the optimizer to do
its job.  Keeping headers lean is worth more complexity than keeping .c
files lean, because headers get compiled much, much more.

2. When all else is equal, avoid patch churn.
Eric Blake March 11, 2016, 5:29 p.m. UTC | #4
On 03/11/2016 12:48 AM, Markus Armbruster wrote:

>>>> time to change our naming convention; we can instead use the 'q_'
>>>> prefix that we reserved for ourselves back in commit 9fb081e0.  As
>>>> long as we don't declare 'empty' or 'obj' ticklish, it shouldn't
>>>> clash with c_name() prepending 'q_' to the user's ticklish names.
>>>
>>> Do we really want to rename :empty?  We're not going to generate C for
>>> it, are we?
>>
>> No, but it was easier to implement .is_implicit() as
>> "name.startswith('q_')" than as "name == ':empty' or
>> name.startswith('q_obj')".  I can stick with :empty if you want a
>> respin, though.
> 
> You avoid complicating .is_implicit() slightly, and you pay for that
> with a bit of patch churn elsewhere.  Sounds justified.
> 
> Is ':empty' the last use of the ':' prefix?

Yes.  And renaming it to 'q_empty' meant I didn't have to add ':' to the
set of characters to be transliterated in c_name().
diff mbox

Patch

diff --git a/scripts/qapi.py b/scripts/qapi.py
index b7fbdae..f6701f5 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -391,7 +391,8 @@  def check_name(expr_info, source, name, allow_optional=False,
     # code always prefixes it with the enum name
     if enum_member and membername[0].isdigit():
         membername = 'D' + membername
-    # Reserve the entire 'q_' namespace for c_name()
+    # Reserve the entire 'q_' namespace for c_name(), and for 'q_empty'
+    # and 'q_obj_*' implicit type names.
     if not valid_name.match(membername) or \
        c_name(membername, False).startswith('q_'):
         raise QAPIExprError(expr_info,
@@ -994,8 +995,9 @@  class QAPISchemaObjectType(QAPISchemaType):
             m.check_clash(info, seen)

     def is_implicit(self):
-        # See QAPISchema._make_implicit_object_type()
-        return self.name[0] == ':'
+        # See QAPISchema._make_implicit_object_type(), as well as
+        # _def_predefineds()
+        return self.name.startswith('q_')

     def c_name(self):
         assert not self.is_implicit()
@@ -1044,10 +1046,10 @@  class QAPISchemaMember(object):

     def _pretty_owner(self):
         owner = self.owner
-        if owner.startswith(':obj-'):
+        if owner.startswith('q_obj_'):
             # See QAPISchema._make_implicit_object_type() - reverse the
             # mapping there to create a nice human-readable description
-            owner = owner[5:]
+            owner = owner[6:]
             if owner.endswith('-arg'):
                 return '(parameter of %s)' % owner[:-4]
             else:
@@ -1266,8 +1268,8 @@  class QAPISchema(object):
                   ('bool',   'boolean', 'bool',     'false'),
                   ('any',    'value',   'QObject' + pointer_suffix, 'NULL')]:
             self._def_builtin_type(*t)
-        self.the_empty_object_type = QAPISchemaObjectType(':empty', None, None,
-                                                          [], None)
+        self.the_empty_object_type = QAPISchemaObjectType('q_empty', None,
+                                                          None, [], None)
         self._def_entity(self.the_empty_object_type)
         qtype_values = self._make_enum_members(['none', 'qnull', 'qint',
                                                 'qstring', 'qdict', 'qlist',
@@ -1295,7 +1297,7 @@  class QAPISchema(object):
         if not members:
             return None
         # See also QAPISchemaObjectTypeMember._pretty_owner()
-        name = ':obj-%s-%s' % (name, role)
+        name = 'q_obj_%s-%s' % (name, role)
         if not self.lookup_entity(name, QAPISchemaObjectType):
             self._def_entity(QAPISchemaObjectType(name, info, None,
                                                   members, None))
diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt
index e0b2ef1..c648f76 100644
--- a/docs/qapi-code-gen.txt
+++ b/docs/qapi-code-gen.txt
@@ -575,9 +575,9 @@  names an object type without members.
 Example: the SchemaInfo for command query-qmp-schema

     { "name": "query-qmp-schema", "meta-type": "command",
-      "arg-type": ":empty", "ret-type": "SchemaInfoList" }
+      "arg-type": "q_empty", "ret-type": "SchemaInfoList" }

-    Type ":empty" is an object type without members, and type
+    Type "q_empty" is an automatic object type without members, and type
     "SchemaInfoList" is the array of SchemaInfo type.

 The SchemaInfo for an event has meta-type "event", and variant member
@@ -594,9 +594,9 @@  QAPI schema implicitly defines an object type.
 Example: the SchemaInfo for EVENT_C from section Events

     { "name": "EVENT_C", "meta-type": "event",
-      "arg-type": ":obj-EVENT_C-arg" }
+      "arg-type": "q_obj-EVENT_C-arg" }

-    Type ":obj-EVENT_C-arg" is an implicitly defined object type with
+    Type "q_obj-EVENT_C-arg" is an implicitly defined object type with
     the two members from the event's definition.

 The SchemaInfo for struct and union types has meta-type "object".
@@ -660,11 +660,11 @@  Union types
           { "name": "type", "type": "BlockdevOptionsKind" } ],
       "tag": "type",
       "variants": [
-          { "case": "file", "type": ":obj-FileOptions-wrapper" },
-          { "case": "qcow2", "type": ":obj-Qcow2Options-wrapper" } ] }
+          { "case": "file", "type": "q_obj-FileOptions-wrapper" },
+          { "case": "qcow2", "type": "q_obj-Qcow2Options-wrapper" } ] }

     Enumeration type "BlockdevOptionsKind" and the object types
-    ":obj-FileOptions-wrapper", ":obj-Qcow2Options-wrapper" are
+    "q_obj-FileOptions-wrapper", "q_obj-Qcow2Options-wrapper" are
     implicitly defined.

 The SchemaInfo for an alternate type has meta-type "alternate", and
diff --git a/tests/qapi-schema/comments.out b/tests/qapi-schema/comments.out
index 97be601..5d7c13c 100644
--- a/tests/qapi-schema/comments.out
+++ b/tests/qapi-schema/comments.out
@@ -1,4 +1,4 @@ 
-object :empty
 enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
     prefix QTYPE
 enum Status ['good', 'bad', 'ugly']
+object q_empty
diff --git a/tests/qapi-schema/empty.out b/tests/qapi-schema/empty.out
index 6522940..8a5b034 100644
--- a/tests/qapi-schema/empty.out
+++ b/tests/qapi-schema/empty.out
@@ -1,3 +1,3 @@ 
-object :empty
 enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
     prefix QTYPE
+object q_empty
diff --git a/tests/qapi-schema/event-case.out b/tests/qapi-schema/event-case.out
index 6350d64..b6b4134 100644
--- a/tests/qapi-schema/event-case.out
+++ b/tests/qapi-schema/event-case.out
@@ -1,4 +1,4 @@ 
-object :empty
 enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
     prefix QTYPE
 event oops None
+object q_empty
diff --git a/tests/qapi-schema/ident-with-escape.out b/tests/qapi-schema/ident-with-escape.out
index 453e0b2..382ce2f 100644
--- a/tests/qapi-schema/ident-with-escape.out
+++ b/tests/qapi-schema/ident-with-escape.out
@@ -1,7 +1,7 @@ 
-object :empty
-object :obj-fooA-arg
-    member bar1: str optional=False
 enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
     prefix QTYPE
-command fooA :obj-fooA-arg -> None
+command fooA q_obj_fooA-arg -> None
    gen=True success_response=True
+object q_empty
+object q_obj_fooA-arg
+    member bar1: str optional=False
diff --git a/tests/qapi-schema/include-relpath.out b/tests/qapi-schema/include-relpath.out
index 97be601..5d7c13c 100644
--- a/tests/qapi-schema/include-relpath.out
+++ b/tests/qapi-schema/include-relpath.out
@@ -1,4 +1,4 @@ 
-object :empty
 enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
     prefix QTYPE
 enum Status ['good', 'bad', 'ugly']
+object q_empty
diff --git a/tests/qapi-schema/include-repetition.out b/tests/qapi-schema/include-repetition.out
index 97be601..5d7c13c 100644
--- a/tests/qapi-schema/include-repetition.out
+++ b/tests/qapi-schema/include-repetition.out
@@ -1,4 +1,4 @@ 
-object :empty
 enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
     prefix QTYPE
 enum Status ['good', 'bad', 'ugly']
+object q_empty
diff --git a/tests/qapi-schema/include-simple.out b/tests/qapi-schema/include-simple.out
index 97be601..5d7c13c 100644
--- a/tests/qapi-schema/include-simple.out
+++ b/tests/qapi-schema/include-simple.out
@@ -1,4 +1,4 @@ 
-object :empty
 enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
     prefix QTYPE
 enum Status ['good', 'bad', 'ugly']
+object q_empty
diff --git a/tests/qapi-schema/indented-expr.out b/tests/qapi-schema/indented-expr.out
index ce37ff5..ae3293a 100644
--- a/tests/qapi-schema/indented-expr.out
+++ b/tests/qapi-schema/indented-expr.out
@@ -1,7 +1,7 @@ 
-object :empty
 enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
     prefix QTYPE
 command eins None -> None
    gen=True success_response=True
+object q_empty
 command zwei None -> None
    gen=True success_response=True
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index f531961..d49fe1d 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -1,58 +1,3 @@ 
-object :empty
-object :obj-EVENT_C-arg
-    member a: int optional=True
-    member b: UserDefOne optional=True
-    member c: str optional=False
-object :obj-EVENT_D-arg
-    member a: EventStructOne optional=False
-    member b: str optional=False
-    member c: str optional=True
-    member enum3: EnumOne optional=True
-object :obj-__org.qemu_x-command-arg
-    member a: __org.qemu_x-EnumList optional=False
-    member b: __org.qemu_x-StructList optional=False
-    member c: __org.qemu_x-Union2 optional=False
-    member d: __org.qemu_x-Alt optional=False
-object :obj-anyList-wrapper
-    member data: anyList optional=False
-object :obj-boolList-wrapper
-    member data: boolList optional=False
-object :obj-guest-get-time-arg
-    member a: int optional=False
-    member b: int optional=True
-object :obj-guest-sync-arg
-    member arg: any optional=False
-object :obj-int16List-wrapper
-    member data: int16List optional=False
-object :obj-int32List-wrapper
-    member data: int32List optional=False
-object :obj-int64List-wrapper
-    member data: int64List optional=False
-object :obj-int8List-wrapper
-    member data: int8List optional=False
-object :obj-intList-wrapper
-    member data: intList optional=False
-object :obj-numberList-wrapper
-    member data: numberList optional=False
-object :obj-sizeList-wrapper
-    member data: sizeList optional=False
-object :obj-str-wrapper
-    member data: str optional=False
-object :obj-strList-wrapper
-    member data: strList optional=False
-object :obj-uint16List-wrapper
-    member data: uint16List optional=False
-object :obj-uint32List-wrapper
-    member data: uint32List optional=False
-object :obj-uint64List-wrapper
-    member data: uint64List optional=False
-object :obj-uint8List-wrapper
-    member data: uint8List optional=False
-object :obj-user_def_cmd1-arg
-    member ud1a: UserDefOne optional=False
-object :obj-user_def_cmd2-arg
-    member ud1a: UserDefOne optional=False
-    member ud1b: UserDefOne optional=True
 alternate AltIntNum
     case i: int
     case n: number
@@ -73,8 +18,8 @@  alternate AltStrNum
     case n: number
 event EVENT_A None
 event EVENT_B None
-event EVENT_C :obj-EVENT_C-arg
-event EVENT_D :obj-EVENT_D-arg
+event EVENT_C q_obj_EVENT_C-arg
+event EVENT_D q_obj_EVENT_D-arg
 object Empty1
 object Empty2
     base Empty1
@@ -127,20 +72,20 @@  object UserDefFlatUnion2
     case value2: UserDefB
 object UserDefNativeListUnion
     member type: UserDefNativeListUnionKind optional=False
-    case integer: :obj-intList-wrapper
-    case s8: :obj-int8List-wrapper
-    case s16: :obj-int16List-wrapper
-    case s32: :obj-int32List-wrapper
-    case s64: :obj-int64List-wrapper
-    case u8: :obj-uint8List-wrapper
-    case u16: :obj-uint16List-wrapper
-    case u32: :obj-uint32List-wrapper
-    case u64: :obj-uint64List-wrapper
-    case number: :obj-numberList-wrapper
-    case boolean: :obj-boolList-wrapper
-    case string: :obj-strList-wrapper
-    case sizes: :obj-sizeList-wrapper
-    case any: :obj-anyList-wrapper
+    case integer: q_obj_intList-wrapper
+    case s8: q_obj_int8List-wrapper
+    case s16: q_obj_int16List-wrapper
+    case s32: q_obj_int32List-wrapper
+    case s64: q_obj_int64List-wrapper
+    case u8: q_obj_uint8List-wrapper
+    case u16: q_obj_uint16List-wrapper
+    case u32: q_obj_uint32List-wrapper
+    case u64: q_obj_uint64List-wrapper
+    case number: q_obj_numberList-wrapper
+    case boolean: q_obj_boolList-wrapper
+    case string: q_obj_strList-wrapper
+    case sizes: q_obj_sizeList-wrapper
+    case any: q_obj_anyList-wrapper
 enum UserDefNativeListUnionKind ['integer', 's8', 's16', 's32', 's64', 'u8', 'u16', 'u32', 'u64', 'number', 'boolean', 'string', 'sizes', 'any']
 object UserDefOne
     base UserDefZero
@@ -189,23 +134,78 @@  object __org.qemu_x-Struct2
     member array: __org.qemu_x-Union1List optional=False
 object __org.qemu_x-Union1
     member type: __org.qemu_x-Union1Kind optional=False
-    case __org.qemu_x-branch: :obj-str-wrapper
+    case __org.qemu_x-branch: q_obj_str-wrapper
 enum __org.qemu_x-Union1Kind ['__org.qemu_x-branch']
 object __org.qemu_x-Union2
     base __org.qemu_x-Base
     tag __org.qemu_x-member1
     case __org.qemu_x-value: __org.qemu_x-Struct2
-command __org.qemu_x-command :obj-__org.qemu_x-command-arg -> __org.qemu_x-Union1
+command __org.qemu_x-command q_obj___org.qemu_x-command-arg -> __org.qemu_x-Union1
    gen=True success_response=True
-command guest-get-time :obj-guest-get-time-arg -> int
+command guest-get-time q_obj_guest-get-time-arg -> int
    gen=True success_response=True
-command guest-sync :obj-guest-sync-arg -> any
+command guest-sync q_obj_guest-sync-arg -> any
    gen=True success_response=True
+object q_empty
+object q_obj_EVENT_C-arg
+    member a: int optional=True
+    member b: UserDefOne optional=True
+    member c: str optional=False
+object q_obj_EVENT_D-arg
+    member a: EventStructOne optional=False
+    member b: str optional=False
+    member c: str optional=True
+    member enum3: EnumOne optional=True
+object q_obj___org.qemu_x-command-arg
+    member a: __org.qemu_x-EnumList optional=False
+    member b: __org.qemu_x-StructList optional=False
+    member c: __org.qemu_x-Union2 optional=False
+    member d: __org.qemu_x-Alt optional=False
+object q_obj_anyList-wrapper
+    member data: anyList optional=False
+object q_obj_boolList-wrapper
+    member data: boolList optional=False
+object q_obj_guest-get-time-arg
+    member a: int optional=False
+    member b: int optional=True
+object q_obj_guest-sync-arg
+    member arg: any optional=False
+object q_obj_int16List-wrapper
+    member data: int16List optional=False
+object q_obj_int32List-wrapper
+    member data: int32List optional=False
+object q_obj_int64List-wrapper
+    member data: int64List optional=False
+object q_obj_int8List-wrapper
+    member data: int8List optional=False
+object q_obj_intList-wrapper
+    member data: intList optional=False
+object q_obj_numberList-wrapper
+    member data: numberList optional=False
+object q_obj_sizeList-wrapper
+    member data: sizeList optional=False
+object q_obj_str-wrapper
+    member data: str optional=False
+object q_obj_strList-wrapper
+    member data: strList optional=False
+object q_obj_uint16List-wrapper
+    member data: uint16List optional=False
+object q_obj_uint32List-wrapper
+    member data: uint32List optional=False
+object q_obj_uint64List-wrapper
+    member data: uint64List optional=False
+object q_obj_uint8List-wrapper
+    member data: uint8List optional=False
+object q_obj_user_def_cmd1-arg
+    member ud1a: UserDefOne optional=False
+object q_obj_user_def_cmd2-arg
+    member ud1a: UserDefOne optional=False
+    member ud1b: UserDefOne optional=True
 command user_def_cmd None -> None
    gen=True success_response=True
 command user_def_cmd0 Empty2 -> Empty2
    gen=True success_response=True
-command user_def_cmd1 :obj-user_def_cmd1-arg -> None
+command user_def_cmd1 q_obj_user_def_cmd1-arg -> None
    gen=True success_response=True
-command user_def_cmd2 :obj-user_def_cmd2-arg -> UserDefTwo
+command user_def_cmd2 q_obj_user_def_cmd2-arg -> UserDefTwo
    gen=True success_response=True