groovy-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Paul King (JIRA)" <j...@apache.org>
Subject [jira] [Closed] (GROOVY-8455) @TupleConstructor gives wrong ordering when includeSuperFields is set
Date Tue, 06 Mar 2018 23:26:10 GMT

     [ https://issues.apache.org/jira/browse/GROOVY-8455?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Paul King closed GROOVY-8455.
-----------------------------

> @TupleConstructor gives wrong ordering when includeSuperFields is set
> ---------------------------------------------------------------------
>
>                 Key: GROOVY-8455
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8455
>             Project: Groovy
>          Issue Type: Bug
>            Reporter: Paul King
>            Assignee: Paul King
>            Priority: Major
>             Fix For: 2.5.0-beta-3
>
>
> When the {{includeSuperProperties}} flag is set, @TupleConstructor includes those properties
and historically has done it with properties from parent classes first. This is also true
if just the {{includeSuperFields}} flag is set. When both flags are set the intention was
to keep this ordering but currently that is not the case.
> Here is an example:
> {code}
> import groovy.transform.*
> class Foopubf{}
> class Foop{}
> class Foopp{}
> class Foo {
>   Foop foop1
>   public Foopubf foopubf
>   protected Short fooProtField = 42
>   void setFooPseudoProp(Foopp fpp) {}
>   Foopp getFooPseudoProp() { null }
> }
> class Barpubf{}
> class Barp{}
> class Barpp{}
> class Bar extends Foo {
>   Barp barp
>   public Barpubf barpubf
>   protected Integer barProtField = 150
>   Barpp getBarPseudoProp() { null }
>   void setBarPseudoProp(Barpp bpp) { }
> }
> class Bazpubf{}
> class Bazp{}
> class Bazpp{}
> @TupleConstructor(includeFields=true, includeSuperFields=true, includeSuperProperties=true)
> class Baz extends Bar {
>   Bazp bazp
>   public Bazpubf bazpubf
>   protected Long bazProtField = 2000L
>   Bazpp getBazPseudoProp() { null }
>   void setBazPseudoProp(Bazpp bpp) { }
> }
> Baz.constructors.each {
>     println it
> }
> {code}
> which produces:
> {code}
> public Baz(Foop,Barp,Foopubf,java.lang.Short,Barpubf,java.lang.Integer,Bazp,Bazpubf,java.lang.Long)
> public Baz(Foop,Barp,Foopubf,java.lang.Short,Barpubf,java.lang.Integer,Bazp,Bazpubf)
> public Baz(Foop,Barp,Foopubf,java.lang.Short,Barpubf,java.lang.Integer,Bazp)
> public Baz(Foop,Barp,Foopubf,java.lang.Short,Barpubf,java.lang.Integer)
> public Baz(Foop,Barp,Foopubf,java.lang.Short,Barpubf)
> public Baz(Foop,Barp,Foopubf,java.lang.Short)
> public Baz(Foop,Barp,Foopubf)
> public Baz(Foop,Barp)
> public Baz(Foop)
> public Baz()
> {code}
> Here, {{Barp}} is meant to be the 4th not 2nd param. This is a breaking change but I
believe that {{includeSuperFields}} is rarely used and the two flags together perhaps slightly
more so. Given that I am about to add JavaBean properties into the mix, it seems best to fix
this now. The workaround for those requiring the old behavior is to add an {{includes}} annotation
attribute and specify the required order. For the above example: {{includes='foop,barp,foopubf,...'}}.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message