ParserContext class

Пакет: com.hypixel.hytale.server.core.command.system

Файл: com/hypixel/hytale/server/core/command/system/ParserContext.java

Поля (44)

МодификаторыТипИмя
final HashSet<String> SPECIAL_TOKENS
private boolean hasReachedFirstMultiArgSeparator
private int numTokensPerArgument
private int numTokensSinceLastSeparator
private int numberOfListItems
return
return
return
return
return
private final List<String> tokens
Matcher var1
Matcher var1
char var1
var1
int var1
ParserContext.PreOptionalListContext var1
String var11
boolean var12
StringBuilder var13
String var15
char var2
ObjectIterator var2
StringBuilder var2
boolean var3
var3
List var3
ParserContext.PreOptionalListContext var3
boolean var4
var4
var4
var4
var4
ObjectArrayList var4
boolean var5
var5
var5
boolean var6
var6
var6
boolean var7
var7
Matcher var8
Matcher var9

Методы (34)

МодификаторыВозвратСигнатура
public PreOptionalListContextpublic PreOptionalListContext()
public void addNewOptionalArgvoid addNewOptionalArg(String var1)
public ParserContext.PreOptionalListContext addTokenpublic ParserContext.PreOptionalListContext addToken(@Nonnull String var1, @Nonnull ParseResult var2)
public void appendOptionalParametervoid appendOptionalParameter(@Nonnull String var1, @Nonnull ParseResult var2)
private void contextualizeTokensvoid contextualizeTokens(@Nonnull List<String> var1, @Nonnull ParseResult var2)
public void convertToSubCommandvoid convertToSubCommand()
abstract for for(int var10 = 0; var10 < var1.size()
abstract for for(int var14 = 0; var14 < var1.size()
abstract for for(int var3 = 0; var3 < this.tokens.size()
public int getNumPreOptSingleValueTokensBeforeListTokensint getNumPreOptSingleValueTokensBeforeListTokens()
public int getNumPreOptionalTokensint getNumPreOptionalTokens()
public int getNumTokensPerArgumentpublic int getNumTokensPerArgument()
public int getNumberOfListItemspublic int getNumberOfListItems()
public ParserContext.PreOptionalListContext getPreOptionalListTokenParserContext.PreOptionalListContext getPreOptionalListToken(int var1)
public String getPreOptionalSingleValueTokenString getPreOptionalSingleValueToken(int var1)
private String getStringRepresentationprivate String getStringRepresentation(boolean var1)
public int getSubCommandIndexint getSubCommandIndex()
public String[] getTokenspublic String[] getTokens()
if if(var1 == '"' && var2 == '"' || var1 == '\'' && var2 == '\'')
if if(var4)
if if(var6 && !var12)
if if(var14 == var10)
if if(!var7)
if if(var4 && !var5)
if if(!this.hasReachedFirstMultiArgSeparator)
if if(this.numberOfListItems == 0)
if if(this.hasReachedFirstMultiArgSeparator && this.numTokensSinceLastSeparator > this.numTokensPerArgument)
if if(var1)
if if(this.numberOfListItems > 10)
public boolean isConfirmationSpecifiedboolean isConfirmationSpecified()
public boolean isHelpSpecifiedboolean isHelpSpecified()
public boolean isListTokenboolean isListToken(int var1)
static boolean isOptionalArgumentTokenboolean isOptionalArgumentToken(@Nonnull String var0)
public void verifyNumberOfListItemspublic void verifyNumberOfListItems(@Nonnull ParseResult var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.command.system;

class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import it.unimi.dsi.fastutil.booleans.BooleanArrayList;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectSortedSet;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.regex.Matcher;
class="kw">import java.util.regex.Pattern;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class ParserContext {
   class="kw">private class="kw">static class="kw">final HashSet<String> SPECIAL_TOKENS = new HashSet<>(
      List.of(Tokenizer.MULTI_ARG_BEGIN, Tokenizer.MULTI_ARG_END, Tokenizer.MULTI_ARG_SEPARATOR)
   );
   class="kw">private class="kw">static class="kw">final int MAX_LIST_ITEMS = 10;
   @Nonnull
   class="kw">private class="kw">final String inputString;
   @Nonnull
   class="kw">private class="kw">final String rawInput;
   @Nonnull
   class="kw">private class="kw">final BooleanArrayList parameterForwardingMap;
   @Nonnull
   class="kw">private class="kw">final Int2ObjectMap<String> preOptionalSingleValueTokens;
   @Nonnull
   class="kw">private class="kw">final Int2ObjectMap<ParserContext.PreOptionalListContext> preOptionalListTokens;
   @Nonnull
   class="kw">private class="kw">final Object2ObjectLinkedOpenHashMap<String, List<List<String>>> optionalArgs;
   class="kw">private String lastInsertedOptionalArgName;
   class="kw">private int numPreOptSingleValueTokensBeforeListTokens;
   class="kw">private int subCommandIndex;
   class="kw">private class="kw">static class="kw">final Pattern ARG_NAME_PATTERN = Pattern.compile("--([\\w-]*)");
   class="kw">private class="kw">static class="kw">final Pattern ARG_NAME_AND_VALUE_PATTERN = Pattern.compile("--([\\w-]+)=(.+)");

   class="kw">public ParserContext(@Nonnull List<String> var1, @Nonnull String var2, @Nonnull ParseResult var3) {
      this.inputString = String.join(" ", var1);
      this.rawInput = var2;
      this.parameterForwardingMap = new BooleanArrayList();
      this.preOptionalSingleValueTokens = new Int2ObjectOpenHashMap();
      this.preOptionalListTokens = new Int2ObjectOpenHashMap();
      this.optionalArgs = new Object2ObjectLinkedOpenHashMap();
      this.contextualizeTokens(var1, var3);
   }

   @Nonnull
   class="kw">public class="kw">static ParserContext of(@Nonnull List<String> var0, @Nonnull String var1, @Nonnull ParseResult var2) {
      class="kw">return new ParserContext(var0, var1, var2);
   }

   class="kw">public class="kw">static boolean isOptionalArgumentToken(@Nonnull String var0) {
      class="kw">return ARG_NAME_PATTERN.matcher(var0).lookingAt();
   }

   @Nullable
   class="kw">public class="kw">static String optionalArgumentName(@Nonnull String var0) {
      Matcher var1 = ARG_NAME_PATTERN.matcher(var0);
      class="kw">return var1.lookingAt() ? var1.group(1) : null;
   }

   @Nullable
   class="kw">public class="kw">static String optionalArgumentInlineValue(@Nonnull String var0) {
      Matcher var1 = ARG_NAME_AND_VALUE_PATTERN.matcher(var0);
      class="kw">return var1.matches() ? stripSurroundingQuotes(var1.group(2)) : null;
   }

   @Nonnull
   class="kw">private class="kw">static String stripSurroundingQuotes(@Nonnull String var0) {
      if (var0.length() >= 2) {
         char var1 = var0.charAt(0);
         char var2 = var0.charAt(var0.length() - 1);
         if (var1 == '"' && var2 == '"' || var1 == '\'' && var2 == '\'') {
            class="kw">return var0.substring(1, var0.length() - 1);
         }
      }

      class="kw">return var0;
   }

   class="kw">private void contextualizeTokens(@Nonnull List<String> var1, @Nonnull ParseResult var2) {
      boolean var3 = false;
      boolean var4 = false;
      boolean var5 = false;
      boolean var6 = false;
      boolean var7 = false;
      Matcher var8 = ARG_NAME_PATTERN.matcher("");
      Matcher var9 = ARG_NAME_AND_VALUE_PATTERN.matcher("");

      for (int var10 = 0; var10 < var1.size(); var10++) {
         String var11 = var1.get(var10);
         if (var4) {
            var7 = true;
         }

         if (SPECIAL_TOKENS.contains(var11)) {
            boolean var12 = var1.get(var10 - 1).equals(Tokenizer.MULTI_ARG_END) && !var4 && var11.equals(Tokenizer.MULTI_ARG_BEGIN);
            if (var6 && !var12) {
               StringBuilder var13 = new StringBuilder();

               for (int var14 = 0; var14 < var1.size(); var14++) {
                  var13.append(var1.get(var14)).append(" ");
                  if (var14 == var10) {
                     var13.append(" <--- *HERE!* ");
                  }
               }

               var2.fail(Message.translation("server.commands.parsing.error.cantDoublePlaceSpecialTokens"), Message.raw(var13.toString()));
               class="kw">return;
            }

            var6 = true;
         } else {
            var6 = false;
         }

         var8.reset(var11);
         if (var8.lookingAt()) {
            var3 = true;
            this.addNewOptionalArg(var8.group(1));
            var9.reset(var11);
            if (var9.matches()) {
               String var15 = stripSurroundingQuotes(var9.group(2));
               this.appendOptionalParameter(var15, var2);
               if (var2.failed()) {
                  class="kw">return;
               }
            }
         } else if (var3) {
            this.appendOptionalParameter(var11, var2);
            if (var2.failed()) {
               class="kw">return;
            }
         } else if (var11.equals(Tokenizer.MULTI_ARG_BEGIN)) {
            var4 = true;
            var5 = false;
            this.parameterForwardingMap.add(true);
            this.preOptionalListTokens.put(this.parameterForwardingMap.size() - 1, new ParserContext.PreOptionalListContext());
         } else if (var11.equals(Tokenizer.MULTI_ARG_END)) {
            var4 = false;
         } else if (var4) {
            ((ParserContext.PreOptionalListContext)this.preOptionalListTokens.get(this.parameterForwardingMap.size() - 1)).addToken(var11, var2);
            if (var2.failed()) {
               class="kw">return;
            }

            if (var5 && !var6 && var1.size() > var10 + 1 && !var1.get(var10 + 1).equals(Tokenizer.MULTI_ARG_SEPARATOR)) {
               var4 = false;
            }
         } else if (var1.size() > var10 + 1 && var1.get(var10 + 1).equals(Tokenizer.MULTI_ARG_SEPARATOR)) {
            var4 = true;
            var5 = true;
            this.parameterForwardingMap.add(true);
            this.preOptionalListTokens.put(this.parameterForwardingMap.size() - 1, new ParserContext.PreOptionalListContext().addToken(var11, var2));
            if (var2.failed()) {
               class="kw">return;
            }
         } else {
            if (!var7) {
               this.numPreOptSingleValueTokensBeforeListTokens++;
            }

            this.parameterForwardingMap.add(false);
            this.preOptionalSingleValueTokens.put(this.parameterForwardingMap.size() - 1, var11);
         }
      }

      if (var4 && !var5) {
         var2.fail(Message.translation("server.commands.parsing.error.endCommandWithOpenList").param("listEndToken", Tokenizer.MULTI_ARG_END));
      }
   }

   class="kw">public void addNewOptionalArg(String var1) {
      var1 = var1.toLowerCase(Locale.ROOT);
      this.lastInsertedOptionalArgName = var1;
      this.optionalArgs.put(var1, new ObjectArrayList());
   }

   class="kw">public void appendOptionalParameter(@Nonnull String var1, @Nonnull ParseResult var2) {
      if (!this.optionalArgs.isEmpty() && this.lastInsertedOptionalArgName != null) {
         List var3 = (List<List<String>>)this.optionalArgs.get(this.lastInsertedOptionalArgName);
         if (!var1.equals(Tokenizer.MULTI_ARG_BEGIN) && !var1.equals(Tokenizer.MULTI_ARG_END)) {
            if (var1.equals(Tokenizer.MULTI_ARG_SEPARATOR)) {
               var3.add(new ObjectArrayList());
            } else if (var3.isEmpty()) {
               ObjectArrayList var4 = new ObjectArrayList();
               var4.add(var1);
               var3.add(var4);
            } else {
               var3.getLast().add(var1);
            }
         }
      } else {
         var2.fail(Message.translation("server.commands.parsing.error.noOptionalParameterToAddValueTo"));
      }
   }

   @Nonnull
   class="kw">public String getInputString() {
      class="kw">return this.inputString;
   }

   @Nonnull
   class="kw">public String getRawInput() {
      class="kw">return this.rawInput;
   }

   class="kw">public int getSubCommandIndex() {
      class="kw">return this.subCommandIndex;
   }

   class="kw">public boolean isListToken(int var1) {
      var1 += this.subCommandIndex;
      class="kw">return this.parameterForwardingMap.size() <= var1 ? false : this.parameterForwardingMap.getBoolean(var1);
   }

   class="kw">public int getNumPreOptSingleValueTokensBeforeListTokens() {
      class="kw">return this.numPreOptSingleValueTokensBeforeListTokens - this.subCommandIndex;
   }

   class="kw">public int getNumPreOptionalTokens() {
      int var1 = 0;
      var1 += this.preOptionalSingleValueTokens.size();
      ObjectIterator var2 = this.preOptionalListTokens.values().iterator();

      while (var2.hasNext()) {
         ParserContext.PreOptionalListContext var3 = (ParserContext.PreOptionalListContext)var2.next();
         var1 += var3.numTokensPerArgument;
      }

      class="kw">return var1 - this.subCommandIndex;
   }

   class="kw">public String getPreOptionalSingleValueToken(int var1) {
      var1 += this.subCommandIndex;
      class="kw">return (String)this.preOptionalSingleValueTokens.get(var1);
   }

   class="kw">public ParserContext.PreOptionalListContext getPreOptionalListToken(int var1) {
      var1 += this.subCommandIndex;
      class="kw">return (ParserContext.PreOptionalListContext)this.preOptionalListTokens.get(var1);
   }

   @Nullable
   class="kw">public String getFirstToken() {
      if (this.parameterForwardingMap.size() <= this.subCommandIndex) {
         class="kw">return null;
      } else if (this.parameterForwardingMap.getBoolean(this.subCommandIndex)) {
         ParserContext.PreOptionalListContext var1 = (ParserContext.PreOptionalListContext)this.preOptionalListTokens.get(this.subCommandIndex);
         class="kw">return var1.tokens.isEmpty() ? null : var1.tokens.getFirst();
      } else {
         class="kw">return (String)this.preOptionalSingleValueTokens.get(this.subCommandIndex);
      }
   }

   @Nonnull
   class="kw">public ObjectSortedSet<Entry<String, List<List<String>>>> getOptionalArgs() {
      class="kw">return this.optionalArgs.entrySet();
   }

   class="kw">public boolean isHelpSpecified() {
      class="kw">return this.optionalArgs.containsKey("help") || this.optionalArgs.containsKey("?");
   }

   class="kw">public boolean isConfirmationSpecified() {
      class="kw">return this.optionalArgs.containsKey("confirm");
   }

   class="kw">public void convertToSubCommand() {
      this.subCommandIndex++;
   }

   class="kw">public class="kw">static class PreOptionalListContext {
      class="kw">private class="kw">final List<String> tokens = new ObjectArrayList();
      class="kw">private boolean hasReachedFirstMultiArgSeparator = false;
      class="kw">private int numTokensPerArgument = 0;
      class="kw">private int numTokensSinceLastSeparator = 0;
      class="kw">private int numberOfListItems = 0;

      class="kw">public PreOptionalListContext() {
      }

      @Nullable
      class="kw">public ParserContext.PreOptionalListContext addToken(@Nonnull String var1, @Nonnull ParseResult var2) {
         if (var1.equals(Tokenizer.MULTI_ARG_SEPARATOR)) {
            if (!this.hasReachedFirstMultiArgSeparator) {
               this.hasReachedFirstMultiArgSeparator = true;
               this.numTokensSinceLastSeparator = 0;
               this.numberOfListItems++;
               this.verifyNumberOfListItems(var2);
               class="kw">return this;
            } else if (this.numTokensSinceLastSeparator != this.numTokensPerArgument) {
               this.tokens.add(var1);
               var2.fail(
                  Message.translation("server.commands.parsing.error.allArgumentsInListNeedSameLength").param("error", this.getStringRepresentation(true))
               );
               class="kw">return null;
            } else {
               this.numTokensSinceLastSeparator = 0;
               this.numberOfListItems++;
               this.verifyNumberOfListItems(var2);
               class="kw">return this;
            }
         } else {
            this.numTokensSinceLastSeparator++;
            if (this.numberOfListItems == 0) {
               this.numTokensPerArgument++;
            }

            if (this.hasReachedFirstMultiArgSeparator && this.numTokensSinceLastSeparator > this.numTokensPerArgument) {
               this.tokens.add(var1);
               var2.fail(
                  Message.translation("server.commands.parsing.error.allArgumentsInListNeedSameLength").param("error", this.getStringRepresentation(true))
               );
               class="kw">return null;
            } else {
               this.tokens.add(var1);
               class="kw">return this;
            }
         }
      }

      @Nonnull
      class="kw">private String getStringRepresentation(boolean var1) {
         StringBuilder var2 = new StringBuilder(Tokenizer.MULTI_ARG_BEGIN);

         for (int var3 = 0; var3 < this.tokens.size(); var3++) {
            if (var3 != 0 && var3 % this.numTokensPerArgument == 0 && var3 != this.tokens.size() - 1) {
               var2.append(" ").append(Tokenizer.MULTI_ARG_SEPARATOR);
            }

            var2.append(" ").append(this.tokens.get(var3));
         }

         if (var1) {
            var2.append("<-- *HERE* ... ]");
         } else {
            var2.append(" ]");
         }

         class="kw">return var2.toString();
      }

      class="kw">public void verifyNumberOfListItems(@Nonnull ParseResult var1) {
         if (this.numberOfListItems > 10) {
            var1.fail(Message.translation("server.commands.parsing.error.tooManyListItems").param("amount", 10));
         }
      }

      @Nonnull
      class="kw">public String[] getTokens() {
         class="kw">return this.tokens.toArray(String[]::new);
      }

      class="kw">public int getNumTokensPerArgument() {
         class="kw">return this.numTokensPerArgument;
      }

      class="kw">public int getNumberOfListItems() {
         class="kw">return this.numberOfListItems;
      }
   }
}