Skip to content

Commit

Permalink
Align with code-gen output Sample Turbo Modules (facebook#44640)
Browse files Browse the repository at this point in the history
Summary:
Pull Request resolved: facebook#44640

These modules are manually typed and don't use `react-native-codgen` (as a show case to demonstrates what code-gen produces).

There are some typos in the manually written code and they don't exactly match the JS Spec used at runtime:

https://github.com/facebook/react-native/blob/main/packages/react-native/src/private/specs/modules/NativeSampleTurboModule.js#L45-L48

Changelog: [Internal][Fixed] Align with code-gen output Sample Turbo Modules

Reviewed By: rshest

Differential Revision: D57624824

fbshipit-source-id: 023f2318630aa342758d5ea495e6298cb8884ae1
  • Loading branch information
christophpurrer authored and facebook-github-bot committed May 28, 2024
1 parent d937883 commit 24aed6e
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 114 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,91 +24,105 @@
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaModule
implements TurboModule {
public static final String NAME = "SampleTurboModule";

public NativeSampleTurboModuleSpec(ReactApplicationContext reactContext) {
super(reactContext);
}

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract double getNumber(double arg);

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract WritableMap getValue(double x, String y, ReadableMap z);
@Override
public @Nonnull String getName() {
return NAME;
}

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract WritableMap getObject(ReadableMap arg);
protected abstract Map<String, Object> getTypedExportedConstants();

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract WritableMap getUnsafeObject(ReadableMap arg);
@Override
public final @Nullable Map<String, Object> getConstants() {
Map<String, Object> constants = getTypedExportedConstants();
if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) {
Set<String> obligatoryFlowConstants =
new HashSet<>(Arrays.asList("const1", "const2", "const3"));
Set<String> optionalFlowConstants = new HashSet<>();
Set<String> undeclaredConstants = new HashSet<>(constants.keySet());
undeclaredConstants.removeAll(obligatoryFlowConstants);
undeclaredConstants.removeAll(optionalFlowConstants);
if (!undeclaredConstants.isEmpty()) {
throw new IllegalStateException(
"Native Module Flow doesn't declare constants: " + undeclaredConstants);
}
undeclaredConstants = obligatoryFlowConstants;
undeclaredConstants.removeAll(constants.keySet());
if (!undeclaredConstants.isEmpty()) {
throw new IllegalStateException(
"Native Module doesn't fill in constants: " + undeclaredConstants);
}
}
return constants;
}

@ReactMethod
public abstract void voidFunc();

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract WritableArray getArray(ReadableArray arg);
public abstract boolean getBool(boolean arg);

@ReactMethod
public abstract void getValueWithPromise(boolean error, Promise promise);
@ReactMethod(isBlockingSynchronousMethod = true)
public double getEnum(double arg) {
return 0;
}

@ReactMethod
public abstract void getValueWithCallback(Callback callback);
@ReactMethod(isBlockingSynchronousMethod = true)
public abstract double getNumber(double arg);

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract String getString(String arg);

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract double getRootTag(double arg);
public abstract WritableArray getArray(ReadableArray arg);

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract boolean getBool(boolean arg);
public abstract WritableMap getObject(ReadableMap arg);

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract double getEnum(double arg);
public abstract WritableMap getUnsafeObject(ReadableMap arg);

@ReactMethod()
public abstract void voidFuncThrows();
@ReactMethod(isBlockingSynchronousMethod = true)
public abstract double getRootTag(double arg);

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract WritableMap getObjectThrows(ReadableMap arg);
public abstract WritableMap getValue(double x, String y, ReadableMap z);

@ReactMethod()
public abstract void promiseThrows(Promise promise);
@ReactMethod
public abstract void getValueWithCallback(Callback callback);

@ReactMethod()
public abstract void voidFuncAssert();
@ReactMethod
public abstract void getValueWithPromise(boolean error, Promise promise);

@ReactMethod
public void voidFuncThrows() {}

@ReactMethod(isBlockingSynchronousMethod = true)
public abstract WritableMap getObjectAssert(ReadableMap arg);
public WritableMap getObjectThrows(ReadableMap arg) {
return null;
}

@ReactMethod()
public abstract void promiseAssert(Promise promise);
@ReactMethod
public void promiseThrows(Promise promise) {}

protected abstract Map<String, Object> getTypedExportedConstants();
@ReactMethod
public void voidFuncAssert() {}

@Override
public final @Nullable Map<String, Object> getConstants() {
Map<String, Object> constants = getTypedExportedConstants();
if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) {
Set<String> obligatoryFlowConstants =
new HashSet<>(Arrays.asList("const2", "const1", "const3"));
Set<String> optionalFlowConstants = new HashSet<>();
Set<String> 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;
@ReactMethod(isBlockingSynchronousMethod = true)
public WritableMap getObjectAssert(ReadableMap arg) {
return null;
}

@ReactMethod
public void promiseAssert(Promise promise) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,23 @@
#include <ReactCommon/SampleTurboModuleSpec.h>

namespace facebook::react {
static facebook::jsi::Value
__hostFunction_NativeSampleTurboModuleSpecJSI_getConstants(
facebook::jsi::Runtime& rt,
TurboModule& turboModule,
const facebook::jsi::Value* args,
size_t count) {
static jmethodID cachedMethodId = nullptr;
return static_cast<JavaTurboModule&>(turboModule)
.invokeJavaMethod(
rt,
ObjectKind,
"getConstants",
"()Ljava/util/Map;",
args,
count,
cachedMethodId);
}

static facebook::jsi::Value
__hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc(
Expand Down Expand Up @@ -113,6 +130,24 @@ __hostFunction_NativeSampleTurboModuleSpecJSI_getObject(
cachedMethodId);
}

static facebook::jsi::Value
__hostFunction_NativeSampleTurboModuleSpecJSI_getUnsafeObject(
facebook::jsi::Runtime& rt,
TurboModule& turboModule,
const facebook::jsi::Value* args,
size_t count) {
static jmethodID cachedMethodId = nullptr;
return static_cast<JavaTurboModule&>(turboModule)
.invokeJavaMethod(
rt,
ObjectKind,
"getUnsafeObject",
"(Lcom/facebook/react/bridge/ReadableMap;)Lcom/facebook/react/bridge/WritableMap;",
args,
count,
cachedMethodId);
}

static facebook::jsi::Value
__hostFunction_NativeSampleTurboModuleSpecJSI_getRootTag(
facebook::jsi::Runtime& rt,
Expand Down Expand Up @@ -275,80 +310,47 @@ __hostFunction_NativeSampleTurboModuleSpecJSI_promiseAssert(
cachedMethodId);
}

static facebook::jsi::Value
__hostFunction_NativeSampleTurboModuleSpecJSI_getConstants(
facebook::jsi::Runtime& rt,
TurboModule& turboModule,
const facebook::jsi::Value* args,
size_t count) {
static jmethodID cachedMethodId = nullptr;
return static_cast<JavaTurboModule&>(turboModule)
.invokeJavaMethod(
rt,
ObjectKind,
"getConstants",
"()Ljava/util/Map;",
args,
count,
cachedMethodId);
}

NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(
const JavaTurboModule::InitParams& params)
: JavaTurboModule(params) {
methodMap_["getConstants"] = MethodMetadata{
0, __hostFunction_NativeSampleTurboModuleSpecJSI_getConstants};
methodMap_["voidFunc"] =
MethodMetadata{0, __hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc};

methodMap_["getBool"] =
MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getBool};

methodMap_["getEnum"] =
MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getEnum};

methodMap_["getNumber"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_getNumber};

methodMap_["getString"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_getString};

methodMap_["getArray"] =
MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getArray};

methodMap_["getObject"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_getObject};

methodMap_["getUnsafeObject"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_getUnsafeObject};
methodMap_["getRootTag"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_getRootTag};

methodMap_["getValue"] =
MethodMetadata{3, __hostFunction_NativeSampleTurboModuleSpecJSI_getValue};

methodMap_["getValueWithCallback"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_getValueWithCallback};

methodMap_["getValueWithPromise"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_getValueWithPromise};

methodMap_["voidFuncThrows"] = MethodMetadata{
0, __hostFunction_NativeSampleTurboModuleSpecJSI_voidFuncThrows};

methodMap_["getObjectThrows"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_getObjectThrows};

methodMap_["promiseThrows"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_promiseThrows};

0, __hostFunction_NativeSampleTurboModuleSpecJSI_promiseThrows};
methodMap_["voidFuncAssert"] = MethodMetadata{
0, __hostFunction_NativeSampleTurboModuleSpecJSI_voidFuncAssert};

