From 774502510b26632a0604e0694798f456aa4482d1 Mon Sep 17 00:00:00 2001 From: Emily Janzer Date: Mon, 30 Sep 2019 18:01:01 -0700 Subject: [PATCH] Convert SourceCode module to TurboModule Summary: Converting the SourceCode native module to TurboModules. Checking in the Java class generated from the JS spec and extending it in the module implementation. Reviewed By: fkgozali Differential Revision: D17586276 fbshipit-source-id: 3d2080f1280791e81a0366d0aab101d960d11157 --- .../com/facebook/react/modules/debug/BUCK | 1 + .../modules/debug/NativeSourceCodeSpec.java | 50 +++++++++++++++++++ .../react/modules/debug/SourceCodeModule.java | 16 +++--- 3 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/modules/debug/NativeSourceCodeSpec.java diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/BUCK b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/BUCK index a4fc63b6ad7..5cb908d98c1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/BUCK @@ -18,6 +18,7 @@ rn_android_library( react_native_target("java/com/facebook/react/module/annotations:annotations"), react_native_target("java/com/facebook/react/modules/core:core"), react_native_target("java/com/facebook/react/modules/debug:interfaces"), + react_native_target("java/com/facebook/react/turbomodule/core/interfaces:interfaces"), react_native_target("java/com/facebook/react/uimanager:uimanager"), ], ) diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/NativeSourceCodeSpec.java b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/NativeSourceCodeSpec.java new file mode 100644 index 00000000000..8a24a50bda7 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/NativeSourceCodeSpec.java @@ -0,0 +1,50 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + *

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.modules.debug; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactModuleWithSpec; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nullable; + +public abstract class NativeSourceCodeSpec extends ReactContextBaseJavaModule + implements ReactModuleWithSpec, TurboModule { + public NativeSourceCodeSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + protected abstract Map getTypedExportedConstants(); + + @Override + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList("scriptURL")); + Set optionalFlowConstants = new HashSet<>(); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException( + String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException( + String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/SourceCodeModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/SourceCodeModule.java index d3ac8526999..f1cdf316b6d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/SourceCodeModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/SourceCodeModule.java @@ -6,10 +6,8 @@ */ package com.facebook.react.modules.debug; -import androidx.annotation.Nullable; import com.facebook.infer.annotation.Assertions; -import com.facebook.react.bridge.BaseJavaModule; -import com.facebook.react.bridge.ReactContext; +import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.module.annotations.ReactModule; import java.util.HashMap; import java.util.Map; @@ -18,14 +16,12 @@ import java.util.Map; * Module that exposes the URL to the source code map (used for exception stack trace parsing) to JS */ @ReactModule(name = SourceCodeModule.NAME) -public class SourceCodeModule extends BaseJavaModule { +public class SourceCodeModule extends NativeSourceCodeSpec { public static final String NAME = "SourceCode"; - private final ReactContext mReactContext; - - public SourceCodeModule(ReactContext reactContext) { - mReactContext = reactContext; + public SourceCodeModule(ReactApplicationContext reactContext) { + super(reactContext); } @Override @@ -34,12 +30,12 @@ public class SourceCodeModule extends BaseJavaModule { } @Override - public @Nullable Map getConstants() { + protected Map getTypedExportedConstants() { HashMap constants = new HashMap<>(); String sourceURL = Assertions.assertNotNull( - mReactContext.getCatalystInstance().getSourceURL(), + getReactApplicationContext().getCatalystInstance().getSourceURL(), "No source URL loaded, have you initialised the instance?"); constants.put("scriptURL", sourceURL);