4646import org .incendo .cloud .parser .standard .UUIDParser ;
4747import org .spongepowered .api .command .registrar .tree .CommandTreeNode ;
4848import org .spongepowered .api .command .registrar .tree .CommandTreeNodeTypes ;
49+ import org .spongepowered .api .registry .RegistryHolder ;
4950
5051import static java .util .Objects .requireNonNull ;
5152
@@ -60,11 +61,12 @@ public final class SpongeParserMapper<C> {
6061 private final Map <Class <?>, Mapping <C , ?>> mappers = new HashMap <>();
6162
6263 SpongeParserMapper () {
63- this . initStandardMappers ();
64+
6465 }
6566
66- CommandTreeNode .Argument <? extends CommandTreeNode .Argument <?>> mapComponent (final CommandComponent <C > commandComponent ) {
67- final CommandTreeNode .Argument <? extends CommandTreeNode .Argument <?>> result = this .mapParser (commandComponent .parser ());
67+ CommandTreeNode .Argument <? extends CommandTreeNode .Argument <?>> mapComponent (
68+ final CommandComponent <C > commandComponent , final RegistryHolder holder ) {
69+ final CommandTreeNode .Argument <? extends CommandTreeNode .Argument <?>> result = this .mapParser (commandComponent .parser (), holder );
6870 // final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(commandComponent.getSuggestionsProvider());
6971 // todo: not exactly the same as in v1...
7072 final boolean customSuggestionsProvider = commandComponent .parser () != commandComponent .suggestionProvider ();
@@ -75,13 +77,14 @@ CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapComponent(fin
7577 }
7678
7779 @ SuppressWarnings ({"unchecked" , "rawtypes" })
78- CommandTreeNode .Argument <? extends CommandTreeNode .Argument <?>> mapParser (final ArgumentParser <C , ?> argumentParser ) {
80+ CommandTreeNode .Argument <? extends CommandTreeNode .Argument <?>> mapParser (
81+ final ArgumentParser <C , ?> argumentParser , final RegistryHolder holder ) {
7982 final CommandTreeNode .Argument <? extends CommandTreeNode .Argument <?>> result ;
8083 ArgumentParser <C , ?> parser = argumentParser ;
8184 while (parser instanceof MappedArgumentParser <?, ?, ?>) {
8285 parser = ((MappedArgumentParser <C , ?, ?>) parser ).baseParser ();
8386 }
84- final Mapping <C , ?> mapper = this .mappers .get (parser .getClass ());
87+ final Mapping <C , ?> mapper = this .getOrCreateMappers ( holder ) .get (parser .getClass ());
8588 if (mapper != null ) {
8689 final CommandTreeNode .Argument <? extends CommandTreeNode .Argument <?>> apply =
8790 (CommandTreeNode .Argument <? extends CommandTreeNode .Argument <?>>) ((Function ) mapper .mapper ).apply (parser );
@@ -91,43 +94,51 @@ CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapParser(final
9194 }
9295 result = apply ;
9396 } else if (parser instanceof NodeSource ) {
94- result = ((NodeSource ) parser ).node ();
97+ result = ((NodeSource ) parser ).node (holder );
9598 } else {
96- result = CommandTreeNodeTypes .STRING .get ().createNode ().customCompletions ().word ();
99+ result = CommandTreeNodeTypes .STRING .get (holder ).createNode ().customCompletions ().word ();
97100 }
98101 return result ;
99102 }
100103
101- private void initStandardMappers () {
104+ private synchronized Map <Class <?>, Mapping <C , ?>> getOrCreateMappers (final RegistryHolder holder ) {
105+ if (this .mappers .isEmpty ()) {
106+ this .initStandardMappers (holder );
107+ }
108+
109+ return this .mappers ;
110+ }
111+
112+ private void initStandardMappers (final RegistryHolder holder ) {
102113 this .registerMapping (new TypeToken <StringParser <C >>() {
103114 }, builder -> builder .to (stringParser -> {
104115 final StringParser .StringMode mode = stringParser .stringMode ();
105116 if (mode == StringParser .StringMode .SINGLE ) {
106- return CommandTreeNodeTypes .STRING .get ().createNode ().customCompletions ().word ();
117+ return CommandTreeNodeTypes .STRING .get (holder ).createNode ().customCompletions ().word ();
107118 } else if (mode == StringParser .StringMode .QUOTED ) {
108- return CommandTreeNodeTypes .STRING .get ().createNode ().customCompletions ();
119+ return CommandTreeNodeTypes .STRING .get (holder ).createNode ().customCompletions ();
109120 } else if (mode == StringParser .StringMode .GREEDY || mode == StringParser .StringMode .GREEDY_FLAG_YIELDING ) {
110- return CommandTreeNodeTypes .STRING .get ().createNode ().customCompletions ().greedy ();
121+ return CommandTreeNodeTypes .STRING .get (holder ).createNode ().customCompletions ().greedy ();
111122 }
112123 throw new IllegalArgumentException ("Unknown string mode '" + mode + "'!" );
113124 }));
114125 this .registerMapping (new TypeToken <ByteParser <C >>() {
115126 }, builder -> builder .to (byteParser -> {
116- final CommandTreeNode .Range <Integer > node = CommandTreeNodeTypes .INTEGER .get ().createNode ();
127+ final CommandTreeNode .Range <Integer > node = CommandTreeNodeTypes .INTEGER .get (holder ).createNode ();
117128 node .min ((int ) byteParser .range ().minByte ());
118129 node .max ((int ) byteParser .range ().maxByte ());
119130 return node ;
120131 }).cloudSuggestions (true ));
121132 this .registerMapping (new TypeToken <ShortParser <C >>() {
122133 }, builder -> builder .to (shortParser -> {
123- final CommandTreeNode .Range <Integer > node = CommandTreeNodeTypes .INTEGER .get ().createNode ();
134+ final CommandTreeNode .Range <Integer > node = CommandTreeNodeTypes .INTEGER .get (holder ).createNode ();
124135 node .min ((int ) shortParser .range ().minShort ());
125136 node .max ((int ) shortParser .range ().maxShort ());
126137 return node ;
127138 }).cloudSuggestions (true ));
128139 this .registerMapping (new TypeToken <IntegerParser <C >>() {
129140 }, builder -> builder .to (integerParser -> {
130- final CommandTreeNode .Range <Integer > node = CommandTreeNodeTypes .INTEGER .get ().createNode ();
141+ final CommandTreeNode .Range <Integer > node = CommandTreeNodeTypes .INTEGER .get (holder ).createNode ();
131142 if (integerParser .hasMin ()) {
132143 node .min (integerParser .range ().minInt ());
133144 }
@@ -138,7 +149,7 @@ private void initStandardMappers() {
138149 }).cloudSuggestions (true ));
139150 this .registerMapping (new TypeToken <FloatParser <C >>() {
140151 }, builder -> builder .to (floatParser -> {
141- final CommandTreeNode .Range <Float > node = CommandTreeNodeTypes .FLOAT .get ().createNode ();
152+ final CommandTreeNode .Range <Float > node = CommandTreeNodeTypes .FLOAT .get (holder ).createNode ();
142153 if (floatParser .hasMin ()) {
143154 node .min (floatParser .range ().minFloat ());
144155 }
@@ -149,7 +160,7 @@ private void initStandardMappers() {
149160 }).cloudSuggestions (true ));
150161 this .registerMapping (new TypeToken <DoubleParser <C >>() {
151162 }, builder -> builder .to (doubleParser -> {
152- final CommandTreeNode .Range <Double > node = CommandTreeNodeTypes .DOUBLE .get ().createNode ();
163+ final CommandTreeNode .Range <Double > node = CommandTreeNodeTypes .DOUBLE .get (holder ).createNode ();
153164 if (doubleParser .hasMin ()) {
154165 node .min (doubleParser .range ().minDouble ());
155166 }
@@ -160,7 +171,7 @@ private void initStandardMappers() {
160171 }).cloudSuggestions (true ));
161172 this .registerMapping (new TypeToken <LongParser <C >>() {
162173 }, builder -> builder .to (longParser -> {
163- final CommandTreeNode .Range <Long > node = CommandTreeNodeTypes .LONG .get ().createNode ();
174+ final CommandTreeNode .Range <Long > node = CommandTreeNodeTypes .LONG .get (holder ).createNode ();
164175 if (longParser .hasMin ()) {
165176 node .min (longParser .range ().minLong ());
166177 }
@@ -171,19 +182,19 @@ private void initStandardMappers() {
171182 }).cloudSuggestions (true ));
172183 this .registerMapping (new TypeToken <BooleanParser <C >>() {
173184 }, builder -> builder .to (booleanParser -> {
174- return CommandTreeNodeTypes .BOOL .get ().createNode ();
185+ return CommandTreeNodeTypes .BOOL .get (holder ).createNode ();
175186 }));
176187 this .registerMapping (new TypeToken <CommandFlagParser <C >>() {
177188 }, builder -> builder .to (flagArgumentParser -> {
178- return CommandTreeNodeTypes .STRING .get ().createNode ().customCompletions ().greedy ();
189+ return CommandTreeNodeTypes .STRING .get (holder ).createNode ().customCompletions ().greedy ();
179190 }));
180191 this .registerMapping (new TypeToken <StringArrayParser <C >>() {
181192 }, builder -> builder .to (stringArrayParser -> {
182- return CommandTreeNodeTypes .STRING .get ().createNode ().customCompletions ().greedy ();
193+ return CommandTreeNodeTypes .STRING .get (holder ).createNode ().customCompletions ().greedy ();
183194 }));
184195 this .registerMapping (new TypeToken <UUIDParser <C >>() {
185196 }, builder -> builder .to (uuidParser -> {
186- return CommandTreeNodeTypes .UUID .get ().createNode ();
197+ return CommandTreeNodeTypes .UUID .get (holder ).createNode ();
187198 }));
188199 }
189200
0 commit comments