From 4ba466c515e62e5db549d0e212398011b6695239 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Fri, 13 Dec 2019 12:13:56 -0800 Subject: [PATCH] Make DebugCorePackage a TurboReactPackage Summary: The NativeModules in DebugCorePackage are now TurboModule-compatible. Therefore, we must make this extend `TurboReactPackage`. Changelog: [Internal] - Make DebugCorePackage a TurboReactPackage Reviewed By: fkgozali Differential Revision: D18974084 fbshipit-source-id: 648b54fefe7f8952666d5a23a9d81cc6bb167b31 --- .../com/facebook/react/DebugCorePackage.java | 75 ++++++++++++++----- .../react/devsupport/JSCHeapCapture.java | 4 +- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/DebugCorePackage.java b/ReactAndroid/src/main/java/com/facebook/react/DebugCorePackage.java index 40932960b74..e9599bacc5a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/DebugCorePackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/DebugCorePackage.java @@ -7,16 +7,17 @@ package com.facebook.react; -import com.facebook.react.bridge.ModuleSpec; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.devsupport.JSCHeapCapture; import com.facebook.react.devsupport.JSDevSupport; +import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.module.annotations.ReactModuleList; +import com.facebook.react.module.model.ReactModuleInfo; import com.facebook.react.module.model.ReactModuleInfoProvider; -import java.util.ArrayList; -import java.util.List; -import javax.inject.Provider; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.HashMap; +import java.util.Map; /** * Package defining core framework modules (e.g. UIManager). It should be used for modules that @@ -28,27 +29,63 @@ import javax.inject.Provider; JSCHeapCapture.class, JSDevSupport.class, }) -/* package */ class DebugCorePackage extends LazyReactPackage { - +public class DebugCorePackage extends TurboReactPackage { DebugCorePackage() {} @Override - public List getNativeModules(final ReactApplicationContext reactContext) { - List moduleSpecList = new ArrayList<>(); - moduleSpecList.add( - ModuleSpec.nativeModuleSpec( - JSCHeapCapture.class, - new Provider() { - @Override - public NativeModule get() { - return new JSCHeapCapture(reactContext); - } - })); - return moduleSpecList; + public NativeModule getModule(String name, ReactApplicationContext reactContext) { + switch (name) { + case JSCHeapCapture.TAG: + return new JSCHeapCapture(reactContext); + case JSDevSupport.MODULE_NAME: + return new JSDevSupport(reactContext); + default: + throw new IllegalArgumentException( + "In CoreModulesPackage, could not find Native module for " + name); + } } @Override public ReactModuleInfoProvider getReactModuleInfoProvider() { - return LazyReactPackage.getReactModuleInfoProviderViaReflection(this); + try { + Class reactModuleInfoProviderClass = + Class.forName("com.facebook.react.DebugCorePackage$$ReactModuleInfoProvider"); + return (ReactModuleInfoProvider) reactModuleInfoProviderClass.newInstance(); + } catch (ClassNotFoundException e) { + // In OSS case, the annotation processor does not run. We fall back on creating this by hand + Class[] moduleList = + new Class[] { + JSCHeapCapture.class, JSDevSupport.class, + }; + + final Map reactModuleInfoMap = new HashMap<>(); + for (Class moduleClass : moduleList) { + ReactModule reactModule = moduleClass.getAnnotation(ReactModule.class); + + reactModuleInfoMap.put( + reactModule.name(), + new ReactModuleInfo( + reactModule.name(), + moduleClass.getName(), + reactModule.canOverrideExistingModule(), + reactModule.needsEagerInit(), + reactModule.hasConstants(), + reactModule.isCxxModule(), + TurboModule.class.isAssignableFrom(moduleClass))); + } + + return new ReactModuleInfoProvider() { + @Override + public Map getReactModuleInfos() { + return reactModuleInfoMap; + } + }; + } catch (InstantiationException e) { + throw new RuntimeException( + "No ReactModuleInfoProvider for DebugCorePackage$$ReactModuleInfoProvider", e); + } catch (IllegalAccessException e) { + throw new RuntimeException( + "No ReactModuleInfoProvider for DebugCorePackage$$ReactModuleInfoProvider", e); + } } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSCHeapCapture.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSCHeapCapture.java index 030d7833bc3..142c961ade4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSCHeapCapture.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSCHeapCapture.java @@ -17,9 +17,9 @@ import java.io.File; // This module is being called only by Java via the static method "captureHeap" that // requires it to already be initialized, thus we eagerly initialize this module -@ReactModule(name = "JSCHeapCapture", needsEagerInit = true) +@ReactModule(name = JSCHeapCapture.TAG, needsEagerInit = true) public class JSCHeapCapture extends ReactContextBaseJavaModule { - public static final String TAG = JSCHeapCapture.class.getSimpleName(); + public static final String TAG = "JSCHeapCapture"; public interface HeapCapture extends JavaScriptModule { void captureHeap(String path);