49class CommandRegistry {
77 using ParseFunction = bool (::CommandRegistry::*)(
83 ::std::vector<::std::string>&
86 enum class HardNonTerminal :
int {
92 WildcardInt = 1048581,
94 CompareOperator = 1048583,
96 StandaloneSelection = 1048585,
97 WildcardSelection = 1048586,
98 NonIdSelector = 1048587,
100 ScoresArgs = 1048589,
101 ScoreSelectParam = 1048590,
102 ScoreSelector = 1048591,
103 TagSelector = 1048592,
105 FilePathVal = 1048594,
106 FilePathCont = 1048595,
107 IntegerRangeVal = 1048596,
108 IntegerRangePostVal = 1048597,
109 IntegerRange = 1048598,
110 FullIntegerRange = 1048599,
111 RationalRangeVal = 1048600,
112 RationalRangePostVal = 1048601,
113 RationalRange = 1048602,
114 FullRationalRange = 1048603,
123 HasPermissionArg = 1048612,
124 HasPermissionArgs = 1048613,
125 HasPermissionSelector = 1048614,
126 HasPermissionElement = 1048615,
127 HasPermissionElements = 1048616,
129 HasItemElement = 1048618,
130 HasItemElements = 1048619,
131 HasItemArg = 1048620,
132 HasItemArgs = 1048621,
133 HasItemSelector = 1048622,
134 EquipmentSlotEnum = 1048623,
135 PropertyValue = 1048624,
136 HasPropertyParamValue = 1048625,
137 HasPropertyParamEnumValue = 1048626,
138 HasPropertyArg = 1048627,
139 HasPropertyArgs = 1048628,
140 HasPropertyElement = 1048629,
141 HasPropertyElements = 1048630,
142 HasPropertySelector = 1048631,
148 CoordXFloat = 1048637,
149 CoordYFloat = 1048638,
150 CoordZFloat = 1048639,
152 PositionFloat = 1048641,
153 MessageExp = 1048642,
155 MessageRoot = 1048644,
156 PostSelector = 1048645,
158 RawTextCont = 1048647,
161 JsonObject = 1048650,
162 JsonObjectFields = 1048651,
163 JsonObjectCont = 1048652,
165 JsonArrayValues = 1048654,
166 JsonArrayCont = 1048655,
168 BlockStateKey = 1048657,
169 BlockStateValue = 1048658,
170 BlockStateValues = 1048659,
171 BlockStateArray = 1048660,
172 BlockStateArrayCont = 1048661,
173 ClockTimeMarkerName = 1048662,
175 SlashCommand = 1048664,
176 CodeBuilderArg = 1048665,
177 CodeBuilderArgs = 1048666,
178 CodeBuilderSelectParam = 1048667,
179 CodeBuilderSelector = 1048668,
186 ::ll::TypedStorage<4, 4, uint> signatureCount;
187 ::ll::TypedStorage<4, 4, uint> enumValueCount;
188 ::ll::TypedStorage<4, 4, uint> postfixCount;
189 ::ll::TypedStorage<4, 4, uint> enumCount;
190 ::ll::TypedStorage<4, 4, uint> enumLookupCount;
191 ::ll::TypedStorage<4, 4, uint> typeLookupCount;
192 ::ll::TypedStorage<4, 4, uint> factorizationCount;
193 ::ll::TypedStorage<4, 4, uint> optionalCount;
194 ::ll::TypedStorage<4, 4, uint> ruleCount;
195 ::ll::TypedStorage<4, 4, uint> softEnumCount;
196 ::ll::TypedStorage<4, 4, uint> constraintCount;
197 ::ll::TypedStorage<4, 4, uint> chainedSubcommandCount;
198 ::ll::TypedStorage<4, 4, uint> chainedSubcommandValueCount;
199 ::ll::TypedStorage<8, 24, ::std::vector<uint>> enumValuesCount;
200 ::ll::TypedStorage<8, 24, ::std::vector<uint>> constrainedValueCount;
201 ::ll::TypedStorage<8, 24, ::std::vector<uint>> softEnumValuesCount;
222 ::std::vector<::std::string> mValues;
232 MCAPI SoftEnum(::std::string
const& name, ::std::vector<::std::string> values);
238 MCAPI
void* $ctor(::std::string
const& name, ::std::vector<::std::string> values);
246 static int const NonTerminalBit = 0x100000;
247 static int const EnumBit = 0x200000;
248 static int const OptionalBit = 0x400000;
249 static int const FactorizationBit = 0x800000;
250 static int const PostfixBit = 0x1000000;
251 static int const EnumValueBit = 0x2000000;
252 static int const SoftEnumBit = 0x4000000;
256 Symbol(
int val) : mValue(val) {}
259 Symbol(Symbol
const& other) : mValue(other.mValue) {}
261 Symbol(HardNonTerminal data) : mValue(
static_cast<int>(data)) {}
263 Symbol(CommandLexer::TokenType data) : mValue(
static_cast<int>(data)) {}
265 Symbol& operator=(Symbol
const& other) {
266 mValue = other.mValue;
270 [[nodiscard]]
inline bool operator==(Symbol
const& other)
const {
return mValue == other.mValue; }
272 uint64 toIndex()
const {
return mValue & 0xffffffffe00fffffull; }
279 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> mValue;
280 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> mEnum;
281 ::ll::TypedStorage<8, 24, ::std::vector<uchar>> mConstraints;
289 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> commandSymbol;
293 struct LexicalToken {
301 ::CommandRegistry
const& mRegistry;
306 LexicalToken& operator=(LexicalToken
const&);
307 LexicalToken(LexicalToken
const&);
321 ::ll::TypedStorage<4, 4, int> parameterCount;
322 ::ll::TypedStorage<4, 4, int> followingRuleIndex;
323 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> paramSymbol;
337 ::std::vector<::CommandParameterData> params;
340 ::std::vector<::CommandRegistry::Symbol> paramsSymbol;
348 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> x;
349 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> y;
350 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> z;
351 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dx;
352 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dy;
353 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dz;
354 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> r;
355 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rm;
356 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rx;
357 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rxm;
358 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> ry;
359 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rym;
360 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> l;
361 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> lm;
362 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> c;
363 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> m;
364 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> name;
365 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> type;
366 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> family;
367 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> score;
368 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> tag;
369 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> hasitem;
370 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> haspermission;
371 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> hasproperty;
372 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> codebuilder;
380 ::std::unique_ptr<::CommandRegistry::ParseToken> child;
381 ::std::unique_ptr<::CommandRegistry::ParseToken> next;
391 MCAPI ::std::string toString()
const;
410 ::std::vector<::std::pair<uint64, uint>> values;
421 ::std::vector<::std::pair<uint64, uint64>> values;
432 bool (CommandRegistry::*)(
438 ::std::vector<::std::string>&
441 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> symbol;
449 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> nonTerminal;
455 ::ll::TypedStorage<8, 24, ::std::vector<::CommandRegistry::Symbol>> derivation;
456 ::ll::TypedStorage<4, 8, ::CommandVersion> versions;
461 ParseRule& operator=(ParseRule
const&);
462 ParseRule(ParseRule
const&);
476 ::ll::TypedStorage<1, 1, bool> mIsValid;
477 ::ll::TypedStorage<8, 24, ::std::vector<::CommandRegistry::Symbol>> mConstrainedParams;
478 ::ll::TypedStorage<8, 32, ::std::string> mSoftEnumText;
479 ::ll::TypedStorage<8, 32, ::std::string> mSoftEnumEscapeCharExceptions;
480 ::ll::TypedStorage<8, 16, ::std::set<::CommandRegistry::Symbol>> mAlreadyCompletedSymbols;
489 ::std::string description;
490 ::std::vector<::CommandRegistry::Overload> overloads;
491 ::std::vector<uint> chainedSubcommandIndexes;
492 ::CommandPermissionLevel permissionLevel;
497 int firstFactorization;
526 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>
531 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>
535 ::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::Symbol>,
538 ::std::equal_to<void>>
540 ::std::chrono::nanoseconds buildDuration;
548 ::ll::TypedStorage<8, 8, ::CommandRegistry const&> mRegistry;
549 ::ll::TypedStorage<8, 8, ::CommandRegistry::ParseTable const*> mParseTable;
550 ::ll::TypedStorage<8, 40, ::std::deque<::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::ParseToken*>>>
552 ::ll::TypedStorage<8, 32, ::CommandRegistry::LexicalToken> mNext;
553 ::ll::TypedStorage<8, 32, ::std::string> mInput;
554 ::ll::TypedStorage<8, 8, ::std::unique_ptr<::CommandRegistry::ParseToken>> mRoot;
555 ::ll::TypedStorage<8, 32, ::std::string> mError;
556 ::ll::TypedStorage<8, 24, ::std::vector<::std::string>> mErrorParams;
557 ::ll::TypedStorage<4, 4, int> mVersion;
558 ::ll::TypedStorage<1, 1, bool> mGenerateParams;
559 ::ll::TypedStorage<1, 1, bool> mBreakAtEnd;
564 Parser& operator=(Parser
const&);
565 Parser(Parser
const&);
571 MCAPI Parser(::CommandRegistry
const& registry,
int version);
573 MCAPI
bool _parse(::std::string
const& in);
575 MCAPI ::std::unique_ptr<::CommandSelector<::Actor>>
576 createSelector(::std::string
const& selectorString,
::CommandOrigin const& origin);
578 MCAPI ::std::vector<::std::string> getErrorParams()
const;
580 MCAPI
bool parseCommand(::std::string
const& in);
582 MCAPI
bool parseSelector(::std::string
const& in);
590 MCAPI
void* $ctor(::CommandRegistry
const& registry,
int version);
600 using ChainedSubcommandConversionFunction = ::std::function<void(
void*, uint64)>;
602 using ChainedSubcommandID = uint;
604 using ChainedSubcommandValueID = uint64;
606 using CommandOverrideFunctor =
607 ::std::function<void(::std::string
const&,
::CommandFlag&, ::CommandPermissionLevel&)>;
611 using ConstrainedValueID = uint;
613 using ConstrainedValueLookupKey = ::std::pair<uint64, uint>;
615 using CustomStorageGetFn =
void* (*)(
::Command*,
int);
617 using CustomStorageIsSetFn =
bool* (*)(
::Command*,
int);
619 using EnumConversionFunction = ::std::function<void(
void*, uint64)>;
623 using EnumValueID = uint64;
625 using HardTerminal = ::CommandLexer::TokenType;
627 using ParamVisitCallback = ::std::function<
630 using ParseMap = ::std::map<
632 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>;
634 using ParseTableMap = ::std::map<uint, ::CommandRegistry::ParseTable>;
636 using PredictTable = ::entt::dense_map<
637 ::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::Symbol>,
640 ::std::equal_to<void>>;
642 using ProcessFunction =
645 using RuleIndex = int;
647 using ScoreboardScoreAccessor = ::std::function<int(
bool&, ::std::string
const&,
::Actor const&)>;
649 using SemanticConstraintID = uchar;
651 using SoftEnumID = uint;
656 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>;
658 using SymbolVector = ::std::vector<::CommandRegistry::Symbol>;
662 using ValueTypeID = uint64;
667 ::std::function<void(
::Packet const&)> mNetworkUpdateCallback;
668 ScoreboardScoreAccessor mGetScoreForObjective;
670 ::std::vector<::CommandRegistry::ParseRule> mRules;
671 ::std::map<uint, ::CommandRegistry::ParseTable> mParseTables;
672 ::std::vector<::CommandRegistry::OptionalParameterChain> mOptionals;
673 ::std::vector<::std::string> mEnumValues;
674 ::std::vector<::CommandRegistry::Enum> mEnums;
675 ::std::vector<::std::string> mChainedSubcommandValues;
676 ::std::vector<::CommandRegistry::ChainedSubcommand> mChainedSubcommands;
677 ::std::vector<::CommandRegistry::Factorization> mFactorizations;
678 ::std::vector<::std::string> mPostfixes;
679 ::std::map<::std::string, uint> mEnumLookup;
680 ::std::map<::std::string, uint64> mEnumValueLookup;
681 ::std::map<::std::string, uint> mChainedSubcommandLookup;
682 ::std::map<::std::string, uint64> mChainedSubcommandValueLookup;
683 ::std::vector<::CommandRegistry::Symbol> mCommandSymbols;
684 ::std::map<::std::string, ::CommandRegistry::Signature> mSignatures;
685 ::std::map<::Bedrock::typeid_t<::CommandRegistry>,
int> mTypeLookup;
686 ::std::map<::std::string, ::std::string> mAliases;
687 ::std::vector<::SemanticConstraint> mSemanticConstraints;
688 ::std::map<::SemanticConstraint, uchar> mSemanticConstraintLookup;
689 ::std::vector<::CommandRegistry::ConstrainedValue> mConstrainedValues;
690 ::std::map<::std::pair<uint64, uint>, uint> mConstrainedValueLookup;
691 ::std::vector<::CommandRegistry::SoftEnum> mSoftEnums;
692 ::std::map<::std::string, uint> mSoftEnumLookup;
693 ::std::vector<::CommandRegistry::RegistryState> mStateStack;
695 ::std::unordered_set<int> mSkipOnEpsAutocompleteSymbols;
696 ::std::unordered_set<int> mAllowEmptySymbols;
697 CommandOverrideFunctor mCommandOverrideFunctor;
698 ::std::unique_ptr<::CommandRunStats> mCommandRunStats;
703 ::std::string
const&,
704 ::std::unordered_map<::mce::UUID, ::PlayerListEntry>
const&,
707 mAutoCompletePlayerMention;
717 std::vector<std::string>& errorParams
720 template <
class E,
class C>
727 std::vector<std::string>& errorParams
730 uint64 getEnumData(
ParseToken const& token)
const {
731 auto& values = mEnums[token.type.toIndex()].values;
732 return std::lower_bound(
735 token.child->type.toIndex(),
736 [](
auto& pair,
auto& child) { return pair.first < child; }
754 MCAPI ::CommandRegistry::Symbol _addChainedSubcommandValuesInternal(
755 ::std::string
const& name,
756 ::std::vector<::std::pair<::std::string, uint>>
const& strings,
758 bool (CommandRegistry::*parse)(
764 ::std::vector<::std::string>&
770 MCAPI ::CommandRegistry::Symbol _addChainedSubcommandValuesInternal(
771 ::std::string
const& name,
772 ::std::vector<::std::pair<uint64, uint>>
const& values,
774 bool (::CommandRegistry::*parse)(
780 ::std::vector<::std::string>&
786 MCAPI ::CommandRegistry::Symbol _addEnumValuesInternal(
787 ::std::string
const& name,
788 ::std::vector<::std::pair<::std::string, uint64>>
const& strings,
790 bool (CommandRegistry::*parse)(
796 ::std::vector<::std::string>&
800 MCAPI ::CommandRegistry::Symbol _addEnumValuesInternal(
801 ::std::string
const& name,
802 ::std::vector<::std::pair<uint64, uint64>>
const& values,
804 bool (::CommandRegistry::*parse)(
810 ::std::vector<::std::string>&
814 MCAPI ::std::unique_ptr<::CommandSelector<::Actor>> _createSelector(
818 ::std::string& error,
819 ::std::vector<::std::string>& errorParams
826 MCAPI
bool _matchesEnumConstraintsSet(
830 ::SemanticConstraint requiredConstraints
834 MCAPI
void addChainedSubcommandValuesToExisting(uint index, ::std::vector<::std::pair<uint64, uint>>
const& values);
837 MCAPI
void addEnumValueConstraints(
838 ::std::string
const& enumName,
839 ::std::vector<::std::string>
const& values,
840 ::SemanticConstraint constraints
843 MCAPI
int addEnumValues(::std::string
const& name, ::std::vector<::std::string>
const& values);
845 MCAPI
void addEnumValuesToExisting(uint index, ::std::vector<::std::pair<uint64, uint64>>
const& values);
848 MCAPI ::CommandRegistry::Symbol addPostfix(::std::string
const& name);
853 ::std::vector<::CommandRegistry::Symbol> derivation,
859 MCAPI
void addSemanticConstraint(::SemanticConstraint constraintType);
861 MCAPI
int addSoftEnum(::std::string
const& name, ::std::vector<::std::string> values);
863 MCAPI
void addSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
865 MCAPI ::CommandRegistry::Symbol addSoftTerminal(::std::string
const& name);
868 MCAPI
void autoComplete(
870 ::std::string
const& cmdLine,
871 ::std::string
const& partialMatch,
878 MCAPI
void autoCompleteCommand(
879 ::std::string
const& partialMatch,
887 MCAPI
void buildFollowSet(
891 ::std::set<::CommandRegistry::Symbol>& workingSet
894 MCAPI ::CommandRegistry::Symbol buildRules(
896 ::std::vector<::gsl::not_null<::CommandRegistry::Overload*>>
const& overloads,
904 MCAPI
bool canCommandBeUsed(
905 ::std::string
const& commandLine,
906 ::CommandPermissionLevel
const& permissionLevel,
912 MCAPI ::std::unique_ptr<::Command> createCommand(
916 ::std::string& error,
917 ::std::vector<::std::string>& errorParams
923 MCAPI ::std::string describe(
925 ::std::string
const& alias,
933 MCAPI
void finalizeChainedSubcommandOverloadRules(
char const* command);
935 MCFOLD ::CommandRegistry::Signature
const* findCommand(::std::string
const& name)
const;
937 MCFOLD ::CommandRegistry::Signature* findCommand(::std::string
const& name);
939 MCAPI
void fireCommandParseTableTelemetry(
::IMinecraftEventing const& eventing,
bool isServer)
const;
943 MCAPI ::Json::Value generateDocumentationMetadata(
bool generateInternalMetadata)
const;
945 MCAPI ::std::vector<::std::string> getAliases(::std::string
const& command)
const;
947 MCAPI ::std::vector<::std::string> getAlphabeticalLookup(
::CommandOrigin const& origin)
const;
950 MCAPI ::std::unique_ptr<::AutoCompleteInformation> getAutoCompleteOptions(
952 ::std::string
const& _cmdLine,
953 uint cursorPositionUnsafe
957 MCAPI ::std::string getCommandName(::std::string
const& commandLine)
const;
959 MCAPI ::CommandSyntaxInformation
960 getCommandOverloadSyntaxInformation(
::CommandOrigin const& origin, ::std::string
const& commandName)
const;
965 MCAPI ::CommandSyntaxInformation getOverloadSyntaxInformation(
967 ::std::string
const& cmdLine,
971 MCAPI
bool isCommandOfType(::std::string
const& nameIn, ::CommandTypeFlag commandType)
const;
985 MCAPI ::std::string parsePartialCommand(
987 ::std::string
const& _cmdLine,
993 MCAPI
bool parseSelector(
998 ::std::string& error,
999 ::std::vector<::std::string>& errorParams
1002 MCAPI
bool parseSelector(
1007 ::std::string& error,
1008 ::std::vector<::std::string>& errorParams,
1013 MCAPI
void popState();
1015 MCAPI
void pushState();
1018 MCAPI
void registerAlias(::std::string name, ::std::string alias);
1020 MCAPI
void registerCommand(
1021 ::std::string
const& name,
1022 char const* description,
1023 ::CommandPermissionLevel requirement,
1028 MCAPI
void registerOverload(
1029 char const* command,
1031 ::std::function<::std::unique_ptr<::Command>()> allocFn,
1032 ::std::vector<::CommandParameterData> params
1037 MCAPI
void removeSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
1039 MCAPI ::AvailableCommandsPacket serializeAvailableCommands()
const;
1041 MCAPI
void setCommandRegistrationOverride(CommandOverrideFunctor functor);
1043 MCAPI
void setScoreCallback(::std::function<
int(
bool&, ::std::string
const&,
::Actor const&)> callback);
1045 MCAPI
void setSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
1062 MCAPI static ::BlockType
const* _getBlockFromCmdParameters(::std::string
const& parameters);
1065 MCAPI static ::std::string _removeStringQuotes(::std::string
const& str);
1067 MCFOLD static ::CommandRegistry::ParseToken*
1070 MCAPI static ::CommandRegistry::ParseToken* collapseOn(
1076 MCAPI static ::CommandRegistry::ParseToken*
1079 MCAPI static ::CommandRegistry::ParseToken* expandExcept(
1085 MCAPI static ::CommandRegistry::ParseToken* fold(
1091 MCAPI static ::CommandRegistry::ParseToken*
1094 MCAPI
static bool readFloat(
1097 ::std::string& error,
1098 ::std::vector<::std::string>& errorParams
1101 MCAPI
static bool readInt(
1104 ::std::string& error,
1105 ::std::vector<::std::string>& errorParams
1108 MCAPI
static bool readRelativeCoordinate(
1112 bool readIntegerAsCentered,
1113 ::std::string& error,
1114 ::std::vector<::std::string>& errorParams
1117 MCAPI
static bool readString(
1118 ::std::string& value,
1120 ::std::string& error,
1121 ::std::vector<::std::string>& errorParams
1128 MCAPI
static char const*& COMMAND_NAME_ENUM_NAME();
1130 MCAPI
static char const*& TAG_VALUES_SOFTENUM_NAME();
1132 MCAPI
static char const*& UNLOCKABLE_RECIPES_SOFTENUM_NAME();