Thank you for looking into this.

> In an IDE, if you have x.<auto complete keys here> you would then be 
> presented with getProperty, setProperty and get/setMetaClass. Do we actually 
> want that?

These methods are public and non-synthetic in GroovyObject interface so they 
will be suggested independently of their implementations.

—

Daniil Ovchinnikov
Software Developer
JetBrains
jetbrains.com
“Drive to develop”


> On 10 Mar 2018, at 03:48, Paul King <pa...@asert.com.au> wrote:
> 
> 
> We have recently also started adding @Generated to such methods. Originally 
> this was to assist with better results when doing coverage. One option would 
> be to remove the synthetic now with the expectation that tools could look for 
> the annotation.
> 
> But I understand Jochen's point that this has been there a while so it might 
> be hard to understand all the implications for all language users.
> 
> Cheers, Paul.
> 
> On Sat, Mar 10, 2018 at 9:10 AM, Jochen Theodorou <blackd...@gmx.org 
> <mailto:blackd...@gmx.org>> wrote:
> On 09.03.2018 17:19, Daniel.Sun wrote:
> Hi Daniil,
> 
>        Maybe Jochen can tell us the reason.
> 
>        Ping Jochen ;-)
> 
> 
> Checking Verifier I see:
> 
>         if (!node.hasMethod("getProperty", GET_PROPERTY_PARAMS)) {
>             MethodNode methodNode = addMethod(node, 
> !isAbstract(node.getModifiers()),
>                     "getProperty",
>                     ACC_PUBLIC,
>                     ClassHelper.OBJECT_TYPE,
>                     GET_PROPERTY_PARAMS,
>                     ClassNode.EMPTY_ARRAY,
>                     new BytecodeSequence(new BytecodeInstruction() {
>                         public void visit(MethodVisitor mv) {
> ...
>                         }
>                     })
>             );
>             if (shouldAnnotate) methodNode.addAnnotation(generatedAnnotation);
>         }
> 
> This is having only ACC_PUBLIC as modifier, no ACC_SYNTHETIC.
> 
> Using Groovy 2.4.14 to compile class X{} shows this:
> 
>   // access flags 0x1001
>   public synthetic getProperty(Ljava/lang/String;)Ljava/lang/Object;
> 
> Investigating further shows, addMethod is there as well.... investigating 
> more into the history points me to
> 
> fix for GROOVY-3877. To ensure abstract classes can always be extended in 
> Java, even if precompiled, all Groovyobject methods must not have the 
> synthetic flag being set. In normal classes this is no problem.
> 
> but that is only to lift the restriction for abstract classes.... and then it 
> goes to way before... 891ad59d074990a38d7ba0dca65890e80061158a from Jan 29 
> 2004, a change made by James explicitly to add synthetic
> 
> I think the idea was that everything the compiler adds as a helper method is 
> supposed to be synthetic. Most likely back then getProperty and friends have 
> been seen as internal methods, not to be called directly. And from Java code 
> you rarely do. In most cases you go through GroovyObject instead. Now given 
> that this is there for like 14 years I think it is worth spending a minute on 
> the implications.
> 
> In an IDE, if you have x.<auto complete keys here> you would then be 
> presented with getProperty, setProperty and get/setMetaClass. Do we actually 
> want that?
> 
> bye Jochen
> 

Reply via email to