Skip to content

Commit b640b6f

Browse files
dulmandakhfacebook-github-bot
authored andcommitted
nullable annotations to ReadableMap, WritableMap, ReadableArray, Writable. (#23329)
Summary: Kotlin is getting traction and more developers write RN native modules in it. This PR adds nullable annotations to help with Kotlin null inference and improve developer experience. Also it'll help checking code quality using lint. I skimmed through JavaOnlyMap.java, JavaOnlyArray.java, ReadableNativeArray.java, ReadableNativeMap.java, WritableNativeArray.java and WritableNativeMap.java to infer nullability. This is breaking change to Kotlin code. [Android] [Changed] - Add nullable annotations to ReadableMap, WritableMap, ReadableArray, Writable. Pull Request resolved: #23329 Differential Revision: D14002571 Pulled By: cpojer fbshipit-source-id: 899d8b3b0a5dad43e8300e6c4ea4208cca0f01a9
1 parent d002d30 commit b640b6f

File tree

10 files changed

+114
-88
lines changed

10 files changed

+114
-88
lines changed

ReactAndroid/src/main/java/com/facebook/react/bridge/JavaOnlyArray.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
import java.util.Arrays;
1212
import java.util.List;
1313

14+
import javax.annotation.Nonnull;
15+
import javax.annotation.Nullable;
16+
1417
/**
1518
* Java {@link ArrayList} backed implementation of {@link ReadableArray} and {@link WritableArray}
1619
* Instances of this class SHOULD NOT be used for communication between java and JS, use instances
@@ -95,7 +98,7 @@ public int getInt(int index) {
9598
}
9699

97100
@Override
98-
public String getString(int index) {
101+
public @Nullable String getString(int index) {
99102
return (String) mBackingList.get(index);
100103
}
101104

@@ -115,12 +118,12 @@ public JavaOnlyMap getMap(int index) {
115118
}
116119

117120
@Override
118-
public Dynamic getDynamic(int index) {
121+
public @Nonnull Dynamic getDynamic(int index) {
119122
return DynamicFromArray.create(this, index);
120123
}
121124

122125
@Override
123-
public ReadableType getType(int index) {
126+
public @Nonnull ReadableType getType(int index) {
124127
Object object = mBackingList.get(index);
125128

126129
if (object == null) {
@@ -157,17 +160,17 @@ public void pushInt(int value) {
157160
}
158161

159162
@Override
160-
public void pushString(String value) {
163+
public void pushString(@Nonnull String value) {
161164
mBackingList.add(value);
162165
}
163166

164167
@Override
165-
public void pushArray(WritableArray array) {
168+
public void pushArray(@Nullable WritableArray array) {
166169
mBackingList.add(array);
167170
}
168171

169172
@Override
170-
public void pushMap(WritableMap map) {
173+
public void pushMap(@Nonnull WritableMap map) {
171174
mBackingList.add(map);
172175
}
173176

@@ -177,7 +180,7 @@ public void pushNull() {
177180
}
178181

179182
@Override
180-
public ArrayList<Object> toArrayList() {
183+
public @Nonnull ArrayList<Object> toArrayList() {
181184
return new ArrayList<Object>(mBackingList);
182185
}
183186

ReactAndroid/src/main/java/com/facebook/react/bridge/JavaOnlyMap.java

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import java.util.Iterator;
1212
import java.util.Map;
1313

14+
import javax.annotation.Nonnull;
15+
1416
/**
1517
* Java {@link HashMap} backed implementation of {@link ReadableMap} and {@link WritableMap}
1618
* Instances of this class SHOULD NOT be used for communication between java and JS, use instances
@@ -77,52 +79,52 @@ public JavaOnlyMap() {
7779
}
7880

7981
@Override
80-
public boolean hasKey(String name) {
82+
public boolean hasKey(@Nonnull String name) {
8183
return mBackingMap.containsKey(name);
8284
}
8385

8486
@Override
85-
public boolean isNull(String name) {
87+
public boolean isNull(@Nonnull String name) {
8688
return mBackingMap.get(name) == null;
8789
}
8890

8991
@Override
90-
public boolean getBoolean(String name) {
92+
public boolean getBoolean(@Nonnull String name) {
9193
return (Boolean) mBackingMap.get(name);
9294
}
9395

9496
@Override
95-
public double getDouble(String name) {
97+
public double getDouble(@Nonnull String name) {
9698
return ((Number) mBackingMap.get(name)).doubleValue();
9799
}
98100

99101
@Override
100-
public int getInt(String name) {
102+
public int getInt(@Nonnull String name) {
101103
return ((Number) mBackingMap.get(name)).intValue();
102104
}
103105

104106
@Override
105-
public String getString(String name) {
107+
public String getString(@Nonnull String name) {
106108
return (String) mBackingMap.get(name);
107109
}
108110

109111
@Override
110-
public ReadableMap getMap(String name) {
112+
public ReadableMap getMap(@Nonnull String name) {
111113
return (ReadableMap) mBackingMap.get(name);
112114
}
113115

114116
@Override
115-
public JavaOnlyArray getArray(String name) {
117+
public JavaOnlyArray getArray(@Nonnull String name) {
116118
return (JavaOnlyArray) mBackingMap.get(name);
117119
}
118120

119121
@Override
120-
public Dynamic getDynamic(String name) {
122+
public @Nonnull Dynamic getDynamic(@Nonnull String name) {
121123
return DynamicFromMap.create(this, name);
122124
}
123125

124126
@Override
125-
public ReadableType getType(String name) {
127+
public @Nonnull ReadableType getType(@Nonnull String name) {
126128
Object value = mBackingMap.get(name);
127129
if (value == null) {
128130
return ReadableType.Null;
@@ -145,7 +147,7 @@ public ReadableType getType(String name) {
145147
}
146148

147149
@Override
148-
public ReadableMapKeySetIterator keySetIterator() {
150+
public @Nonnull ReadableMapKeySetIterator keySetIterator() {
149151
return new ReadableMapKeySetIterator() {
150152
Iterator<String> mIterator = mBackingMap.keySet().iterator();
151153

@@ -162,47 +164,47 @@ public String nextKey() {
162164
}
163165

164166
@Override
165-
public void putBoolean(String key, boolean value) {
167+
public void putBoolean(@Nonnull String key, boolean value) {
166168
mBackingMap.put(key, value);
167169
}
168170

169171
@Override
170-
public void putDouble(String key, double value) {
172+
public void putDouble(@Nonnull String key, double value) {
171173
mBackingMap.put(key, value);
172174
}
173175

174176
@Override
175-
public void putInt(String key, int value) {
177+
public void putInt(@Nonnull String key, int value) {
176178
mBackingMap.put(key, value);
177179
}
178180

179181
@Override
180-
public void putString(String key, String value) {
182+
public void putString(@Nonnull String key, @Nonnull String value) {
181183
mBackingMap.put(key, value);
182184
}
183185

184186
@Override
185-
public void putNull(String key) {
187+
public void putNull(@Nonnull String key) {
186188
mBackingMap.put(key, null);
187189
}
188190

189191
@Override
190-
public void putMap(String key, WritableMap value) {
192+
public void putMap(@Nonnull String key, @Nonnull WritableMap value) {
191193
mBackingMap.put(key, value);
192194
}
193195

194196
@Override
195-
public void merge(ReadableMap source) {
197+
public void merge(@Nonnull ReadableMap source) {
196198
mBackingMap.putAll(((JavaOnlyMap) source).mBackingMap);
197199
}
198200

199201
@Override
200-
public void putArray(String key, WritableArray value) {
202+
public void putArray(@Nonnull String key, @Nonnull WritableArray value) {
201203
mBackingMap.put(key, value);
202204
}
203205

204206
@Override
205-
public HashMap<String, Object> toHashMap() {
207+
public @Nonnull HashMap<String, Object> toHashMap() {
206208
return new HashMap<String, Object>(mBackingMap);
207209
}
208210

ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableArray.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
import java.util.ArrayList;
1111

12+
import javax.annotation.Nonnull;
13+
import javax.annotation.Nullable;
14+
1215
/**
1316
* Interface for an array that allows typed access to its members. Used to pass parameters from JS
1417
* to Java.
@@ -20,11 +23,11 @@ public interface ReadableArray {
2023
boolean getBoolean(int index);
2124
double getDouble(int index);
2225
int getInt(int index);
23-
String getString(int index);
24-
ReadableArray getArray(int index);
25-
ReadableMap getMap(int index);
26-
Dynamic getDynamic(int index);
27-
ReadableType getType(int index);
28-
ArrayList<Object> toArrayList();
26+
@Nullable String getString(int index);
27+
@Nullable ReadableArray getArray(int index);
28+
@Nullable ReadableMap getMap(int index);
29+
@Nonnull Dynamic getDynamic(int index);
30+
@Nonnull ReadableType getType(int index);
31+
@Nonnull ArrayList<Object> toArrayList();
2932

3033
}

ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableMap.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,26 @@
99

1010
import java.util.HashMap;
1111

12+
import javax.annotation.Nonnull;
13+
import javax.annotation.Nullable;
14+
1215
/**
1316
* Interface for a map that allows typed access to its members. Used to pass parameters from JS to
1417
* Java.
1518
*/
1619
public interface ReadableMap {
1720

18-
boolean hasKey(String name);
19-
boolean isNull(String name);
20-
boolean getBoolean(String name);
21-
double getDouble(String name);
22-
int getInt(String name);
23-
String getString(String name);
24-
ReadableArray getArray(String name);
25-
ReadableMap getMap(String name);
26-
Dynamic getDynamic(String name);
27-
ReadableType getType(String name);
28-
ReadableMapKeySetIterator keySetIterator();
29-
HashMap<String, Object> toHashMap();
21+
boolean hasKey(@Nonnull String name);
22+
boolean isNull(@Nonnull String name);
23+
boolean getBoolean(@Nonnull String name);
24+
double getDouble(@Nonnull String name);
25+
int getInt(@Nonnull String name);
26+
@Nullable String getString(@Nonnull String name);
27+
@Nullable ReadableArray getArray(@Nonnull String name);
28+
@Nullable ReadableMap getMap(@Nonnull String name);
29+
@Nonnull Dynamic getDynamic(@Nonnull String name);
30+
@Nonnull ReadableType getType(@Nonnull String name);
31+
@Nonnull ReadableMapKeySetIterator keySetIterator();
32+
@Nonnull HashMap<String, Object> toHashMap();
3033

3134
}

ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeArray.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import com.facebook.react.config.ReactFeatureFlags;
1414
import java.util.ArrayList;
1515
import java.util.Arrays;
16+
17+
import javax.annotation.Nonnull;
1618
import javax.annotation.Nullable;
1719

1820
/**
@@ -125,7 +127,7 @@ public int getInt(int index) {
125127
private native int getIntNative(int index);
126128

127129
@Override
128-
public String getString(int index) {
130+
public @Nullable String getString(int index) {
129131
if (ReactFeatureFlags.useArrayNativeAccessor) {
130132
jniPassCounter++;
131133
return getStringNative(index);
@@ -135,7 +137,7 @@ public String getString(int index) {
135137
private native String getStringNative(int index);
136138

137139
@Override
138-
public ReadableNativeArray getArray(int index) {
140+
public @Nullable ReadableNativeArray getArray(int index) {
139141
if (ReactFeatureFlags.useArrayNativeAccessor) {
140142
jniPassCounter++;
141143
return getArrayNative(index);
@@ -145,7 +147,7 @@ public ReadableNativeArray getArray(int index) {
145147
private native ReadableNativeArray getArrayNative(int index);
146148

147149
@Override
148-
public ReadableNativeMap getMap(int index) {
150+
public @Nullable ReadableNativeMap getMap(int index) {
149151
if (ReactFeatureFlags.useArrayNativeAccessor) {
150152
jniPassCounter++;
151153
return getMapNative(index);
@@ -155,7 +157,7 @@ public ReadableNativeMap getMap(int index) {
155157
private native ReadableNativeMap getMapNative(int index);
156158

157159
@Override
158-
public ReadableType getType(int index) {
160+
public @Nonnull ReadableType getType(int index) {
159161
if (ReactFeatureFlags.useArrayNativeAccessor) {
160162
jniPassCounter++;
161163
return getTypeNative(index);
@@ -166,12 +168,12 @@ public ReadableType getType(int index) {
166168
private native ReadableType getTypeNative(int index);
167169

168170
@Override
169-
public Dynamic getDynamic(int index) {
171+
public @Nonnull Dynamic getDynamic(int index) {
170172
return DynamicFromArray.create(this, index);
171173
}
172174

173175
@Override
174-
public ArrayList<Object> toArrayList() {
176+
public @Nonnull ArrayList<Object> toArrayList() {
175177
ArrayList<Object> arrayList = new ArrayList<>();
176178

177179
for (int i = 0; i < this.size(); i++) {

0 commit comments

Comments
 (0)