package net.minecraft.command.type.custom.json; import java.util.Set; import java.util.regex.Matcher; import net.minecraft.command.ParsingUtilities; import net.minecraft.command.SyntaxErrorException; import net.minecraft.command.completion.ITabCompletion; import net.minecraft.command.completion.TCDSet; import net.minecraft.command.completion.TabCompletionData; import net.minecraft.command.parser.CompletionParser.CompletionData; import net.minecraft.command.parser.MatcherRegistry; import net.minecraft.command.parser.Parser; import net.minecraft.command.type.base.ExCustomCompletable; import net.minecraft.command.type.custom.json.ParserJsonObject.JsonObjectData; public class TypeJsonPair extends ExCustomCompletable<Void, JsonObjectData> { public static final MatcherRegistry keyMatcher = new MatcherRegistry("\\G\\s*+(?:([\"'])|((?:\\s*+[^,\\]}\\s:]++)++)\\s*+:)"); private final JsonDescriptor.Object descriptor; public TypeJsonPair(final JsonDescriptor.Object descriptor) { this.descriptor = descriptor; } @Override public Void iParse(final Parser parser, final JsonObjectData parserData) throws SyntaxErrorException { final Matcher m = parser.getMatcher(keyMatcher); if (!parser.findInc(m)) throw parser.SEE("Missing member name "); ParsingUtilities.terminateCompletion(parser); String name; if (m.group(1) != null) { name = ParsingUtilities.parseEscapedString(parser, m.group(1).charAt(0)); parser.findInc(ParsingUtilities.whitespaceMatcher); if (parser.endReached() || parser.consumeNextChar() != ':') throw parser.SEE("Invalid syntax for Json-member-name "); } else name = m.group(2); parserData.name = name; this.descriptor.getSubDescriptor(name).getElementParser().parse(parser, parserData); return null; } @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData, final JsonObjectData parserData) { final Set<String> keySet = parserData.keySet(); for (final ITabCompletion tc : this.descriptor.getKeyCompletions()) if (!keySet.contains(tc.name)) TabCompletionData.addToSet(tcDataSet, startIndex, cData, tc); } }