I have a prototype fix. It alters RecordTypeASTTransformation to emit
a BeanInfo class in the emulate case and MetaClassImpl to handle
properties within native records. The following script then works:

============
@RecordOptions(mode=EMULATE)
record PersonA(String name) {}

@RecordOptions(mode=NATIVE)
record PersonB(String name) {}

class PersonC {
  String name
}

def a = new PersonA('Guillaume')
println a.metaClass.properties*.name
println a.metaClass.properties*.class.simpleName

def b = new PersonB('Jochen')
println b.metaClass.properties*.name
println b.metaClass.properties*.class.simpleName

def c = new PersonC(name: 'Eric')
println c.metaClass.properties*.name
println c.metaClass.properties*.class.simpleName

import groovy.json.JsonOutput

println JsonOutput.toJson([a,b,c])
=============
With output:

[name, serialVersionUID, class]
[MetaBeanProperty, CachedField, MetaBeanProperty]
[name, serialVersionUID, class]
[MetaBeanProperty, CachedField, MetaBeanProperty]
[name, class]
[MetaBeanProperty, MetaBeanProperty]
[{"name":"Guillaume"},{"name":"Jochen"},{"name":"Eric"}]

I'll add some more tests and create a PR tomorrow.

Paul.

<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
Virus-free.www.avast.com
<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>

On Tue, Sep 5, 2023 at 6:48 PM Guillaume Laforge <glafo...@gmail.com> wrote:
>
> I also forget the fact that Groovy records are not always Java records when 
> running on older JDKs...
> So it needs to make the difference with real and groovy-specific fallthrough 
> records.
>
> On Tue, Sep 5, 2023 at 10:46 AM Guillaume Laforge <glafo...@gmail.com> wrote:
>>
>> Sure, I just created:
>> https://issues.apache.org/jira/browse/GROOVY-11167
>>
>> Also, thanks for the workaround.
>> I ended up just using a POGO instead, but I hadn't thought of implementing a 
>> Map.
>>
>> I guess JsonOutput needs to be updated here.
>> I suppose we would add a new if case that check if the class of the object 
>> is a record, and the retrieve the components with 
>> clazz.getRecordComponents()?
>>
>> Guillaume
>>
>> On Tue, Sep 5, 2023 at 7:44 AM Paul King <pa...@asert.com.au> wrote:
>>>
>>> We aren't picking up the metabean properties for the record correctly.
>>> Would you like to file a bug report?
>>>
>>> Workarounds are to call "toMap()" (or *.toMap() on the list), or do
>>> something like:
>>> ```
>>> @AutoImplement
>>> record Person(String name) implements Map {
>>>   Set entrySet() { toMap().entrySet() }
>>> }
>>> ```
>>>
>>>
>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
>>> Virus-free.www.avast.com
>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
>>> <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
>>>
>>> On Tue, Sep 5, 2023 at 2:13 AM Guillaume Laforge <glafo...@gmail.com> wrote:
>>> >
>>> > Hi,
>>> >
>>> > I was a bit surprised by this behavior with serializing records in JSON.
>>> >
>>> > I was expecting this assertion to pass:
>>> >
>>> > import groovy.json.JsonOutput
>>> > record Person(String name) {}
>>> > assert JsonOutput.toJson([new Person('Guillaume')]) == 
>>> > '[{"name":"Guillaume"}]'
>>> >
>>> > Instead, I got [{}]
>>> >
>>> > Shouldn't records be treated like POGOs and thus serialize the same way 
>>> > like in my example above? Or is there a good reason why this is not the 
>>> > case?
>>> >
>>> > Guillaume
>>> >
>>> > --
>>> > Guillaume Laforge
>>> > Apache Groovy committer
>>> > Developer Advocate @ Google Cloud
>>> >
>>> > Blog: glaforge.dev
>>> > Twitter: @glaforge
>>> > Mastodon: @glafo...@uwyn.net
>>
>>
>>
>> --
>> Guillaume Laforge
>> Apache Groovy committer
>> Developer Advocate @ Google Cloud
>>
>> Blog: glaforge.dev
>> Twitter: @glaforge
>> Mastodon: @glafo...@uwyn.net
>
>
>
> --
> Guillaume Laforge
> Apache Groovy committer
> Developer Advocate @ Google Cloud
>
> Blog: glaforge.dev
> Twitter: @glaforge
> Mastodon: @glafo...@uwyn.net

Reply via email to