Skip to content

Commit 648b4d5

Browse files
committed
Adding Discord-only TurboModule support
1 parent d356824 commit 648b4d5

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,15 @@ add_library(
125125
\${react_codegen_SRCS}
126126
)
127127
128-
target_include_directories(react_codegen_${libraryName} PUBLIC . react/renderer/components/${libraryName})
128+
# ADDED STUFF FOR DISCORD THINGS (See GenerateModuleJniH.js in the react-native repo)
129+
130+
if(DEFINED PREBUILT_CMAKE)
131+
include(\${PREBUILT_CMAKE})
132+
endif()
133+
134+
target_include_directories(react_codegen_RTNTurboModuleTest PUBLIC . react/renderer/components/${libraryName} \${EXTRA_INCLUDE_DIRECTORIES})
135+
136+
# END ADDED STUFF FOR DISCORD THINGS
129137
130138
target_link_libraries(
131139
react_codegen_${libraryName}

packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.android.build.gradle.AppExtension
1111
import com.android.build.gradle.BaseExtension
1212
import com.android.build.gradle.LibraryExtension
1313
import com.android.build.gradle.internal.tasks.factory.dependsOn
14+
import com.facebook.react.model.ModelPackageJson
1415
import com.facebook.react.tasks.BuildCodegenCLITask
1516
import com.facebook.react.tasks.GenerateCodegenArtifactsTask
1617
import com.facebook.react.tasks.GenerateCodegenSchemaTask
@@ -103,6 +104,8 @@ class ReactPlugin : Plugin<Project> {
103104
} else {
104105
it.jsRootDir.set(extension.jsRootDir)
105106
}
107+
108+
it.onlyIf { project.needsCodegenFromPackageJson(parsedPackageJson) }
106109
}
107110

108111
// We create the task to generate Java code from schema.
@@ -118,6 +121,14 @@ class ReactPlugin : Plugin<Project> {
118121
it.packageJsonFile.set(findPackageJsonFile(project, extension))
119122
it.codegenJavaPackageName.set(extension.codegenJavaPackageName)
120123
it.libraryName.set(extension.libraryName)
124+
125+
// We're reading the package.json at configuration time to properly feed
126+
// the `jsRootDir` @Input property of this task. Therefore, the
127+
// parsePackageJson should be invoked inside this lambda.
128+
val packageJson = findPackageJsonFile(project, extension)
129+
val parsedPackageJson = packageJson?.let { JsonUtils.fromCodegenJson(it) }
130+
131+
it.onlyIf { project.needsCodegenFromPackageJson(parsedPackageJson) }
121132
}
122133

123134
// We add dependencies & generated sources to the project.
@@ -142,4 +153,28 @@ class ReactPlugin : Plugin<Project> {
142153
android.sourceSets.getByName("main").java.srcDir(File(generatedSrcDir, "java"))
143154
}
144155
}
156+
157+
internal fun Project.needsCodegenFromPackageJson(model: ModelPackageJson?): Boolean {
158+
/**
159+
This flag allows us to codegen TurboModule bindings for only Discord modules. We need this differentiation because
160+
React Native tooling only allows us to run TurboModule codegen if newArchEnabled=true, but the newArchEnabled flag
161+
assumes a complete migration to the New Architecture. Third party libraries make codegen assumptions that
162+
then break the build if we codegen, then build with newArchEnabled=false (things like codegen-ing TurboModule
163+
classes that then share the same name as legacy module classes used when newArchEnabled=false).
164+
165+
The goal of this is to get us in a state where we can consume both TurboModules and legacy modules without having
166+
to fully migrate to the new architecture.
167+
*/
168+
var discordApproved = true
169+
if (project.hasProperty("onlyDiscordTurboModulesEnabled")) {
170+
discordApproved = model?.codegenConfig?.android?.javaPackageName?.startsWith("com.discord") == true
171+
}
172+
173+
// Adding a log to see what packages are getting codegen'd
174+
val willCodegen = discordApproved && model?.codegenConfig != null
175+
if (willCodegen) {
176+
println("Running codegen for package ${model?.codegenConfig?.android?.javaPackageName?.toString()}")
177+
}
178+
return willCodegen
179+
}
145180
}

0 commit comments

Comments
 (0)