Skip to content

Commit a2126bf

Browse files
committed
support parameterized api type for typed/tag keys
This is already needed in #11834
1 parent a14124c commit a2126bf

35 files changed

+136
-72
lines changed

paper-generator/src/main/java/io/papermc/generator/Generators.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
import io.papermc.generator.types.SourceGenerator;
55
import io.papermc.generator.types.craftblockdata.CraftBlockDataBootstrapper;
66
import io.papermc.generator.types.goal.MobGoalGenerator;
7+
import io.papermc.generator.utils.BasePackage;
78
import java.util.ArrayList;
89
import java.util.Collections;
910
import java.util.List;
10-
import io.papermc.generator.utils.BasePackage;
1111
import net.minecraft.Util;
1212
import org.jspecify.annotations.NullMarked;
1313

paper-generator/src/main/java/io/papermc/generator/Rewriters.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.papermc.generator.rewriter.types.registry.EnumRegistryRewriter;
1111
import io.papermc.generator.rewriter.types.registry.FeatureFlagRewriter;
1212
import io.papermc.generator.rewriter.types.registry.PaperFeatureFlagMapping;
13+
import io.papermc.generator.rewriter.types.registry.RegistriesArgumentProviderRewriter;
1314
import io.papermc.generator.rewriter.types.registry.RegistryConversionTestRewriter;
1415
import io.papermc.generator.rewriter.types.registry.RegistryFieldRewriter;
1516
import io.papermc.generator.rewriter.types.registry.RegistryTagRewriter;
@@ -28,16 +29,15 @@
2829
import io.papermc.generator.rewriter.types.simple.trial.AttributeRewriter;
2930
import io.papermc.generator.rewriter.types.simple.trial.PoseRewriter;
3031
import io.papermc.generator.rewriter.types.simple.trial.VillagerProfessionRewriter;
31-
import io.papermc.generator.rewriter.types.registry.RegistriesArgumentProviderRewriter;
3232
import io.papermc.generator.utils.Formatting;
3333
import io.papermc.typewriter.preset.EnumCloneRewriter;
3434
import io.papermc.typewriter.preset.model.EnumConstant;
35+
import io.papermc.typewriter.replace.SearchMetadata;
36+
import io.papermc.typewriter.replace.SearchReplaceRewriter;
3537
import java.util.Iterator;
3638
import java.util.LinkedHashMap;
3739
import java.util.Map;
3840
import java.util.function.Consumer;
39-
import io.papermc.typewriter.replace.SearchMetadata;
40-
import io.papermc.typewriter.replace.SearchReplaceRewriter;
4141
import javax.lang.model.SourceVersion;
4242
import net.minecraft.Util;
4343
import net.minecraft.core.Holder;

paper-generator/src/main/java/io/papermc/generator/registry/RegistryBootstrapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import io.papermc.generator.types.SourceGenerator;
88
import io.papermc.generator.types.registry.GeneratedKeyType;
99
import io.papermc.generator.types.registry.GeneratedTagKeyType;
10-
import java.util.List;
1110
import io.papermc.generator.utils.BasePackage;
11+
import java.util.List;
1212
import net.minecraft.core.registries.Registries;
1313
import org.jspecify.annotations.NullMarked;
1414

paper-generator/src/main/java/io/papermc/generator/resources/DataFile.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@
1111
import com.mojang.serialization.DynamicOps;
1212
import com.mojang.serialization.JsonOps;
1313
import io.papermc.generator.Main;
14-
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
15-
import org.jetbrains.annotations.VisibleForTesting;
16-
import org.jspecify.annotations.NullMarked;
17-
1814
import java.io.BufferedReader;
1915
import java.io.IOException;
2016
import java.io.InputStreamReader;
@@ -24,6 +20,9 @@
2420
import java.nio.file.Path;
2521
import java.util.HashMap;
2622
import java.util.stream.Collectors;
23+
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
24+
import org.jetbrains.annotations.VisibleForTesting;
25+
import org.jspecify.annotations.NullMarked;
2726

