Skip to content

Commit 0d23e42

Browse files
vonovakmacdoum1
authored andcommitted
improve NativeModuleRegistryBuilder.java (facebook#16402)
Summary: I met the error `Native module xyz tried to override xyz for module name xyzModuleName. If this was your intention...` after something went wrong during `react-native link` - one module somehow ended up being included twice in the `getPackages` method, as in: ```java Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new WowPackage(), new WowPackage(), ``` Since I have > 20 native modules it took me a little while to find out what the problem was. The improved error message should make the problem clearer to anybody who may encounter it. I did try to refactor the code a little more, by extracting the whole part of: ```java String name = moduleHolder.getName(); if (namesToType.containsKey(name)) { Class<? extends NativeModule> existingNativeModule = namesToType.get(name); if (!moduleHolder.getCanOverrideExistingModule()) { throw new IllegalStateException(getModuleOverridingExceptionMessage( type.getSimpleName(), existingNativeModule.getSimpleName(), name )); } mModules.remove(existingNativeModule); } namesToType.put(name, type); mModules.put(type, moduleHolder); ``` out into a separate method since there were two places where nearly identical code was written. I have built RN from source and used it in a very simple app with RN vector icons (the package creates a native module as can be seen [here](https://github.com/oblador/react-native-vector-icons/blob/master/android/src/main/java/com/oblador/vectoricons/VectorIconsPackage.java#L19)). After including the module twice, ie. ```java Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new VectorIconsPackage(), new VectorIconsPackage() ); } ``` I get the improved error description, as seen in the screenshot. <img src="https://user-images.githubusercontent.com/1566403/36340960-3289d9d0-13e7-11e8-8d17-e1651da17841.png" height="500"> [ANDROID] [MINOR] [NativeModuleRegistryBuilder] - Improve error message and refactor putting native modules to module maps Closes facebook#16402 Differential Revision: D8421392 Pulled By: hramos fbshipit-source-id: 719bd37b4681933d35858621b402ae73dd460a5b
1 parent 1a5cbe3 commit 0d23e42

File tree

1 file changed

+15
-21
lines changed

1 file changed

+15
-21
lines changed

ReactAndroid/src/main/java/com/facebook/react/NativeModuleRegistryBuilder.java

+15-21
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,7 @@ public void processPackage(ReactPackage reactPackage) {
8080
}
8181

8282
String name = moduleHolder.getName();
83-
if (namesToType.containsKey(name)) {
84-
Class<? extends NativeModule> existingNativeModule = namesToType.get(name);
85-
if (!moduleHolder.getCanOverrideExistingModule()) {
86-
throw new IllegalStateException("Native module " + type.getSimpleName() +
87-
" tried to override " + existingNativeModule.getSimpleName() + " for module name " +
88-
name + ". If this was your intention, set canOverrideExistingModule=true");
89-
}
90-
91-
mModules.remove(existingNativeModule);
92-
}
93-
94-
namesToType.put(name, type);
95-
mModules.put(type, moduleHolder);
83+
putModuleTypeAndHolderToModuleMaps(type, name, moduleHolder);
9684
}
9785
} else {
9886
FLog.d(
@@ -117,19 +105,25 @@ public void processPackage(ReactPackage reactPackage) {
117105
public void addNativeModule(NativeModule nativeModule) {
118106
String name = nativeModule.getName();
119107
Class<? extends NativeModule> type = nativeModule.getClass();
120-
if (namesToType.containsKey(name)) {
121-
Class<? extends NativeModule> existingModule = namesToType.get(name);
122-
if (!nativeModule.canOverrideExistingModule()) {
108+
putModuleTypeAndHolderToModuleMaps(type, name, new ModuleHolder(nativeModule));
109+
}
110+
111+
private void putModuleTypeAndHolderToModuleMaps(Class<? extends NativeModule> type, String underName,
112+
ModuleHolder moduleHolder) throws IllegalStateException {
113+
if (namesToType.containsKey(underName)) {
114+
Class<? extends NativeModule> existingNativeModule = namesToType.get(underName);
115+
if (!moduleHolder.getCanOverrideExistingModule()) {
123116
throw new IllegalStateException("Native module " + type.getSimpleName() +
124-
" tried to override " + existingModule.getSimpleName() + " for module name " +
125-
name + ". If this was your intention, set canOverrideExistingModule=true");
117+
" tried to override " + existingNativeModule.getSimpleName() + " for module name " +
118+
underName + ". Check the getPackages() method in MainApplication.java, it might be " +
119+
"that module is being created twice. " +
120+
"If this was your intention, set canOverrideExistingModule=true");
126121
}
127122

128-
mModules.remove(existingModule);
123+
mModules.remove(existingNativeModule);
129124
}
130125

131-
namesToType.put(name, type);
132-
ModuleHolder moduleHolder = new ModuleHolder(nativeModule);
126+
namesToType.put(underName, type);
133127
mModules.put(type, moduleHolder);
134128
}
135129

0 commit comments

Comments
 (0)