/*
 *  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.
 */

/*
 * The groovy project uses Gradle for building, and Gradle itself
 * depends on a specific Groovy configuration to build Groovy projects.
 *
 * In this build, we first build a "bootstrap compiler", which provides
 * a minimal Groovy runtime.
 *
 * But because Groovy also repackages some internal libraries, we use
 * internally different jars for compiling Groovy with the bootstrapped
 * Groovy than what is published externally.
 */

def internalPublication = Attribute.of("org.apache.groovy.internal", Boolean)

def makeInternal = { Configuration cnf ->
    cnf.attributes {
        it.attribute(internalPublication, true)
    }
}

configurations {
    pluginManager.withPlugin('java-library') {
        makeInternal(apiElements)
    }
    makeInternal(runtimeElements)
    makeInternal(compileClasspath)
    makeInternal(runtimeClasspath)
    makeInternal(testCompileClasspath)
    makeInternal(testRuntimeClasspath)
    pluginManager.withPlugin('java-test-fixtures') {
        makeInternal(testFixturesCompileClasspath)
        makeInternal(testFixturesRuntimeClasspath)
    }
    groovyCompilerClasspath {
        canBeConsumed = false
        canBeResolved = true
        attributes {
            attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY))
            attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, LibraryElements.JAR))
            attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL))
            attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME))
            attribute(internalPublication, true)
        }
    }
}

dependencies {
    if (project != rootProject) {
        groovyCompilerClasspath project(":")
    }
}

tasks.withType(AbstractCompile).configureEach {
    options.encoding = 'UTF-8'
//    options.compilerArgs << '-Xlint:unchecked'
//    options.compilerArgs << '-Xlint:deprecation'
//    options.compilerArgs << '-Xlint:-options'
}

tasks.withType(GroovyCompile).configureEach {
    groovyOptions.fork = true
    groovyOptions.forkOptions.jvmArgs += ["-Dgroovy.antlr4.cache.threshold=0", "-Dgroovy.target.bytecode=${sharedConfiguration.groovyTargetBytecodeVersion.get()}" as String]
    groovyOptions.forkOptions.memoryMaximumSize = sharedConfiguration.groovycMaxMemory.get()
    groovyClasspath = configurations.groovyCompilerClasspath

    // See also https://docs.gradle.org/current/userguide/groovy_plugin.html#sec:incremental_groovy_compilation
    options.incremental = true
    options.incrementalAfterFailure = true
}
