[ 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)