package net.minecraft.command.type.custom;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.minecraft.command.ParsingUtilities;
import net.minecraft.command.SyntaxErrorException;
import net.minecraft.command.arg.ArgWrapper;
import net.minecraft.command.arg.LabelWrapper;
import net.minecraft.command.arg.Setter;
import net.minecraft.command.completion.ITabCompletion;
import net.minecraft.command.completion.TCDSet;
import net.minecraft.command.completion.TabCompletion;
import net.minecraft.command.completion.TabCompletionData;
import net.minecraft.command.descriptors.SParserData;
import net.minecraft.command.descriptors.SelectorDescriptor;
import net.minecraft.command.parser.CompletionParser.CompletionData;
import net.minecraft.command.parser.Context;
import net.minecraft.command.parser.Parser;
import net.minecraft.command.type.IExParse;
import net.minecraft.command.type.TypeCompletable;
public class TypeSelectorContent<D extends SParserData> extends TypeCompletable<ArgWrapper<?>>
{
private final SelectorDescriptor<D> descriptor;
public TypeSelectorContent(final SelectorDescriptor<D> descriptor)
{
this.descriptor = descriptor;
}
@Override
public ArgWrapper<?> iParse(final Parser parser, final Context context) throws SyntaxErrorException
{
final D parserData = this.descriptor.newParserData(parser);
if (parser.endReached() || parser.toParse.charAt(parser.getIndex()) != '[')
return this.descriptor.construct(parserData);
parser.incIndex(1);
ParsingUtilities.terminateCompletion(parser);
final IExParse<Void, D> kvPair = this.descriptor.getKVPair();
final Matcher m = parser.getMatcher(ParsingUtilities.listEndMatcher);
while (true)
{
kvPair.parse(parser, parserData);
if (!parser.findInc(m))
throw parser.SEE("No delimiter found while parsing selector ");
if ("]".equals(m.group(1)))
{
final ArgWrapper<?> ret = this.descriptor.construct(parserData);
if (parserData.label == null)
return parserData.finalize(ret);
return parserData.finalize(this.procLabelModifier(parser, parserData, ret));
}
if ("}".equals(m.group(1)))
throw parser.SEE("Unexpected '}' ");
}
}
private <T> ArgWrapper<T> procLabelModifier(final Parser parser, final D parserData, final ArgWrapper<T> ret) throws SyntaxErrorException
{
if (parserData.labelModifier == 0)
{
final LabelWrapper<?> label = new LabelWrapper<>(
parserData.labelType == null
? ret.type
: parserData.labelType, parserData.label);
parser.addLabel(parserData.label, label);
return ret.linkSetter(label.getLabelSetter(parser, ret.type, true));
}
final Setter<T> setter = parser.getLabelSetter(parserData.label, ret.type, parserData.labelModifier == '^');
return ret.linkSetter(setter);
}
public static final ITabCompletion bracketCompletion = new TabCompletion(Pattern.compile("\\A\\[?+\\z"), "[]", "[]")
{
@Override
public boolean complexFit()
{
return false;
}
@Override
public int getSkipOffset(final Matcher m, final CompletionData cData)
{
return 0;
}
@Override
public int getCursorOffset(final Matcher m, final CompletionData cData)
{
return -1;
};
@Override
public double weightOffset(final Matcher m, final CompletionData cData)
{
return 1.0;
}
@Override
public boolean fullMatch(final Matcher m, final CompletionData cData, final String replacement)
{
return false;
}
};
@Override
public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData)
{
TabCompletionData.addToSet(tcDataSet, startIndex, cData, bracketCompletion);
}
}