Add ReactPackage support to TurboModule system

Summary:
Make the TurboModule system understand ReactPackages.

**Note:** The TurboModule system can only create TurboModules in LazyReactPackages.

Changelog: [Internal]

Reviewed By: christophpurrer

Differential Revision: D43255701

fbshipit-source-id: 74d034732d0a6fb32197b15bb54cac9161abc294
This commit is contained in:
Ramanpreet Nara
2023-03-11 16:59:39 -08:00
committed by Facebook GitHub Bot
parent 1c5ba299b3
commit a09a6d4d44
@@ -15,6 +15,7 @@ import com.facebook.react.bridge.ModuleSpec;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.config.ReactFeatureFlags;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.module.model.ReactModuleInfo;
import com.facebook.react.turbomodule.core.TurboModuleManagerDelegate;
import com.facebook.react.turbomodule.core.interfaces.TurboModule;
@@ -77,6 +78,55 @@ public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModule
moduleProvider, lazyPkg.getReactModuleInfoProvider().getReactModuleInfos());
continue;
}
if (shouldSupportLegacyPackages()) {
// TODO(T145105887): Output warnings that ReactPackage was used
final List<NativeModule> nativeModules =
reactPackage.createNativeModules(reactApplicationContext);
final Map<String, NativeModule> moduleMap = new HashMap<>();
final Map<String, ReactModuleInfo> reactModuleInfoMap = new HashMap<>();
for (final NativeModule module : nativeModules) {
final Class<? extends NativeModule> moduleClass = module.getClass();
final @Nullable ReactModule reactModule = moduleClass.getAnnotation(ReactModule.class);
final String moduleName = reactModule != null ? reactModule.name() : module.getName();
final ReactModuleInfo moduleInfo =
reactModule != null
? new ReactModuleInfo(
moduleName,
moduleClass.getName(),
reactModule.canOverrideExistingModule(),
true,
reactModule.hasConstants(),
reactModule.isCxxModule(),
TurboModule.class.isAssignableFrom(moduleClass))
: new ReactModuleInfo(
moduleName,
moduleClass.getName(),
module.canOverrideExistingModule(),
true,
true,
CxxModuleWrapper.class.isAssignableFrom(moduleClass),
TurboModule.class.isAssignableFrom(moduleClass));
reactModuleInfoMap.put(moduleName, moduleInfo);
moduleMap.put(moduleName, module);
}
final ModuleProvider moduleProvider =
new ModuleProvider() {
public NativeModule getModule(String moduleName) {
return moduleMap.get(moduleName);
}
};
mModuleProviders.add(moduleProvider);
mPackageModuleInfos.put(moduleProvider, reactModuleInfoMap);
}
}
}