stdlib: generate stdlib.manifest

This commit is contained in:
2023-09-10 20:47:50 -04:00
parent e8c984f2dc
commit 033da5b2ea
9 changed files with 87 additions and 14 deletions

View File

@ -33,5 +33,13 @@ gradlePlugin {
displayName = "Pork Module"
description = "Module convention for pork"
}
create("pork_stdlib") {
id = "gay.pizza.pork.stdlib"
implementationClass = "gay.pizza.pork.buildext.PorkStdlibPlugin"
displayName = "Pork Stdlib"
description = "Stdlib generation code for pork"
}
}
}

View File

@ -15,10 +15,6 @@ import kotlin.io.path.deleteIfExists
import kotlin.io.path.writeText
open class GenerateAstCode : DefaultTask() {
init {
outputs.upToDateWhen { false }
}
@get:InputFile
var astDescriptionFile: File = project.file("src/main/ast/pork.yml")

View File

@ -0,0 +1,34 @@
package gay.pizza.pork.buildext
import org.gradle.api.DefaultTask
import org.gradle.api.file.RegularFile
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import java.io.File
import kotlin.io.path.deleteIfExists
import kotlin.io.path.writeText
open class GenerateStdlibManifest : DefaultTask() {
@get:InputDirectory
val porkStdlibCode: File = project.file("src/main/pork")
@get:OutputFile
val stdlibManifestFile: Provider<RegularFile> =
project.layout.buildDirectory.file("generated/pork/stdlib.manifest")
@TaskAction
fun generate() {
val files = porkStdlibCode.walkTopDown().mapNotNull { file ->
if (!file.isFile || !file.name.endsWith(".pork")) {
null
} else {
file.relativeTo(porkStdlibCode).path
}
}
val manifestFilePath = stdlibManifestFile.get().asFile.toPath()
manifestFilePath.deleteIfExists()
manifestFilePath.writeText(files.joinToString("\n") + "\n")
}
}

View File

@ -2,9 +2,15 @@ package gay.pizza.pork.buildext
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.create
class PorkAstPlugin : Plugin<Project> {
override fun apply(target: Project) {
target.tasks.create("generateAstCode", GenerateAstCode::class.java)
val generateAstCode = createGenerateAstCode(target)
val processResources = target.tasks.getByName("processResources")
processResources.dependsOn(generateAstCode)
}
private fun createGenerateAstCode(project: Project): GenerateAstCode =
project.tasks.create("generateAstCode", GenerateAstCode::class)
}

View File

@ -0,0 +1,16 @@
package gay.pizza.pork.buildext
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.create
class PorkStdlibPlugin : Plugin<Project> {
override fun apply(target: Project) {
val generateStdlibManifest = createGenerateStdlibManifest(target)
val processResources = target.tasks.getByName("processResources")
processResources.dependsOn(generateStdlibManifest)
}
private fun createGenerateStdlibManifest(project: Project): GenerateStdlibManifest =
project.tasks.create("generateStdlibManifest", GenerateStdlibManifest::class)
}