/*
 *  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 groovy.transform.stc

import groovy.test.GroovyTestCase

class Groovy7888Bug extends GroovyTestCase {
    void testCompoundAssignmentUsesCorrectType() {
        assertScript '''
            class ContainsSet {
                private Set<File> files = new HashSet<File>()
                Set<File> getFiles() { files }
                void setFiles(Set<File> files) { this.files = files }
            }

            @groovy.transform.TypeChecked
            def modifyIdeaModel(ContainsSet set, File foo) {
                set.files += foo
            }

            def cs = new ContainsSet()
            modifyIdeaModel(cs, new File('foo'))
            assert cs.files.size() == 1
        '''
    }
}
