Skip to content

Commit 736ca68

Browse files
committed
Fix querying empty module containers causing a crash
1 parent b09a75c commit 736ca68

File tree

2 files changed

+197
-1
lines changed

2 files changed

+197
-1
lines changed

src/main/java/mekanism/common/content/gear/ModuleContainer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import mekanism.api.gear.config.ModuleConfig;
2222
import mekanism.api.providers.IModuleDataProvider;
2323
import mekanism.common.lib.codec.SequencedCollectionCodec;
24+
import mekanism.common.lib.collection.EmptySequencedMap;
2425
import mekanism.common.registries.MekanismDataComponents;
2526
import net.minecraft.network.RegistryFriendlyByteBuf;
2627
import net.minecraft.network.chat.Component;
@@ -36,7 +37,7 @@
3637
@NothingNullByDefault
3738
public record ModuleContainer(SequencedMap<ModuleData<?>, Module<?>> typedModules, ItemEnchantments enchantments) implements IModuleContainer {
3839

39-
public static final ModuleContainer EMPTY = new ModuleContainer(Collections.emptyNavigableMap(), ItemEnchantments.EMPTY);
40+
public static final ModuleContainer EMPTY = new ModuleContainer(EmptySequencedMap.emptyMap(), ItemEnchantments.EMPTY);
4041

4142
public static final Codec<ModuleContainer> CODEC = RecordCodecBuilder.create(instance -> instance.group(
4243
new SequencedCollectionCodec<>(Module.CODEC).fieldOf(NBTConstants.MODULES).forGetter(container -> container.typedModules().sequencedValues()),
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
package mekanism.common.lib.collection;
2+
3+
import java.util.AbstractMap;
4+
import java.util.Collection;
5+
import java.util.Collections;
6+
import java.util.Map;
7+
import java.util.Objects;
8+
import java.util.SequencedCollection;
9+
import java.util.SequencedMap;
10+
import java.util.SequencedSet;
11+
import java.util.Set;
12+
import java.util.function.BiConsumer;
13+
import java.util.function.BiFunction;
14+
import java.util.function.Function;
15+
import mekanism.api.annotations.NothingNullByDefault;
16+
import org.jetbrains.annotations.Nullable;
17+
18+
//Copy of Collections#emptyMap as EMPTY_NAVIGABLE_MAP does not short circuit checks, and also does an unchecked cast in get to Comparable
19+
@NothingNullByDefault
20+
public class EmptySequencedMap<K, V> extends AbstractMap<K, V> implements SequencedMap<K, V> {
21+
22+
private static final SequencedMap<?, ?> EMPTY_MAP = new EmptySequencedMap<>();
23+
24+
@SuppressWarnings("unchecked")
25+
public static <K, V> SequencedMap<K, V> emptyMap() {
26+
return (SequencedMap<K, V>) EMPTY_MAP;
27+
}
28+
29+
private EmptySequencedMap() {
30+
}
31+
32+
@Override
33+
public int size() {
34+
return 0;
35+
}
36+
37+
@Override
38+
public boolean isEmpty() {
39+
return true;
40+
}
41+
42+
@Override
43+
public void clear() {
44+
}
45+
46+
@Override
47+
public boolean containsKey(Object key) {
48+
return false;
49+
}
50+
51+
@Override
52+
public boolean containsValue(Object value) {
53+
return false;
54+
}
55+
56+
@Nullable
57+
@Override
58+
public V get(Object key) {
59+
return null;
60+
}
61+
62+
@Override
63+
public Set<K> keySet() {
64+
return Collections.emptySet();
65+
}
66+
67+
@Override
68+
public Collection<V> values() {
69+
return Collections.emptySet();
70+
}
71+
72+
@Override
73+
public Set<Map.Entry<K, V>> entrySet() {
74+
return Collections.emptySet();
75+
}
76+
77+
@Override
78+
public boolean equals(Object o) {
79+
if (o == this) {
80+
return true;
81+
}
82+
return o instanceof SequencedMap<?,?> other && other.isEmpty();
83+
}
84+
85+
@Override
86+
public int hashCode() {
87+
return 0;
88+
}
89+
90+
// Override default methods in Map
91+
@Override
92+
public V getOrDefault(Object k, V defaultValue) {
93+
return defaultValue;
94+
}
95+
96+
@Override
97+
public void forEach(BiConsumer<? super K, ? super V> action) {
98+
Objects.requireNonNull(action);
99+
}
100+
101+
@Override
102+
public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
103+
Objects.requireNonNull(function);
104+
}
105+
106+
@Override
107+
public V putIfAbsent(K key, V value) {
108+
throw new UnsupportedOperationException();
109+
}
110+
111+
@Override
112+
public boolean remove(Object key, Object value) {
113+
throw new UnsupportedOperationException();
114+
}
115+
116+
@Override
117+
public boolean replace(K key, V oldValue, V newValue) {
118+
throw new UnsupportedOperationException();
119+
}
120+
121+
@Override
122+
public V replace(K key, V value) {
123+
throw new UnsupportedOperationException();
124+
}
125+
126+
@Override
127+
public V computeIfAbsent(K key,
128+
Function<? super K, ? extends V> mappingFunction) {
129+
throw new UnsupportedOperationException();
130+
}
131+
132+
@Override
133+
public V computeIfPresent(K key,
134+
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
135+
throw new UnsupportedOperationException();
136+
}
137+
138+
@Override
139+
public V compute(K key,
140+
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
141+
throw new UnsupportedOperationException();
142+
}
143+
144+
@Override
145+
public V merge(K key, V value,
146+
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
147+
throw new UnsupportedOperationException();
148+
}
149+
150+
@Override
151+
public SequencedMap<K, V> reversed() {
152+
//Don't need to reverse it as it is empty
153+
return this;
154+
}
155+
156+
// Override default methods in SequencedMap
157+
@Nullable
158+
@Override
159+
public Entry<K, V> firstEntry() {
160+
return null;
161+
}
162+
163+
@Nullable
164+
@Override
165+
public Entry<K, V> lastEntry() {
166+
return null;
167+
}
168+
169+
@Nullable
170+
@Override
171+
public Entry<K, V> pollFirstEntry() {
172+
return null;
173+
}
174+
175+
@Nullable
176+
@Override
177+
public Entry<K, V> pollLastEntry() {
178+
return null;
179+
}
180+
181+
@Override
182+
public SequencedSet<K> sequencedKeySet() {
183+
return Collections.emptySortedSet();
184+
}
185+
186+
@Override
187+
public SequencedCollection<V> sequencedValues() {
188+
return Collections.emptySortedSet();
189+
}
190+
191+
@Override
192+
public SequencedSet<Entry<K, V>> sequencedEntrySet() {
193+
return Collections.emptySortedSet();
194+
}
195+
}

0 commit comments

Comments
 (0)