From 52e5f575d6af6d5ac2838146b5ccadc4809f8056 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Tue, 27 May 2025 09:25:58 -0700 Subject: [PATCH] Migrate MapBuilder to Kotlin (#51626) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/51626 This just migrates the `MapBuilder` file to Kotlin. Users on Kotlin should still use the built-in collection extensions rather than using this class that will go away at some point in the future. Changelog: [Internal] [Changed] - Reviewed By: fabriziocucci Differential Revision: D75448739 --- .../ReactAndroid/api/ReactAndroid.api | 28 ++-- .../com/facebook/react/common/MapBuilder.java | 136 ------------------ .../com/facebook/react/common/MapBuilder.kt | 107 ++++++++++++++ 3 files changed, 121 insertions(+), 150 deletions(-) delete mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/MapBuilder.java create mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/MapBuilder.kt diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index ac7e0366e7ce..3e0f0caa7c84 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -1664,23 +1664,23 @@ public final class com/facebook/react/common/LifecycleState : java/lang/Enum { public static fun values ()[Lcom/facebook/react/common/LifecycleState; } -public class com/facebook/react/common/MapBuilder { - public fun ()V - public static fun builder ()Lcom/facebook/react/common/MapBuilder$Builder; - public static fun newHashMap ()Ljava/util/HashMap; - public static fun of ()Ljava/util/Map; - public static fun of (Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; - public static fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; - public static fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; - public static fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; - public static fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; - public static fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; - public static fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; +public final class com/facebook/react/common/MapBuilder { + public static final field INSTANCE Lcom/facebook/react/common/MapBuilder; + public static final fun builder ()Lcom/facebook/react/common/MapBuilder$Builder; + public static final fun newHashMap ()Ljava/util/HashMap; + public static final fun of ()Ljava/util/Map; + public static final fun of (Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; + public static final fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; + public static final fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; + public static final fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; + public static final fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; + public static final fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; + public static final fun of (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map; } public final class com/facebook/react/common/MapBuilder$Builder { - public fun build ()Ljava/util/Map; - public fun put (Ljava/lang/Object;Ljava/lang/Object;)Lcom/facebook/react/common/MapBuilder$Builder; + public final fun build ()Ljava/util/Map; + public final fun put (Ljava/lang/Object;Ljava/lang/Object;)Lcom/facebook/react/common/MapBuilder$Builder; } public final class com/facebook/react/common/ReactConstants { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/MapBuilder.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/MapBuilder.java deleted file mode 100644 index 8cabe3b54fd5..000000000000 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/MapBuilder.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and 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.common; - -import com.facebook.infer.annotation.Nullsafe; -import java.util.HashMap; -import java.util.Map; - -/** - * Utility class for creating maps - * - * @deprecated Use Kotlin's built-in collections extensions - */ -@Nullsafe(Nullsafe.Mode.LOCAL) -@Deprecated -public class MapBuilder { - - /** Creates an instance of {@code HashMap} */ - public static HashMap newHashMap() { - return new HashMap(); - } - - /** Returns the empty map. */ - public static Map of() { - return newHashMap(); - } - - /** Returns map containing a single entry. */ - public static Map of(K k1, V v1) { - Map map = of(); - map.put(k1, v1); - return map; - } - - /** Returns map containing the given entries. */ - public static Map of(K k1, V v1, K k2, V v2) { - Map map = of(); - map.put(k1, v1); - map.put(k2, v2); - return map; - } - - /** Returns map containing the given entries. */ - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3) { - Map map = of(); - map.put(k1, v1); - map.put(k2, v2); - map.put(k3, v3); - return map; - } - - /** Returns map containing the given entries. */ - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { - Map map = of(); - map.put(k1, v1); - map.put(k2, v2); - map.put(k3, v3); - map.put(k4, v4); - return map; - } - - /** Returns map containing the given entries. */ - public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { - Map map = of(); - map.put(k1, v1); - map.put(k2, v2); - map.put(k3, v3); - map.put(k4, v4); - map.put(k5, v5); - return map; - } - - /** Returns map containing the given entries. */ - public static Map of( - K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) { - Map map = of(); - map.put(k1, v1); - map.put(k2, v2); - map.put(k3, v3); - map.put(k4, v4); - map.put(k5, v5); - map.put(k6, v6); - return map; - } - - /** Returns map containing the given entries. */ - public static Map of( - K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) { - Map map = of(); - map.put(k1, v1); - map.put(k2, v2); - map.put(k3, v3); - map.put(k4, v4); - map.put(k5, v5); - map.put(k6, v6); - map.put(k7, v7); - return map; - } - - /** Returns map containing the given entries. */ - public static Builder builder() { - return new Builder(); - } - - public static final class Builder { - - private Map mMap; - private boolean mUnderConstruction; - - private Builder() { - mMap = newHashMap(); - mUnderConstruction = true; - } - - public Builder put(K k, V v) { - if (!mUnderConstruction) { - throw new IllegalStateException("Underlying map has already been built"); - } - mMap.put(k, v); - return this; - } - - public Map build() { - if (!mUnderConstruction) { - throw new IllegalStateException("Underlying map has already been built"); - } - mUnderConstruction = false; - return mMap; - } - } -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/MapBuilder.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/MapBuilder.kt new file mode 100644 index 000000000000..e7a022fc265a --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/MapBuilder.kt @@ -0,0 +1,107 @@ +/* + * Copyright (c) Meta Platforms, Inc. and 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.common + +/** Utility class for creating maps */ +@Deprecated("Use Kotlin's built-in collections extensions") +public object MapBuilder { + /** Creates an instance of `HashMap` */ + @JvmStatic public fun newHashMap(): HashMap = hashMapOf() + + /** Returns the empty map. */ + @JvmStatic public fun of(): MutableMap = newHashMap() + + /** Returns map containing a single entry. */ + @JvmStatic public fun of(k1: K, v1: V): MutableMap = hashMapOf(k1 to v1) + + /** Returns map containing the given entries. */ + @JvmStatic + public fun of(k1: K, v1: V, k2: K, v2: V): MutableMap = hashMapOf(k1 to v1, k2 to v2) + + /** Returns map containing the given entries. */ + @JvmStatic + public fun of(k1: K, v1: V, k2: K, v2: V, k3: K, v3: V): MutableMap = + hashMapOf(k1 to v1, k2 to v2, k3 to v3) + + /** Returns map containing the given entries. */ + @JvmStatic + public fun of(k1: K, v1: V, k2: K, v2: V, k3: K, v3: V, k4: K, v4: V): MutableMap = + hashMapOf(k1 to v1, k2 to v2, k3 to v3, k4 to v4) + + /** Returns map containing the given entries. */ + @JvmStatic + public fun of( + k1: K, + v1: V, + k2: K, + v2: V, + k3: K, + v3: V, + k4: K, + v4: V, + k5: K, + v5: V + ): MutableMap = hashMapOf(k1 to v1, k2 to v2, k3 to v3, k4 to v4, k5 to v5) + + /** Returns map containing the given entries. */ + @JvmStatic + public fun of( + k1: K, + v1: V, + k2: K, + v2: V, + k3: K, + v3: V, + k4: K, + v4: V, + k5: K, + v5: V, + k6: K, + v6: V + ): MutableMap = hashMapOf(k1 to v1, k2 to v2, k3 to v3, k4 to v4, k5 to v5, k6 to v6) + + /** Returns map containing the given entries. */ + @JvmStatic + public fun of( + k1: K, + v1: V, + k2: K, + v2: V, + k3: K, + v3: V, + k4: K, + v4: V, + k5: K, + v5: V, + k6: K, + v6: V, + k7: K, + v7: V + ): MutableMap = + hashMapOf(k1 to v1, k2 to v2, k3 to v3, k4 to v4, k5 to v5, k6 to v6, k7 to v7) + + /** Returns map containing the given entries. */ + @JvmStatic public fun builder(): Builder = Builder() + + public class Builder internal constructor() { + private val map: MutableMap = newHashMap() + private var underConstruction = true + + public fun put(k: K, v: V): Builder { + check(underConstruction) { "Underlying map has already been built" } + map[k] = v + return this + } + + public fun build(): Map { + check(underConstruction) { "Underlying map has already been built" } + underConstruction = false + return map + } + } +}