Add a way to selectively enable TurboModules

Summary:
Added a flag that checks if TurboModules are enabled, don't expose them to JS via the old module system.
All TurboModules needs to implement TurboModule interface.

Reviewed By: mdvacca

Differential Revision: D13648332

fbshipit-source-id: f22506fe029ac82d56075f5b6962ff2df2e7eaa4
This commit is contained in:
Ram N
2019-01-16 19:24:42 -08:00
committed by Facebook Github Bot
parent c93edb5ffd
commit aa19fa02e9
8 changed files with 58 additions and 4 deletions
@@ -17,6 +17,7 @@ public class ReactModuleInfo {
private final boolean mHasConstants;
private final boolean mIsCxxModule;
private String mClassName;
private final boolean mIsTurboModule;
public ReactModuleInfo(
String name,
@@ -24,13 +25,15 @@ public class ReactModuleInfo {
boolean canOverrideExistingModule,
boolean needsEagerInit,
boolean hasConstants,
boolean isCxxModule) {
boolean isCxxModule,
boolean isTurboModule) {
mName = name;
mClassName = className;
mCanOverrideExistingModule = canOverrideExistingModule;
mNeedsEagerInit = needsEagerInit;
mHasConstants = hasConstants;
mIsCxxModule = isCxxModule;
mIsTurboModule = isTurboModule;
}
public String name() {
@@ -53,4 +56,6 @@ public class ReactModuleInfo {
public boolean isCxxModule() {return mIsCxxModule; }
public boolean isTurboModule() {return mIsTurboModule; }
}
@@ -23,5 +23,6 @@ rn_java_library(
react_native_dep("third-party/java/jsr-305:jsr-305"),
react_native_target("java/com/facebook/react/module/annotations:annotations"),
react_native_target("java/com/facebook/react/module/model:model"),
react_native_target("java/com/facebook/react/turbomodule/core/interfaces:interfaces"),
],
)
@@ -13,6 +13,7 @@ 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 com.facebook.react.turbomodule.core.interfaces.TurboModule;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.JavaFile;
@@ -26,6 +27,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
@@ -147,7 +149,7 @@ public class ReactModuleSpecProcessor extends AbstractProcessor {
private CodeBlock getCodeBlockForReactModuleInfos(List<String> nativeModules)
throws ReactModuleSpecException {
CodeBlock.Builder builder = CodeBlock.builder();
final CodeBlock.Builder builder = CodeBlock.builder();
if (nativeModules == null || nativeModules.isEmpty()) {
builder.addStatement("return $T.emptyMap()", COLLECTIONS_TYPE);
} else {
@@ -170,6 +172,12 @@ public class ReactModuleSpecProcessor extends AbstractProcessor {
"Did you forget to add the @ReactModule annotation to the native module?");
}
boolean isTurboModule = isTurboModuleTypeElement(typeElement);
if (!isTurboModule) {
TypeMirror nativeModuleSpecTypeMirror = typeElement.getSuperclass();
isTurboModule = isTurboModuleTypeElement(mElements.getTypeElement(nativeModuleSpecTypeMirror.toString()));
}
List<? extends Element> elements = typeElement.getEnclosedElements();
boolean hasConstants = false;
if (elements != null) {
@@ -189,7 +197,8 @@ public class ReactModuleSpecProcessor extends AbstractProcessor {
.append(reactModule.canOverrideExistingModule()).append(", ")
.append(reactModule.needsEagerInit()).append(", ")
.append(hasConstants).append(", ")
.append(reactModule.isCxxModule())
.append(reactModule.isCxxModule()).append(", ")
.append(isTurboModule)
.append(")")
.toString();
@@ -200,6 +209,17 @@ public class ReactModuleSpecProcessor extends AbstractProcessor {
return builder.build();
}
/**
* A Module is a Turbo Module if it either implements TurboModule or its super class,
* typically NativeModuleSpec implements TurboMobile
*/
private boolean isTurboModuleTypeElement(TypeElement typeElement) {
if (typeElement == null) {
return false;
}
return typeElement.getInterfaces().stream().anyMatch(el -> el.toString().equals(TurboModule.class.getName()));
}
private static class ReactModuleSpecException extends Exception {
public final String mMessage;