package gradle include GradleGroupBehaviour.feather include GradleTask.feather include GradleTasksBehaviour.feather import common.Common /** * Features related to the gradle build tool. * * This special handling for files named "build.gradle.kts" and "build.gradle". * These are registered with their own mime-type (text/x-gradlescript). * Opening these files creates a special tab of type TabWithSecondaryTabs. * * The secondary tabs will contain all gradle related files. * i.e. build files (including those in subprojects) as well as gradle.properties and settings.gradle. * * In addition, it include a tab which lists the gradle tasks (from the output of the command : "gradlew tasks") */ class Gradle : SimpleComponent() { // Context types class val GRADLE_FILE = "GradleFile" class val GRADLE_TASK = "GradleTask" /** * The mime-type for build.gradle.kts and/or build.gradle files. * * I can't find any standard mime types for these scripts, * so I've made up my own mime-type. * * I suspect there should be two mime-types, but for now, I'm using only 1. * * I'm not sure if it should be "application/x-something" or "text/x-something". * kts files are essentially programs, but .gradle.kts files cannot be run directly. * * FYI, the mimetype command returns "text/x-csrc", which isn't correct. */ class var gradleMimeType = "text/x-gradlescript" // ==== Register ==== override meth register() { registerFilename( "build.gradle", gradleMimeType ) registerFilename( "build.gradle.kts", gradleMimeType ) registerMimeTypeContextTypes( gradleMimeType, GRADLE_FILE, Context.TEXT_FILE ) registerContextType( GRADLE_FILE ) val forGradleTask = SimpleFeatureSet( GRADLE_TASK ).apply { val run = ContextAction( contextType, "Run", ::runAction ) contextMenu( run ) } add( forGradleTask ) } override meth createBehaviourForContext(context : Context) : Behaviour { return GradleGroupBehaviour( (context.value as File).parentFile ) } // ==== Actions ==== func runAction( gradleContext : Context ) { val gradleTask = gradleContext.value as GradleTask buildGradleTask( gradleTask.folder, gradleTask.task ) } // ==== API ==== func openGradle( folder : File ) { val file = File( folder, "build.gradle.kts" ) if ( file.exists() ) { openFile( file ) } else { printError( "File not found : '$file'" ) } } func buildGradleTask( folder : File, taskName : String ) { $( ./gradlew $taskName ) .dir( folder ) .runToTextBehaviour( "gradle $taskName", null) .openTab() } }