/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed 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.
 */

def findGradleKotlinDsl() {
    /*
     * TODO(137044144): After we convert this file to Kotlin (build.gradle.kts), we can just
     * directly call the getGradleKotlinDsl() method.
     * We're not doing that yet though because Gradle takes more time to process .kts files (at the
     * time of writing, adding a .kts file adds roughly 10 addition seconds to build startup time).
     *
     * getGradleVersion() is in a format of X.Y.Z-rc-1 / X.Y.Z. Kotlin dsl jar always drops the
     * "-rc-1" suffix of the version, thus we need additional substring logic.
     */
    def dashIndex = project.gradle.getGradleVersion().indexOf("-")
    def kotlinDslVersion = dashIndex == -1 ? project.gradle.getGradleVersion()
            : project.gradle.getGradleVersion().substring(0, dashIndex)
    def kotlinDsl = "" + project.gradle.getGradleHomeDir() + "/lib/gradle-kotlin-dsl-" +
                    kotlinDslVersion + ".jar"
    if (!project.file(kotlinDsl).exists()) {
        throw new GradleException("Kotlin dsl jar does not exist: " + kotlinDsl)
    }
    return project.files(kotlinDsl)
}

ext.findGradleKotlinDsl = this.&findGradleKotlinDsl
