Hey Chris & Sebastian,
That's a great addition cause I've ran into parser issues while trying to extend ADS mspec. My trouble was a frame with error code which lead to a nested type switch. For proof of concept I moved typeSwitch to another discriminatedType which worked, but caused a massive change to the generated code and logic of drivers. Looking at your example I have a new hope that amount of changes can be reduced. :-)

Kind regards,
Łukasz

On 27.01.2023 12:48, Christofer Dutz wrote:
Hi all,

I guess most people won’t care about this, but for anyone writing MSPECs, this 
is HUGE.

Sebastian and I implemented some changes to mspec and the Java code-generation 
that now allow using typeSwitch fields inside cases of typeSwitches.

This allows multiple layers of polymorphism.

Here our example mspec that we tested with:

[discriminatedType TypeSwitchInTypeSwitchParentType
     [discriminator uint 8 typeNumber]
     [simple uint 8 parentFieldHurz]
     [typeSwitch typeNumber
         ['0x00' *Child0
             [discriminator uint 8 childNumber]
             [simple uint 8 childFieldwolf]
             [typeSwitch childNumber
                 ['0x01' *Infant0
                     [discriminator uint 8 infantNumber]
                     [simple uint 8 infantSomeField00]
                     [typeSwitch infantNumber
                         ['0x98' *InfantsChild0
                             [simple uint 8 infantsChild0SomeField00]
                         ]
                         ['0x99' *InfantsChild1
                             [simple uint 8 infantsChild1SomeField00]
                         ]
                     ]
                 ]
                 ['0x02' *Infant1
                     [simple uint 8 infantSomeField01]
                 ]
                 ['0x03' *Infant2
                     [simple uint 8 infantSomeField02]
                 ]
             ]
         ]
         ['0x10' *Child1
             [discriminator uint 8 childNumber]
             [simple uint 8 childFieldLamm]
             [typeSwitch childNumber
                 ['0x11' *Infant3
                     [simple uint 8 infantSomeField1ß]
                 ]
                 ['0x12' *Infant4
                     [simple uint 8 infantSomeField11]
                 ]
                 ['0x13' *Infant5
                     [simple uint 8 infantSomeField12]
                 ]
             ]
         ]
         ['0x20' *Child2
             [discriminator uint 8 childNumber]
             [simple uint 8 childFieldGrueneWiese]
             [typeSwitch childNumber
                 ['0x21' *Infant6
                     [simple uint 8 infantSomeField21]
                 ]
                 ['0x22' *Infant7
                     [simple uint 8 infantSomeField22]
                 ]
                 ['0x23' *Infant8
                     [simple uint 8 infantSomeField23]
                 ]
             ]
         ]
     ]
]

While working on the code-gen and fixing some issues with a new protocol I’m 
working on, I noticed that we were generating unneeded properties into our 
types, that required us to set some dummy values.

I’ve changed this that this no longer is needed but can be switched on via 
code-generation options.

<configuration>
   <protocolName>c-bus</protocolName>
   <languageName>java</languageName>
   <outputFlavor>read-write</outputFlavor>
   <outputDir>src/main/generated</outputDir>
   <options>
     
<generate-properties-for-parser-arguments>true</generate-properties-for-parser-arguments>
     <!-- We want properties that contain the values of reserved fields, if the 
value differs from the expected one -->
     
<generate-properties-for-reserved-fields>true</generate-properties-for-reserved-fields>
   </options>
</configuration>

I’ve also removed the dummy values from the drivers in all drivers except c-bus 
and bacnet.

Still doing the last tweaks but hope to be able to push soon.

So far the update :-)

Chris




Reply via email to