[ 
https://issues.apache.org/jira/browse/GROOVY-7969?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15569528#comment-15569528
 ] 

ASF GitHub Bot commented on GROOVY-7969:
----------------------------------------

Github user blackdrag commented on a diff in the pull request:

    https://github.com/apache/groovy/pull/448#discussion_r83071079
  
    --- Diff: src/main/org/codehaus/groovy/ast/tools/PropertyNodeUtils.java ---
    @@ -0,0 +1,50 @@
    +/*
    + *  Licensed to the Apache Software Foundation (ASF) under one
    + *  or more contributor license agreements.  See the NOTICE file
    + *  distributed with this work for additional information
    + *  regarding copyright ownership.  The ASF licenses this file
    + *  to you under the Apache License, Version 2.0 (the
    + *  "License"); you may not use this file except in compliance
    + *  with the License.  You may obtain a copy of the License at
    + *
    + *    http://www.apache.org/licenses/LICENSE-2.0
    + *
    + *  Unless required by applicable law or agreed to in writing,
    + *  software distributed under the License is distributed on an
    + *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + *  KIND, either express or implied.  See the License for the
    + *  specific language governing permissions and limitations
    + *  under the License.
    + */
    +package org.codehaus.groovy.ast.tools;
    +
    +import org.codehaus.groovy.ast.PropertyNode;
    +
    +import java.lang.reflect.Modifier;
    +
    +public class PropertyNodeUtils {
    +    /**
    +     * Fields within the AST that have no explicit visibility are deemed 
to be properties
    +     * and represented by a PropertyNode. The Groovy compiler creates 
accessor methods and
    +     * a backing field for such property nodes. During this process, all 
modifiers
    +     * from the property are carried over to the backing field (so a 
property marked as
    +     * {@code transient} will have a {@code transient} backing field) but 
when creating
    +     * the accessor methods we don't carry over modifier values which 
don't make sense for
    +     * methods (this includes VOLATILE and TRANSIENT) but other modifiers 
are carried over,
    +     * for example {@code static}.
    +     *
    +     * @param propNode the original property node
    +     * @return the modifiers which make sense for an accessor method
    +     */
    +    public static int adjustPropertyModifiersForMethod(PropertyNode 
propNode) {
    +        int propNodeModifiers = propNode.getModifiers();
    +        // GROOVY-3726: clear volatile, transient modifiers so that they 
don't get applied to methods
    +        if ((propNodeModifiers & Modifier.VOLATILE) != 0) {
    +            propNodeModifiers -= Modifier.VOLATILE;
    +        }
    +        if ((propNodeModifiers & Modifier.TRANSIENT) != 0) {
    +            propNodeModifiers -= Modifier.TRANSIENT;
    +        }
    --- End diff --
    
    or: propNodeModifiers = ~(Modifier.TRANSIENT | Modifier.VOLATILE) & 
propNodeModifiers


> Incorrect modifers on setter for volatile property with @Bindable/@Vetoable
> ---------------------------------------------------------------------------
>
>                 Key: GROOVY-7969
>                 URL: https://issues.apache.org/jira/browse/GROOVY-7969
>             Project: Groovy
>          Issue Type: Bug
>            Reporter: Paul King
>
> As part of GROOVY-3726 we fixed getter/setter method modifiers for volatile 
> (or transient) properties. The @Bindable and @Vetoable transforms however 
> generate their own setters and bypass that fix.
> Here is a script to reproduce the problem:
> {code}
> import static java.lang.reflect.Modifier.toString
> import groovy.beans.Bindable
> class Foo {
>   volatile Date now
> }
> @Bindable class Bar {
>   volatile Date then
> }
> void pretty(int mod) { println "${mod.toString().padRight(10)}" + 
> toString(mod) }
> pretty(Foo.getMethod('getNow').modifiers)
> pretty(Foo.getMethod('setNow', Date).modifiers)
> pretty(Bar.getMethod('getThen').modifiers)
> pretty(Bar.getMethod('setThen', Date).modifiers)
> {code}
> which currently produces:
> {noformat}
> 1         public
> 1         public
> 1         public
> 65        public volatile
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to