2827
@NullMarked
2928
public abstract class DataFile<V, A, R> {

paper-generator/src/main/java/io/papermc/generator/resources/DataFileLoader.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,6 @@
1515
import io.papermc.generator.utils.predicate.BlockPredicate;
1616
import io.papermc.generator.utils.predicate.ItemPredicate;
1717
import io.papermc.typewriter.ClassNamed;
18-
import net.minecraft.Util;
19-
import net.minecraft.core.Registry;
20-
import net.minecraft.core.registries.BuiltInRegistries;
21-
import net.minecraft.core.registries.Registries;
22-
import net.minecraft.resources.ResourceKey;
23-
import net.minecraft.util.ExtraCodecs;
24-
import net.minecraft.util.StringRepresentable;
25-
import net.minecraft.world.entity.Entity;
26-
import net.minecraft.world.entity.EntityType;
27-
import net.minecraft.world.entity.Mob;
28-
import net.minecraft.world.entity.vehicle.AbstractBoat;
29-
import net.minecraft.world.entity.vehicle.AbstractMinecart;
30-
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
31-
import net.minecraft.world.level.block.state.properties.EnumProperty;
32-
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
33-
import org.jspecify.annotations.NullMarked;
3418
import java.lang.reflect.Field;
3519
import java.lang.reflect.Modifier;
3620
import java.lang.reflect.ParameterizedType;
@@ -47,6 +31,22 @@
4731
import java.util.function.Function;
4832
import java.util.function.Supplier;
4933
import java.util.stream.Collectors;
34+
import net.minecraft.Util;
35+
import net.minecraft.core.Registry;
36+
import net.minecraft.core.registries.BuiltInRegistries;
37+
import net.minecraft.core.registries.Registries;
38+
import net.minecraft.resources.ResourceKey;
39+
import net.minecraft.util.ExtraCodecs;
40+
import net.minecraft.util.StringRepresentable;
41+
import net.minecraft.world.entity.Entity;
42+
import net.minecraft.world.entity.EntityType;
43+
import net.minecraft.world.entity.Mob;
44+
import net.minecraft.world.entity.vehicle.AbstractBoat;
45+
import net.minecraft.world.entity.vehicle.AbstractMinecart;
46+
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
47+
import net.minecraft.world.level.block.state.properties.EnumProperty;
48+
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
49+
import org.jspecify.annotations.NullMarked;
5050

5151
@NullMarked
5252
public class DataFileLoader {

paper-generator/src/main/java/io/papermc/generator/resources/DataFiles.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
import io.papermc.generator.utils.predicate.BlockPredicate;
66
import io.papermc.generator.utils.predicate.ItemPredicate;
77
import io.papermc.typewriter.ClassNamed;
8+
import java.util.List;
89
import net.minecraft.core.Registry;
910
import net.minecraft.resources.ResourceKey;
1011
import net.minecraft.resources.ResourceLocation;
1112
import net.minecraft.util.StringRepresentable;
1213
import net.minecraft.world.entity.EntityType;
1314
import net.minecraft.world.entity.Mob;
14-
import java.util.List;
1515

1616
public final class DataFiles {
1717

paper-generator/src/main/java/io/papermc/generator/resources/RegistryData.java

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,18 @@
33
import com.mojang.datafixers.util.Either;
44
import com.mojang.serialization.Codec;
55
import com.mojang.serialization.codecs.RecordCodecBuilder;
6-
import java.lang.constant.ConstantDescs;
7-
import java.util.Optional;
6+
import com.squareup.javapoet.ClassName;
7+
import com.squareup.javapoet.ParameterizedTypeName;
8+
import com.squareup.javapoet.TypeName;
9+
import com.squareup.javapoet.WildcardTypeName;
10+
import io.papermc.generator.types.Types;
811
import io.papermc.generator.utils.SourceCodecs;
912
import io.papermc.typewriter.ClassNamed;
13+
import java.lang.constant.ConstantDescs;
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
import java.util.Optional;
17+
import net.minecraft.util.ExtraCodecs;
1018
import net.minecraft.util.StringRepresentable;
1119
import org.jspecify.annotations.NullMarked;
1220

@@ -27,15 +35,16 @@ public record RegistryData(
2735
Codec.BOOL.optionalFieldOf("allow_inline", false).forGetter(RegistryData::allowInline)
2836
).apply(instance, RegistryData::new));
2937

30-
public record Api(ClassNamed klass, Optional<ClassNamed> holders, Type type, boolean keyClassNameRelate, Optional<String> registryField) {
38+
public record Api(ClassNamed klass, Optional<ClassNamed> holders, Type type, Optional<List<ParentClass>> parentClasses, boolean keyClassNameRelate, Optional<String> registryField) {
3139
public Api(ClassNamed klass) {
32-
this(klass, Optional.of(klass), Type.INTERFACE, false, Optional.empty());
40+
this(klass, Optional.of(klass), Type.INTERFACE, Optional.empty(), false, Optional.empty());
3341
}
3442

3543
public static final Codec<Api> DIRECT_CODEC = RecordCodecBuilder.create(instance -> instance.group(
3644
SourceCodecs.CLASS_NAMED.fieldOf("class").forGetter(Api::klass),
3745
SourceCodecs.CLASS_NAMED.optionalFieldOf("holders").forGetter(Api::holders),
3846
Type.CODEC.optionalFieldOf("type", Type.INTERFACE).forGetter(Api::type),
47+
ExtraCodecs.compactListCodec(ParentClass.CODEC, ExtraCodecs.nonEmptyList(ParentClass.CODEC.listOf())).optionalFieldOf("extends").forGetter(Api::parentClasses),
3948
Codec.BOOL.optionalFieldOf("key_class_name_relate", false).forGetter(Api::keyClassNameRelate),
4049
SourceCodecs.IDENTIFIER.optionalFieldOf("registry_field").forGetter(Api::registryField)
4150
).apply(instance, Api::new));
@@ -50,6 +59,19 @@ public Api(ClassNamed klass) {
5059
return Either.right(api);
5160
});
5261

62+
public TypeName getType() {
63+
ClassName klass = Types.typed(this.klass);
64+
if (this.parentClasses.isPresent()) {
65+
List<ParentClass> arguments = this.parentClasses.get();
66+
TypeName[] args = new TypeName[arguments.size()];
67+
for (int i = 0; i < arguments.size(); i ++) {
68+
args[i] = WildcardTypeName.subtypeOf(arguments.get(i).getType());
69+
}
70+
return ParameterizedTypeName.get(klass, args);
71+
}
72+
return klass;
73+
}
74+
5375
public enum Type implements StringRepresentable {
5476
INTERFACE("interface"),
5577
CLASS("class"),
@@ -68,6 +90,45 @@ public String getSerializedName() {
6890
return this.name;
6991
}
7092
}
93+
94+
public record ParentClass(ClassNamed klass, Optional<List<ParentClass>> arguments) {
95+
public ParentClass(ClassNamed value) {
96+
this(value, Optional.empty());
97+
}
98+
99+
public static final Codec<ParentClass> CLASS_ONLY_CODEC = SourceCodecs.CLASS_NAMED.xmap(ParentClass::new, ParentClass::klass);
100+
101+
private static Codec<ParentClass> directCodec(Codec<ParentClass> codec) {
102+
return RecordCodecBuilder.create(instance -> instance.group(
103+
SourceCodecs.CLASS_NAMED.fieldOf("class").forGetter(ParentClass::klass),
104+
ExtraCodecs.compactListCodec(codec, ExtraCodecs.nonEmptyList(codec.listOf())).optionalFieldOf("arguments").forGetter(ParentClass::arguments)
105+
).apply(instance, ParentClass::new));
106+
}
107+
108+
public static final Codec<ParentClass> CODEC = Codec.recursive("ParentClasses", codec -> {
109+
return Codec.either(CLASS_ONLY_CODEC, directCodec(codec)).xmap(Either::unwrap, parentClass -> {
110+
if (parentClass.arguments().isEmpty()) {
111+
return Either.left(parentClass);
112+
}
113+
return Either.right(parentClass);
114+
});
115+
});
116+
117+
public TypeName getType() {
118+
ClassName from = Types.typed(this.klass);
119+
if (this.arguments.isPresent()) {
120+
List<ParentClass> args = this.arguments.get();
121+
List<TypeName> arguments = new ArrayList<>(args.size());
122+
for (ParentClass arg : args) {
123+
arguments.add(arg.getType());
124+
}
125+
126+
return ParameterizedTypeName.get(from, arguments.toArray(TypeName[]::new));
127+
}
128+
129+
return from;
130+
}
131+
}
71132
}
72133

73134
public record Impl(ClassNamed klass, String instanceMethod, boolean delayed) {

paper-generator/src/main/java/io/papermc/generator/resources/SliceResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package io.papermc.generator.resources;
22

3-
import org.jspecify.annotations.NullMarked;
43
import java.util.Collections;
54
import java.util.Set;
5+
import org.jspecify.annotations.NullMarked;
66

77
@NullMarked
88
public record SliceResult<A, R>(Set<A> added, Set<R> removed) {

paper-generator/src/main/java/io/papermc/generator/rewriter/types/Types.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import com.squareup.javapoet.ClassName;
44
import io.papermc.typewriter.ClassNamed;
5-
import org.jspecify.annotations.NullMarked;
65
import java.util.ArrayList;
76
import java.util.List;
7+
import org.jspecify.annotations.NullMarked;
88

99
import static io.papermc.generator.utils.BasePackage.BUKKIT;
1010
import static io.papermc.generator.utils.BasePackage.CRAFT_BUKKIT;

paper-generator/src/main/java/io/papermc/generator/rewriter/types/registry/PaperRegistriesRewriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package io.papermc.generator.rewriter.types.registry;
22

33
import com.google.common.base.CaseFormat;
4-
import io.papermc.generator.resources.RegistryData;
54
import io.papermc.generator.registry.RegistryEntries;
65
import io.papermc.generator.registry.RegistryEntry;
6+
import io.papermc.generator.resources.RegistryData;
77
import io.papermc.generator.rewriter.types.Types;
88
import io.papermc.typewriter.replace.SearchMetadata;
99
import io.papermc.typewriter.replace.SearchReplaceRewriter;

0 commit comments

Comments
 (0)