methodMap_["getObjectAssert"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_getObjectAssert};

methodMap_["promiseAssert"] = MethodMetadata{
1, __hostFunction_NativeSampleTurboModuleSpecJSI_promiseAssert};

methodMap_["getConstants"] = MethodMetadata{
0, __hostFunction_NativeSampleTurboModuleSpecJSI_getConstants};
0, __hostFunction_NativeSampleTurboModuleSpecJSI_promiseAssert};
}

std::shared_ptr<TurboModule> SampleTurboModuleSpec_ModuleProvider(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@
namespace facebook::react {

/**
* C++ class for module 'SampleTurboModule'
* JNI C++ class for module 'NativeSampleTurboModule'
*/
class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public JavaTurboModule {
public:
NativeSampleTurboModuleSpecJSI(const JavaTurboModule::InitParams& params);
};

JSI_EXPORT
std::shared_ptr<TurboModule> SampleTurboModuleSpec_ModuleProvider(
const std::string& moduleName,
const JavaTurboModule::InitParams& params);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@
- (void)getValueWithPromise:(BOOL)error resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
- (void)voidFuncThrows;
- (NSDictionary *)getObjectThrows:(NSDictionary *)arg;
- (void)promiseThrows:(BOOL)error resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
- (void)promiseThrows:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
- (void)voidFuncAssert;
- (NSDictionary *)getObjectAssert:(NSDictionary *)arg;
- (void)promiseAssert:(BOOL)error resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
- (void)promiseAssert:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
- (NSDictionary *)constantsToExport;
- (NSDictionary *)getConstants;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,16 +130,6 @@
rt, PromiseKind, "getValueWithPromise", @selector(getValueWithPromise:resolve:reject:), args, count);
}

