package net.minecraft.command.type.custom.command; import java.util.regex.Matcher; import net.minecraft.command.ParsingUtilities; import net.minecraft.command.SyntaxErrorException; import net.minecraft.command.completion.TCDSet; import net.minecraft.command.completion.TabCompletionData; import net.minecraft.command.construction.CommandDescriptorDefault; import net.minecraft.command.construction.CommandDescriptorDefault.CParserData; import net.minecraft.command.descriptors.ICommandDescriptor; import net.minecraft.command.parser.CompletionParser; import net.minecraft.command.parser.CompletionParser.CompletionData; import net.minecraft.command.parser.Parser; import net.minecraft.command.type.base.ExCustomCompletable; import net.minecraft.command.type.metadata.MetaEntry; import net.minecraft.command.type.metadata.MetaEntry.PrimitiveHint; public class ParserKeyword extends ExCustomCompletable<ICommandDescriptor<? super CParserData>, CParserData> { private final CommandDescriptorDefault descriptor; public ParserKeyword(final CommandDescriptorDefault descriptor) { this.descriptor = descriptor; } private static final MetaEntry<PrimitiveHint, Void> hint = new MetaEntry<PrimitiveHint, Void>(CompletionParser.hintID) { @Override public PrimitiveHint get(final Parser parser, final Void parserData) { final Matcher m = parser.getMatcher(ParsingUtilities.keyMatcher); final Matcher wm = parser.getMatcher(ParsingUtilities.whitespaceMatcher); final int index = parser.getIndex() + (parser.find(m) ? m.group().length() : 0); wm.find(index); return wm.group().length() + index == parser.len ? CompletionParser.propose : null; } }; @Override public ICommandDescriptor<? super CParserData> iParse(final Parser parser, final CParserData data) throws SyntaxErrorException { // No parser.checkEnd() needed final Matcher m = parser.getMatcher(ParsingUtilities.keyMatcher); if (parser.find(m)) { final String keyword = m.group(1).toLowerCase(); final ICommandDescriptor<? super CParserData> ret = this.descriptor.getSubDescriptor(keyword); if (ret != null) { parser.incIndex(m); data.add(keyword); return ret; } } parser.supplyHint(hint); return this.descriptor.getSubDescriptor(""); } @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData, final CParserData data) { TabCompletionData.addToSet(tcDataSet, startIndex, cData, this.descriptor.getKeywordCompletions()); } }