Fix GenerateCodegenArtifactsTask calling two generators with Java enabled

Summary:
This diff fixes a bug with `GenerateCodegenArtifactsTask` that was causing
two generators to be called one after the other (first the JS and then the Java one).
Now they're mutually exclusive.

Changelog:
[Internal] [Changed] -  Fix GenerateCodegenArtifactsTask calling two generators with Java enabled

Reviewed By: ShikaSD

Differential Revision: D31169379

fbshipit-source-id: 668d8e440ad6b3f06654f29c5cbc344ef82c4b9c
This commit is contained in:
Nicola Corti
2021-09-24 08:19:17 -07:00
committed by Facebook GitHub Bot
parent 6d367d70f2
commit 5b8da02296
4 changed files with 126 additions and 13 deletions
@@ -30,7 +30,7 @@ import java.util.stream.Collectors;
* generator is isolated to a single schema, and a single Java package output.
*/
public final class JavaGenerator {
public static String LICENSE_HEADER =
public static final String LICENSE_HEADER =
"/*\n"
+ " * Copyright (c) Facebook, Inc. and its affiliates.\n"
+ " *\n"
@@ -76,7 +76,6 @@ class ReactAppPlugin : Plugin<Project> {
"generateCodegenArtifactsFromSchema", GenerateCodegenArtifactsTask::class.java) {
it.dependsOn(generateCodegenSchemaTask)
it.reactRoot.set(extension.reactRoot)
it.jsRootDir.set(extension.jsRootDir)
it.nodeExecutableAndArgs.set(extension.nodeExecutableAndArgs)
it.codegenDir.set(extension.codegenDir)
it.useJavaGenerator.set(extension.useJavaGenerator)
@@ -22,8 +22,6 @@ abstract class GenerateCodegenArtifactsTask : Exec() {
@get:Internal abstract val reactRoot: DirectoryProperty
@get:Internal abstract val jsRootDir: DirectoryProperty
@get:Internal abstract val codegenDir: DirectoryProperty
@get:Internal abstract val generatedSrcDir: DirectoryProperty
@@ -48,17 +46,11 @@ abstract class GenerateCodegenArtifactsTask : Exec() {
@get:OutputDirectory val generatedJniFiles: Provider<Directory> = generatedSrcDir.dir("jni")
override fun exec() {
commandLine(
windowsAwareYarn(
*nodeExecutableAndArgs.get().toTypedArray(),
reactRoot.file("scripts/generate-specs-cli.js").get().asFile.absolutePath,
"android",
generatedSchemaFile.get().asFile.absolutePath,
generatedSrcDir.get().asFile.absolutePath,
libraryName.get(),
codegenJavaPackageName.get()))
setupCommandLine()
super.exec()
}
internal fun setupCommandLine() {
if (useJavaGenerator.getOrElse(false)) {
// Use Java-based generator implementation to produce the source files,
// instead of using the JS-based generator.
@@ -71,6 +63,17 @@ abstract class GenerateCodegenArtifactsTask : Exec() {
} catch (e: Exception) {
throw GradleException("Failed to generate Java from schema.", e)
}
commandLine("echo", "Used JavaGenerator to generate files instead of generate-specs-cli.js")
} else {
commandLine(
windowsAwareYarn(
*nodeExecutableAndArgs.get().toTypedArray(),
reactRoot.file("scripts/generate-specs-cli.js").get().asFile.absolutePath,
"android",
generatedSchemaFile.get().asFile.absolutePath,
generatedSrcDir.get().asFile.absolutePath,
libraryName.get(),
codegenJavaPackageName.get()))
}
}
}
@@ -0,0 +1,111 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.tasks
import com.facebook.react.tests.OS
import com.facebook.react.tests.OsRule
import com.facebook.react.tests.WithOs
import com.facebook.react.tests.createTestTask
import java.io.File
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
class GenerateCodegenArtifactsTaskTest {
@get:Rule val tempFolder = TemporaryFolder()
@get:Rule val osRule = OsRule()
@Test
fun generateCodegenSchema_inputFiles_areSetCorrectly() {
val codegenDir = tempFolder.newFolder("codegen")
val outputDir = tempFolder.newFolder("output")
val task =
createTestTask<GenerateCodegenArtifactsTask> {
it.codegenDir.set(codegenDir)
it.generatedSrcDir.set(outputDir)
}
assertEquals(
File(codegenDir, "lib/cli/combine/combine-js-to-schema-cli.js"),
task.combineJsToSchemaCli.get().asFile)
assertEquals(File(outputDir, "schema.json"), task.generatedSchemaFile.get().asFile)
}
@Test
fun generateCodegenSchema_outputFile_isSetCorrectly() {
val codegenDir = tempFolder.newFolder("codegen")
val outputDir = tempFolder.newFolder("output")
val task =
createTestTask<GenerateCodegenArtifactsTask> {
it.codegenDir.set(codegenDir)
it.generatedSrcDir.set(outputDir)
}
assertEquals(File(outputDir, "java"), task.generatedJavaFiles.get().asFile)
assertEquals(File(outputDir, "jni"), task.generatedJniFiles.get().asFile)
}
@Test
fun generateCodegenSchema_simpleProperties_areInsideInput() {
val task =
createTestTask<GenerateCodegenArtifactsTask> {
it.nodeExecutableAndArgs.set(listOf("npm", "help"))
it.useJavaGenerator.set(true)
it.codegenJavaPackageName.set("com.example.test")
it.libraryName.set("example-test")
}
assertEquals(listOf("npm", "help"), task.nodeExecutableAndArgs.get())
assertEquals(true, task.useJavaGenerator.get())
assertEquals("com.example.test", task.codegenJavaPackageName.get())
assertEquals("example-test", task.libraryName.get())
assertTrue(task.inputs.properties.containsKey("nodeExecutableAndArgs"))
assertTrue(task.inputs.properties.containsKey("useJavaGenerator"))
assertTrue(task.inputs.properties.containsKey("codegenJavaPackageName"))
assertTrue(task.inputs.properties.containsKey("libraryName"))
}
@Test
@WithOs(OS.UNIX)
fun setupCommandLine_withoutJavaGenerator_willSetupCorrectly() {
val reactRoot = tempFolder.newFolder("node_modules/react-native/")
val codegenDir = tempFolder.newFolder("codegen")
val outputDir = tempFolder.newFolder("output")
val task =
createTestTask<GenerateCodegenArtifactsTask> {
it.reactRoot.set(reactRoot)
it.codegenDir.set(codegenDir)
it.generatedSrcDir.set(outputDir)
it.nodeExecutableAndArgs.set(listOf("--verbose"))
it.codegenJavaPackageName.set("com.example.test")
it.libraryName.set("example-test")
}
task.setupCommandLine()
assertEquals(
listOf(
"yarn",
"--verbose",
File(reactRoot, "scripts/generate-specs-cli.js").toString(),
"android",
File(outputDir, "schema.json").toString(),
outputDir.toString(),
"example-test",
"com.example.test",
),
task.commandLine.toMutableList())
}
}