diff --git a/packages/react-native-codegen/DEFS.bzl b/packages/react-native-codegen/DEFS.bzl index 142a2219577..80b97564daf 100644 --- a/packages/react-native-codegen/DEFS.bzl +++ b/packages/react-native-codegen/DEFS.bzl @@ -10,6 +10,7 @@ load( "fb_xplat_cxx_test", "get_apple_compiler_flags", "get_apple_inspector_flags", + "react_native_dep", "react_native_target", "react_native_xplat_target", "rn_android_library", @@ -222,6 +223,7 @@ def rn_codegen( ], visibility = ["PUBLIC"], deps = [ + react_native_dep("third-party/android/androidx:annotation"), react_native_target("java/com/facebook/react/bridge:bridge"), ], ) diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js index f5072771861..fded744184d 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js @@ -31,45 +31,53 @@ public interface ::_CLASSNAME_:: { } `; -function getJavaValueForProp( - prop: PropTypeShape, - componentName: string, -): string { +function addNullable(imports) { + imports.add('import androidx.annotation.Nullable;'); +} + +function getJavaValueForProp(prop: PropTypeShape, imports): string { const typeAnnotation = prop.typeAnnotation; switch (typeAnnotation.type) { case 'BooleanTypeAnnotation': return 'boolean value'; case 'StringTypeAnnotation': - return 'String value'; + addNullable(imports); + return '@Nullable String value'; case 'Int32TypeAnnotation': return 'int value'; case 'FloatTypeAnnotation': + addNullable(imports); return 'Float value'; case 'NativePrimitiveTypeAnnotation': switch (typeAnnotation.name) { case 'ColorPrimitive': - return 'Integer value'; + addNullable(imports); + return '@Nullable Integer value'; case 'ImageSourcePrimitive': - return 'ReadableMap value'; + addNullable(imports); + return '@Nullable ReadableMap value'; case 'PointPrimitive': - return 'ReadableMap value'; + addNullable(imports); + return '@Nullable ReadableMap value'; default: (typeAnnotation.name: empty); throw new Error('Received unknown NativePrimitiveTypeAnnotation'); } case 'ArrayTypeAnnotation': { - return 'ReadableArray value'; + addNullable(imports); + return '@Nullable ReadableArray value'; } case 'StringEnumTypeAnnotation': - return 'String value'; + addNullable(imports); + return '@Nullable String value'; default: (typeAnnotation: empty); throw new Error('Received invalid typeAnnotation'); } } -function generatePropsString(component: ComponentShape, componentName: string) { +function generatePropsString(component: ComponentShape, imports) { if (component.props.length === 0) { return '// No props'; } @@ -78,7 +86,7 @@ function generatePropsString(component: ComponentShape, componentName: string) { .map(prop => { return `void set${toSafeJavaString( prop.name, - )}(T view, ${getJavaValueForProp(prop, componentName)});`; + )}(T view, ${getJavaValueForProp(prop, imports)});`; }) .join('\n' + ' '); } @@ -166,7 +174,7 @@ module.exports = { const fileName = `${className}.java`; const imports = getImports(component); - const propsString = generatePropsString(component, componentName); + const propsString = generatePropsString(component, imports); const commandsString = generateCommandsString(component, componentName); const extendString = getClassExtendString(component); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaInterface-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaInterface-test.js.snap index 1ce8aceb8be..2944b1e2f0d 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaInterface-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaInterface-test.js.snap @@ -6,17 +6,18 @@ Map { package com.facebook.react.viewmanagers; import android.view.View; +import androidx.annotation.Nullable; import com.facebook.react.bridge.ReadableArray; public interface ArrayPropsNativeComponentInterface { - void setNames(T view, ReadableArray value); - void setDisableds(T view, ReadableArray value); - void setProgress(T view, ReadableArray value); - void setRadii(T view, ReadableArray value); - void setColors(T view, ReadableArray value); - void setSrcs(T view, ReadableArray value); - void setPoints(T view, ReadableArray value); - void setSizes(T view, ReadableArray value); + void setNames(T view, @Nullable ReadableArray value); + void setDisableds(T view, @Nullable ReadableArray value); + void setProgress(T view, @Nullable ReadableArray value); + void setRadii(T view, @Nullable ReadableArray value); + void setColors(T view, @Nullable ReadableArray value); + void setSrcs(T view, @Nullable ReadableArray value); + void setPoints(T view, @Nullable ReadableArray value); + void setSizes(T view, @Nullable ReadableArray value); } ", } @@ -42,9 +43,10 @@ Map { package com.facebook.react.viewmanagers; import android.view.View; +import androidx.annotation.Nullable; public interface ColorPropNativeComponentInterface { - void setTintColor(T view, Integer value); + void setTintColor(T view, @Nullable Integer value); } ", } @@ -72,9 +74,10 @@ Map { package com.facebook.react.viewmanagers; import android.view.View; +import androidx.annotation.Nullable; public interface CommandNativeComponentInterface { - void setAccessibilityHint(T view, String value); + void setAccessibilityHint(T view, @Nullable String value); void hotspotUpdate(T view, int x, int y); } ", @@ -87,9 +90,10 @@ Map { package com.facebook.react.viewmanagers; import android.view.View; +import androidx.annotation.Nullable; public interface EnumPropsNativeComponentInterface { - void setAlignment(T view, String value); + void setAlignment(T view, @Nullable String value); } ", } @@ -143,6 +147,7 @@ Map { package com.facebook.react.viewmanagers; import android.view.View; +import androidx.annotation.Nullable; public interface FloatPropNativeComponentInterface { void setBlurRadius(T view, Float value); @@ -162,10 +167,11 @@ Map { package com.facebook.react.viewmanagers; import android.view.View; +import androidx.annotation.Nullable; import com.facebook.react.bridge.ReadableMap; public interface ImagePropNativeComponentInterface { - void setThumbImage(T view, ReadableMap value); + void setThumbImage(T view, @Nullable ReadableMap value); } ", } @@ -193,9 +199,10 @@ Map { package com.facebook.react.viewmanagers; import android.view.View; +import androidx.annotation.Nullable; public interface InterfaceOnlyComponentInterface { - void setAccessibilityHint(T view, String value); + void setAccessibilityHint(T view, @Nullable String value); } ", } @@ -207,13 +214,14 @@ Map { package com.facebook.react.viewmanagers; import android.view.View; +import androidx.annotation.Nullable; import com.facebook.react.bridge.ReadableMap; public interface ImageColorPropNativeComponentInterface { - void setThumbImage(T view, ReadableMap value); - void setColor(T view, Integer value); - void setThumbTintColor(T view, Integer value); - void setPoint(T view, ReadableMap value); + void setThumbImage(T view, @Nullable ReadableMap value); + void setColor(T view, @Nullable Integer value); + void setThumbTintColor(T view, @Nullable Integer value); + void setPoint(T view, @Nullable ReadableMap value); } ", } @@ -239,10 +247,11 @@ Map { package com.facebook.react.viewmanagers; import android.view.View; +import androidx.annotation.Nullable; import com.facebook.react.bridge.ReadableMap; public interface PointPropNativeComponentInterface { - void setStartPoint(T view, ReadableMap value); + void setStartPoint(T view, @Nullable ReadableMap value); } ", } @@ -254,10 +263,11 @@ Map { package com.facebook.react.viewmanagers; import android.view.View; +import androidx.annotation.Nullable; public interface StringPropComponentInterface { - void setAccessibilityHint(T view, String value); - void setAccessibilityRole(T view, String value); + void setAccessibilityHint(T view, @Nullable String value); + void setAccessibilityRole(T view, @Nullable String value); } ", }