@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.ideaExt

import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.plugins.ExtensionAware
import org.gradle.kotlin.dsl.configure
import org.gradle.plugins.ide.idea.model.IdeaProject
import org.jetbrains.gradle.ext.*

/*
 * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
 * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
 */

fun org.gradle.api.Project.idea(configure: org.gradle.plugins.ide.idea.model.IdeaModel.() -> Unit): Unit =
    (this as org.gradle.api.plugins.ExtensionAware).extensions.configure("idea", configure)

fun IdeaProject.settings(block: ProjectSettings.() -> Unit) =
    (this@settings as ExtensionAware).extensions.configure(block)

fun ProjectSettings.compiler(block: IdeaCompilerConfiguration.() -> Unit) =
    (this@compiler as ExtensionAware).extensions.configure(block)

fun ProjectSettings.delegateActions(block: ActionDelegationConfig.() -> Unit) =
    (this@delegateActions as ExtensionAware).extensions.configure(block)

fun ProjectSettings.runConfigurations(block: DefaultRunConfigurationContainer.() -> Unit) =
    (this@runConfigurations as ExtensionAware).extensions.configure("runConfigurations", block)

inline fun <reified T: RunConfiguration> DefaultRunConfigurationContainer.defaults(noinline block: T.() -> Unit) =
    defaults(T::class.java, block)

fun DefaultRunConfigurationContainer.junit(name: String, block: JUnit.() -> Unit) =
    create(name, JUnit::class.java, block)

fun DefaultRunConfigurationContainer.application(name: String, block: Application.() -> Unit) =
    create(name, Application::class.java, block)

fun ProjectSettings.ideArtifacts(block: NamedDomainObjectContainer<org.jetbrains.gradle.ext.TopLevelArtifact>.() -> Unit) =
    (this@ideArtifacts as ExtensionAware).extensions.configure("ideArtifacts", block)
