/*
 *  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.
 */
dependencies {
    api rootProject  // FileNameFinder implements IFileNameFinder...
    api("org.apache.ant:ant:$antVersion") {  // AntBuilder has Project constructor...
        transitive = false
    }
    implementation("org.apache.ant:ant-junit:$antVersion") {
        exclude(group: 'junit', module: 'junit')
    }
    implementation "org.apache.ant:ant-launcher:$antVersion"
    implementation "org.apache.ant:ant-antlr:$antVersion"
    // for groovydoc ant command
    implementation project(':groovy-groovydoc'), {
        transitive = false
    }
    compileOnly "org.ow2.asm:asm-tree:$asmVersion" // VerifyClass
    compileOnly "org.ow2.asm:asm-util:$asmVersion" // VerifyClass
    testImplementation project(':groovy-test')
    testImplementation project(':groovy-xml')
}

apply from: "${rootProject.projectDir}/gradle/jacoco/jacocofix.gradle"