Make :analysis:analysis-api-fir:generateCode cacheable

* Output for task is added
* Use relative paths
* Dummy check that generation is done to the desired folder is added

KTI-1529
diff --git a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/DiagnosticClassGenerator.kt b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/DiagnosticClassGenerator.kt
index a6567fd..8f81116 100644
--- a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/DiagnosticClassGenerator.kt
+++ b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/DiagnosticClassGenerator.kt
@@ -5,19 +5,22 @@
 
 package org.jetbrains.kotlin.analysis.api.fir.generator
 
-import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.DiagnosticList
-import org.jetbrains.kotlin.fir.checkers.generator.getGenerationPath
 import org.jetbrains.kotlin.analysis.api.fir.generator.rendererrs.FirDiagnosticToKtDiagnosticConverterRenderer
 import org.jetbrains.kotlin.analysis.api.fir.generator.rendererrs.KtDiagnosticClassImplementationRenderer
 import org.jetbrains.kotlin.analysis.api.fir.generator.rendererrs.KtDiagnosticClassRenderer
-import java.nio.file.Path
+import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.DiagnosticList
+import java.io.File
 
 object DiagnosticClassGenerator {
-    fun generate(rootPath: Path, diagnosticList: DiagnosticList, packageName: String) {
-        val path = getGenerationPath(rootPath.toFile(), packageName)
+    fun generate(path: File, diagnosticList: DiagnosticList, packageName: String) {
         KtDiagnosticClassRenderer.render(path.resolve("KtFirDiagnostics.kt"), diagnosticList, packageName, emptySet())
         KtDiagnosticClassImplementationRenderer.render(path.resolve("KtFirDiagnosticsImpl.kt"), diagnosticList, packageName, emptySet())
-        FirDiagnosticToKtDiagnosticConverterRenderer.render(path.resolve("KtFirDataClassConverters.kt"), diagnosticList, packageName, emptySet())
+        FirDiagnosticToKtDiagnosticConverterRenderer.render(
+            path.resolve("KtFirDataClassConverters.kt"),
+            diagnosticList,
+            packageName,
+            emptySet()
+        )
         ArgumentsConverterGenerator.render(path.resolve("KtFirArgumentsConverter.kt"), packageName)
     }
 }
diff --git a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/Main.kt b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/Main.kt
index 96dff94..e469646 100644
--- a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/Main.kt
+++ b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/Main.kt
@@ -12,6 +12,7 @@
 import org.jetbrains.kotlin.fir.builder.SYNTAX_DIAGNOSTIC_LIST
 import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.JS_DIAGNOSTICS_LIST
 import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.WEB_COMMON_DIAGNOSTICS_LIST
+import org.jetbrains.kotlin.fir.checkers.generator.getGenerationPath
 import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil
 import org.jetbrains.kotlin.utils.SmartPrinter
 import java.io.File
@@ -28,11 +29,17 @@
     println()
 }
 
-
-fun main() {
-    val rootPath = Paths.get("analysis/analysis-api-fir/src").toAbsolutePath()
+fun main(args: Array<String>) {
+    val rootPath = Paths.get("analysis/analysis-api-fir/src")
     val packageName = "org.jetbrains.kotlin.analysis.api.fir.diagnostics"
+    val path = getGenerationPath(rootPath.toFile(), packageName)
+
+    val expectedOutputDir = args.getOrNull(0) ?: error("Generator execution should have expected output directory")
+    require(path.path.replace("\\", "/") == expectedOutputDir) {
+        "Generator is going to write to the directory '$path' while an output directory is declared to be '$expectedOutputDir'"
+    }
+
     val diagnostics = DIAGNOSTICS_LIST + JVM_DIAGNOSTICS_LIST + JS_DIAGNOSTICS_LIST + SYNTAX_DIAGNOSTIC_LIST +
             WEB_COMMON_DIAGNOSTICS_LIST
-    generate(rootPath, diagnostics, packageName)
+    generate(path, diagnostics, packageName)
 }
diff --git a/analysis/analysis-api-fir/build.gradle.kts b/analysis/analysis-api-fir/build.gradle.kts
index 3a73c4c..b00510e 100644
--- a/analysis/analysis-api-fir/build.gradle.kts
+++ b/analysis/analysis-api-fir/build.gradle.kts
@@ -90,17 +90,22 @@
 }
 
 val generateCode by tasks.registering(NoDebugJavaExec::class) {
-    val generatorRoot = "$projectDir/analysis/analysis-api-fir/analysis-api-fir-generator/src/"
+    val generatorRoot =
+        layout.projectDirectory.dir("analysis-api-fir-generator/src")
+    val outputDir =
+        layout.projectDirectory.dir("src/org/jetbrains/kotlin/analysis/api/fir/diagnostics")
 
     val generatorConfigurationFiles = fileTree(generatorRoot) {
         include("**/*.kt")
     }
 
     inputs.files(generatorConfigurationFiles)
+    outputs.dirs(outputDir)
 
     workingDir = rootDir
     classpath = generatorClasspath
     mainClass.set("org.jetbrains.kotlin.analysis.api.fir.generator.MainKt")
+    args = listOf(outputDir.asFile.relativeTo(rootDir).path)
     systemProperties["line.separator"] = "\n"
 }