mirror of
https://github.com/react/react-native.git
synced 2026-10-03 18:31:57 +08:00
Summary: The logic in NativeModuleRegistryBuilder.processPackage was getting pretty complex with lot of branches. Moved the logic to get actual packages into each of the packages, instead of having it in NativeModuleRegistryBuilder. Reviewed By: achen1 Differential Revision: D9618140 fbshipit-source-id: 4be82ec65b0bd92f11f8b77044004e10c9d3b1a1
63 lines
2.4 KiB
Java
63 lines
2.4 KiB
Java
// Copyright (c) 2004-present, Facebook, Inc.
|
|
|
|
// 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;
|
|
|
|
import com.facebook.react.bridge.ModuleHolder;
|
|
import com.facebook.react.bridge.NativeModuleRegistry;
|
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
/** Helper class to build NativeModuleRegistry. */
|
|
public class NativeModuleRegistryBuilder {
|
|
|
|
private final ReactApplicationContext mReactApplicationContext;
|
|
private final ReactInstanceManager mReactInstanceManager;
|
|
|
|
private final Map<String, ModuleHolder> mModules = new HashMap<>();
|
|
|
|
public NativeModuleRegistryBuilder(
|
|
ReactApplicationContext reactApplicationContext, ReactInstanceManager reactInstanceManager) {
|
|
mReactApplicationContext = reactApplicationContext;
|
|
mReactInstanceManager = reactInstanceManager;
|
|
}
|
|
|
|
public void processPackage(ReactPackage reactPackage) {
|
|
// We use an iterable instead of an iterator here to ensure thread safety, and that this list
|
|
// cannot be modified
|
|
Iterable<ModuleHolder> moduleHolders;
|
|
if (reactPackage instanceof LazyReactPackage) {
|
|
moduleHolders =
|
|
((LazyReactPackage) reactPackage).getNativeModuleIterator(mReactApplicationContext);
|
|
} else {
|
|
moduleHolders =
|
|
ReactPackageHelper.getNativeModuleIterator(
|
|
reactPackage, mReactApplicationContext, mReactInstanceManager);
|
|
}
|
|
|
|
for (ModuleHolder moduleHolder : moduleHolders) {
|
|
String name = moduleHolder.getName();
|
|
if (mModules.containsKey(name)) {
|
|
ModuleHolder existingNativeModule = mModules.get(name);
|
|
if (!moduleHolder.getCanOverrideExistingModule()) {
|
|
throw new IllegalStateException(
|
|
"Native module "
|
|
+ name
|
|
+ " tried to override "
|
|
+ existingNativeModule.getClassName()
|
|
+ " for module name .Check the getPackages() method in MainApplication.java, it might be that module is being created twice. If this was your intention, set canOverrideExistingModule=true");
|
|
}
|
|
mModules.remove(existingNativeModule);
|
|
}
|
|
mModules.put(name, moduleHolder);
|
|
}
|
|
}
|
|
|
|
public NativeModuleRegistry build() {
|
|
return new NativeModuleRegistry(mReactApplicationContext, mModules);
|
|
}
|
|
}
|