static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getConstants(
facebook::jsi::Runtime &rt,
TurboModule &turboModule,
const facebook::jsi::Value *args,
size_t count)
{
return static_cast<ObjCTurboModule &>(turboModule)
.invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count);
}

static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_voidFuncThrows(
facebook::jsi::Runtime &rt,
TurboModule &turboModule,
Expand Down Expand Up @@ -167,7 +157,7 @@
size_t count)
{
return static_cast<ObjCTurboModule &>(turboModule)
.invokeObjCMethod(rt, PromiseKind, "promiseThrows", @selector(promiseThrows:resolve:reject:), args, count);
.invokeObjCMethod(rt, PromiseKind, "promiseThrows", @selector(promiseThrows:reject:), args, count);
}

static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_voidFuncAssert(
Expand Down Expand Up @@ -197,7 +187,17 @@
size_t count)
{
return static_cast<ObjCTurboModule &>(turboModule)
.invokeObjCMethod(rt, PromiseKind, "promiseAssert", @selector(promiseAssert:resolve:reject:), args, count);
.invokeObjCMethod(rt, PromiseKind, "promiseAssert", @selector(promiseAssert:reject:), args, count);
}

static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getConstants(
facebook::jsi::Runtime &rt,
TurboModule &turboModule,
const facebook::jsi::Value *args,
size_t count)
{
return static_cast<ObjCTurboModule &>(turboModule)
.invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count);
}

NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams &params)
Expand All @@ -219,10 +219,10 @@
MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getValueWithPromise};
methodMap_["voidFuncThrows"] = MethodMetadata{0, __hostFunction_NativeSampleTurboModuleSpecJSI_voidFuncThrows};
methodMap_["getObjectThrows"] = MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getObjectThrows};
methodMap_["promiseThrows"] = MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_promiseThrows};
methodMap_["promiseThrows"] = MethodMetadata{0, __hostFunction_NativeSampleTurboModuleSpecJSI_promiseThrows};
methodMap_["voidFuncAssert"] = MethodMetadata{0, __hostFunction_NativeSampleTurboModuleSpecJSI_voidFuncAssert};
methodMap_["getObjectAssert"] = MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getObjectAssert};
methodMap_["promiseAssert"] = MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_promiseAssert};
methodMap_["promiseAssert"] = MethodMetadata{0, __hostFunction_NativeSampleTurboModuleSpecJSI_promiseAssert};
methodMap_["getConstants"] = MethodMetadata{0, __hostFunction_NativeSampleTurboModuleSpecJSI_getConstants};
}

Expand Down
Loading

0 comments on commit 24aed6e

Please sign in to comment.