51class CommandRegistry {
79 using ParseFunction = bool (::CommandRegistry::*)(
85 ::std::vector<::std::string>&
88 enum class HardNonTerminal :
int {
94 WildcardInt = 1048581,
96 CompareOperator = 1048583,
98 StandaloneSelection = 1048585,
99 WildcardSelection = 1048586,
100 NonIdSelector = 1048587,
102 ScoresArgs = 1048589,
103 ScoreSelectParam = 1048590,
104 ScoreSelector = 1048591,
105 TagSelector = 1048592,
107 FilePathVal = 1048594,
108 FilePathCont = 1048595,
109 IntegerRangeVal = 1048596,
110 IntegerRangePostVal = 1048597,
111 IntegerRange = 1048598,
112 FullIntegerRange = 1048599,
113 RationalRangeVal = 1048600,
114 RationalRangePostVal = 1048601,
115 RationalRange = 1048602,
116 FullRationalRange = 1048603,
125 HasPermissionArg = 1048612,
126 HasPermissionArgs = 1048613,
127 HasPermissionSelector = 1048614,
128 HasPermissionElement = 1048615,
129 HasPermissionElements = 1048616,
131 HasItemElement = 1048618,
132 HasItemElements = 1048619,
133 HasItemArg = 1048620,
134 HasItemArgs = 1048621,
135 HasItemSelector = 1048622,
136 EquipmentSlotEnum = 1048623,
137 PropertyValue = 1048624,
138 HasPropertyParamValue = 1048625,
139 HasPropertyParamEnumValue = 1048626,
140 HasPropertyArg = 1048627,
141 HasPropertyArgs = 1048628,
142 HasPropertyElement = 1048629,
143 HasPropertyElements = 1048630,
144 HasPropertySelector = 1048631,
150 CoordXFloat = 1048637,
151 CoordYFloat = 1048638,
152 CoordZFloat = 1048639,
154 PositionFloat = 1048641,
155 MessageExp = 1048642,
157 MessageRoot = 1048644,
158 PostSelector = 1048645,
160 RawTextCont = 1048647,
163 JsonObject = 1048650,
164 JsonObjectFields = 1048651,
165 JsonObjectCont = 1048652,
167 JsonArrayValues = 1048654,
168 JsonArrayCont = 1048655,
170 BlockStateKey = 1048657,
171 BlockStateValue = 1048658,
172 BlockStateValues = 1048659,
173 BlockStateArray = 1048660,
174 BlockStateArrayCont = 1048661,
175 ClockTimeMarkerName = 1048662,
179 SlashCommand = 1048666,
180 CodeBuilderArg = 1048667,
181 CodeBuilderArgs = 1048668,
182 CodeBuilderSelectParam = 1048669,
183 CodeBuilderSelector = 1048670,
190 ::ll::TypedStorage<4, 4, uint> signatureCount;
191 ::ll::TypedStorage<4, 4, uint> enumValueCount;
192 ::ll::TypedStorage<4, 4, uint> postfixCount;
193 ::ll::TypedStorage<4, 4, uint> enumCount;
194 ::ll::TypedStorage<4, 4, uint> enumLookupCount;
195 ::ll::TypedStorage<4, 4, uint> typeLookupCount;
196 ::ll::TypedStorage<4, 4, uint> factorizationCount;
197 ::ll::TypedStorage<4, 4, uint> optionalCount;
198 ::ll::TypedStorage<4, 4, uint> ruleCount;
199 ::ll::TypedStorage<4, 4, uint> softEnumCount;
200 ::ll::TypedStorage<4, 4, uint> constraintCount;
201 ::ll::TypedStorage<4, 4, uint> chainedSubcommandCount;
202 ::ll::TypedStorage<4, 4, uint> chainedSubcommandValueCount;
203 ::ll::TypedStorage<8, 24, ::std::vector<uint>> enumValuesCount;
204 ::ll::TypedStorage<8, 24, ::std::vector<uint>> constrainedValueCount;
205 ::ll::TypedStorage<8, 24, ::std::vector<uint>> softEnumValuesCount;
226 ::std::vector<::std::string> mValues;
236 MCNAPI
SoftEnum(::std::string
const& name, ::std::vector<::std::string> values);
242 MCNAPI
void*
$ctor(::std::string
const& name, ::std::vector<::std::string> values);
250 static int const NonTerminalBit = 0x100000;
251 static int const EnumBit = 0x200000;
252 static int const OptionalBit = 0x400000;
253 static int const FactorizationBit = 0x800000;
254 static int const PostfixBit = 0x1000000;
255 static int const EnumValueBit = 0x2000000;
256 static int const SoftEnumBit = 0x4000000;
260 Symbol(
int val) : mValue(val) {}
263 Symbol(Symbol
const& other) : mValue(other.mValue) {}
265 Symbol(HardNonTerminal data) : mValue(
static_cast<int>(data)) {}
267 Symbol(CommandLexer::TokenType data) : mValue(
static_cast<int>(data)) {}
269 Symbol& operator=(Symbol
const& other) {
270 mValue = other.mValue;
274 [[nodiscard]]
inline bool operator==(Symbol
const& other)
const {
return mValue == other.mValue; }
276 uint64 toIndex()
const {
return mValue & 0xffffffffe00fffffull; }
283 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> mValue;
284 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> mEnum;
285 ::ll::TypedStorage<8, 24, ::std::vector<uchar>> mConstraints;
293 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> commandSymbol;
297 struct LexicalToken {
305 ::CommandRegistry
const& mRegistry;
310 LexicalToken& operator=(LexicalToken
const&);
311 LexicalToken(LexicalToken
const&);
325 ::ll::TypedStorage<4, 4, int> parameterCount;
326 ::ll::TypedStorage<4, 4, int> followingRuleIndex;
327 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> paramSymbol;
341 ::std::vector<::CommandParameterData> params;
344 ::std::vector<::CommandRegistry::Symbol> paramsSymbol;
352 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> x;
353 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> y;
354 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> z;
355 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dx;
356 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dy;
357 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dz;
358 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> r;
359 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rm;
360 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rx;
361 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rxm;
362 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> ry;
363 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rym;
364 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> l;
365 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> lm;
366 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> c;
367 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> m;
368 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> name;
369 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> type;
370 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> family;
371 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> score;
372 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> tag;
373 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> hasitem;
374 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> haspermission;
375 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> hasproperty;
376 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> codebuilder;
384 ::std::unique_ptr<::CommandRegistry::ParseToken> child;
385 ::std::unique_ptr<::CommandRegistry::ParseToken> next;
395 MCAPI ::std::string toString()
const;
414 ::std::vector<::std::pair<uint64, uint>> values;
425 ::std::vector<::std::pair<uint64, uint64>> values;
436 bool (CommandRegistry::*)(
442 ::std::vector<::std::string>&
445 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> symbol;
453 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> nonTerminal;
459 ::ll::TypedStorage<8, 24, ::std::vector<::CommandRegistry::Symbol>> derivation;
460 ::ll::TypedStorage<4, 8, ::CommandVersion> versions;
465 ParseRule& operator=(ParseRule
const&);
466 ParseRule(ParseRule
const&);
480 ::ll::TypedStorage<1, 1, bool> mIsValid;
481 ::ll::TypedStorage<8, 24, ::std::vector<::CommandRegistry::Symbol>> mConstrainedParams;
482 ::ll::TypedStorage<8, 32, ::std::string> mSoftEnumText;
483 ::ll::TypedStorage<8, 32, ::std::string> mSoftEnumEscapeCharExceptions;
484 ::ll::TypedStorage<8, 16, ::std::set<::CommandRegistry::Symbol>> mAlreadyCompletedSymbols;
493 ::std::string description;
494 ::std::vector<::CommandRegistry::Overload> overloads;
495 ::std::vector<uint> chainedSubcommandIndexes;
496 ::CommandPermissionLevel permissionLevel;
501 int firstFactorization;
530 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>
535 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>
538 ::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::Symbol>,
541 ::std::equal_to<void>>
543 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>
545 ::std::chrono::nanoseconds buildDuration;
553 ::ll::TypedStorage<8, 8, ::CommandRegistry const&> mRegistry;
554 ::ll::TypedStorage<8, 8, ::CommandRegistry::ParseTable const*> mParseTable;
555 ::ll::TypedStorage<8, 40, ::std::deque<::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::ParseToken*>>>
557 ::ll::TypedStorage<8, 32, ::CommandRegistry::LexicalToken> mNext;
558 ::ll::TypedStorage<8, 32, ::std::string> mInput;
559 ::ll::TypedStorage<8, 8, ::std::unique_ptr<::CommandRegistry::ParseToken>> mRoot;
560 ::ll::TypedStorage<8, 32, ::std::string> mError;
561 ::ll::TypedStorage<8, 24, ::std::vector<::std::string>> mErrorParams;
562 ::ll::TypedStorage<4, 4, int> mVersion;
563 ::ll::TypedStorage<1, 1, bool> mGenerateParams;
564 ::ll::TypedStorage<1, 1, bool> mBreakAtEnd;
569 Parser& operator=(Parser
const&);
570 Parser(Parser
const&);
576 MCAPI Parser(::CommandRegistry
const& registry,
int version);
578 MCNAPI
bool _parse(::std::string
const& in);
580 MCNAPI ::std::unique_ptr<::CommandSelector<::Actor>>
585 MCAPI
bool parseCommand(::std::string
const& in);
595 MCAPI
void* $ctor(::CommandRegistry
const& registry,
int version);
605 using ChainedSubcommandConversionFunction = ::std::function<void(
void*, uint64)>;
607 using ChainedSubcommandID = uint;
609 using ChainedSubcommandValueID = uint64;
611 using CommandOverrideFunctor =
612 ::std::function<void(::std::string
const&,
::CommandFlag&, ::CommandPermissionLevel&)>;
616 using ConstrainedValueID = uint;
618 using ConstrainedValueLookupKey = ::std::pair<uint64, uint>;
620 using CustomStorageGetFn =
void* (*)(
::Command*,
int);
622 using CustomStorageIsSetFn =
bool* (*)(
::Command*,
int);
624 using EnumConversionFunction = ::std::function<void(
void*, uint64)>;
628 using EnumValueID = uint64;
630 using HardTerminal = ::CommandLexer::TokenType;
632 using ParamVisitCallback = ::std::function<
635 using ParseMap = ::std::map<
637 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>;
639 using ParseTableMap = ::std::map<uint, ::CommandRegistry::ParseTable>;
641 using PredictTable = ::entt::dense_map<
642 ::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::Symbol>,
645 ::std::equal_to<void>>;
647 using ProcessFunction =
650 using RuleIndex = int;
652 using ScoreboardScoreAccessor = ::std::function<int(
bool&, ::std::string
const&,
::Actor const&)>;
654 using SemanticConstraintID = uchar;
656 using SoftEnumID = uint;
661 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>;
663 using SymbolVector = ::std::vector<::CommandRegistry::Symbol>;
667 using ValueTypeID = uint64;
672 ::std::function<void(
::Packet const&)> mNetworkUpdateCallback;
673 ScoreboardScoreAccessor mGetScoreForObjective;
675 bool mIsCodeBuilderEnabled;
676 ::std::vector<::CommandRegistry::ParseRule> mRules;
677 ::std::map<uint, ::CommandRegistry::ParseTable> mParseTables;
678 ::std::vector<::CommandRegistry::OptionalParameterChain> mOptionals;
679 ::std::vector<::std::string> mEnumValues;
680 ::std::vector<::CommandRegistry::Enum> mEnums;
681 ::std::vector<::std::string> mChainedSubcommandValues;
682 ::std::vector<::CommandRegistry::ChainedSubcommand> mChainedSubcommands;
683 ::std::vector<::CommandRegistry::Factorization> mFactorizations;
684 ::std::vector<::std::string> mPostfixes;
685 ::std::map<::std::string, uint> mEnumLookup;
686 ::std::map<::std::string, uint64> mEnumValueLookup;
687 ::std::map<::std::string, uint> mChainedSubcommandLookup;
688 ::std::map<::std::string, uint64> mChainedSubcommandValueLookup;
689 ::std::vector<::CommandRegistry::Symbol> mCommandSymbols;
690 ::std::map<::std::string, ::CommandRegistry::Signature> mSignatures;
691 ::std::map<::Bedrock::typeid_t<::CommandRegistry>,
int> mTypeLookup;
692 ::std::map<::std::string, ::std::string> mAliases;
693 ::std::vector<::SemanticConstraint> mSemanticConstraints;
694 ::std::map<::SemanticConstraint, uchar> mSemanticConstraintLookup;
695 ::std::vector<::CommandRegistry::ConstrainedValue> mConstrainedValues;
696 ::std::map<::std::pair<uint64, uint>, uint> mConstrainedValueLookup;
697 ::std::vector<::CommandRegistry::SoftEnum> mSoftEnums;
698 ::std::map<::std::string, uint> mSoftEnumLookup;
699 ::std::vector<::CommandRegistry::RegistryState> mStateStack;
701 ::std::unordered_set<int> mSkipOnEpsAutocompleteSymbols;
702 ::std::unordered_set<int> mAllowEmptySymbols;
703 CommandOverrideFunctor mCommandOverrideFunctor;
704 ::std::unique_ptr<::CommandRunStats> mCommandRunStats;
709 ::std::string
const&,
710 ::std::unordered_map<::mce::UUID, ::PlayerListEntry>
const&,
713 mAutoCompletePlayerMention;
723 std::vector<std::string>& errorParams
726 template <
class E,
class C>
733 std::vector<std::string>& errorParams
736 uint64 getEnumData(
ParseToken const& token)
const {
737 auto& values = mEnums[token.type.toIndex()].values;
738 return std::lower_bound(
741 token.child->type.toIndex(),
742 [](
auto& pair,
auto& child) { return pair.first < child; }
761 ::std::string
const& name,
762 ::std::vector<::std::pair<::std::string, uint>>
const& strings,
764 bool (CommandRegistry::*parse)(
770 ::std::vector<::std::string>&
777 ::std::string
const& name,
778 ::std::vector<::std::pair<uint64, uint>>
const& values,
780 bool (::CommandRegistry::*parse)(
786 ::std::vector<::std::string>&
792 MCAPI ::CommandRegistry::Symbol _addEnumValuesInternal(
793 ::std::string
const& name,
794 ::std::vector<::std::pair<::std::string, uint64>>
const& strings,
796 bool (CommandRegistry::*parse)(
802 ::std::vector<::std::string>&
807 ::std::string
const& name,
808 ::std::vector<::std::pair<uint64, uint64>>
const& values,
810 bool (::CommandRegistry::*parse)(
816 ::std::vector<::std::string>&
824 ::std::string& error,
825 ::std::vector<::std::string>& errorParams
836 ::SemanticConstraint requiredConstraints
841 addChainedSubcommandValuesToExisting(uint index, ::std::vector<::std::pair<uint64, uint>>
const& values);
844 MCAPI
void addEnumValueConstraints(
845 ::std::string
const& enumName,
846 ::std::vector<::std::string>
const& values,
847 ::SemanticConstraint constraints
850 MCAPI
int addEnumValues(::std::string
const& name, ::std::vector<::std::string>
const& values);
855 MCNAPI ::CommandRegistry::Symbol addPostfix(::std::string
const& name);
860 ::std::vector<::CommandRegistry::Symbol> derivation,
868 MCAPI
int addSoftEnum(::std::string
const& name, ::std::vector<::std::string> values);
870 MCAPI
void addSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
875 MCNAPI
void autoComplete(
877 ::std::string
const& cmdLine,
878 ::std::string
const& partialMatch,
885 MCNAPI
void autoCompleteCommand(
886 ::std::string
const& partialMatch,
898 ::std::set<::CommandRegistry::Symbol>& workingSet
903 ::std::vector<::gsl::not_null<::CommandRegistry::Overload*>>
const& overloads,
911 MCNAPI
bool canCommandBeUsed(
912 ::std::string
const& commandLine,
913 ::CommandPermissionLevel
const& permissionLevel,
924 ::std::string& error,
925 ::std::vector<::std::string>& errorParams
931 MCNAPI ::std::string describe(
933 ::std::string
const& alias,
943 MCNAPI ::CommandRegistry::Signature
const*
findCommand(::std::string
const& name)
const;
945 MCFOLD ::CommandRegistry::Signature*
findCommand(::std::string
const& name);
952 MCNAPI ::Json::Value generateDocumentationMetadata(
bool generateInternalMetadata)
const;
955 MCNAPI ::std::vector<::std::string>
getAliases(::std::string
const& command)
const;
960 MCNAPI ::std::unique_ptr<::AutoCompleteInformation> getAutoCompleteOptions(
962 ::std::string
const& _cmdLine,
963 uint cursorPositionUnsafe
969 MCAPI ::CommandSyntaxInformation
970 getCommandOverloadSyntaxInformation(
::CommandOrigin const& origin, ::std::string
const& commandName)
const;
977 MCNAPI ::CommandSyntaxInformation getOverloadSyntaxInformation(
979 ::std::string
const& cmdLine,
984 MCNAPI
bool isCommandOfType(::std::string
const& nameIn, ::CommandTypeFlag commandType)
const;
997 MCNAPI ::std::string parsePartialCommand(
999 ::std::string
const& _cmdLine,
1000 uint cursorPosition,
1010 ::std::string& error,
1011 ::std::vector<::std::string>& errorParams
1019 ::std::string& error,
1020 ::std::vector<::std::string>& errorParams,
1025 MCNAPI
void popState();
1027 MCNAPI
void pushState();
1030 MCAPI
void registerAlias(::std::string name, ::std::string alias);
1032 MCAPI
void registerCommand(
1033 ::std::string
const& name,
1034 char const* description,
1035 ::CommandPermissionLevel requirement,
1041 MCNAPI
void registerCommandFactory(
1042 char const* command,
1047 MCAPI
void registerOverload(
1048 char const* command,
1050 ::std::function<::std::unique_ptr<::Command>()> allocFn,
1051 ::std::vector<::CommandParameterData> params
1056 MCAPI
void removeSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
1058 MCAPI ::AvailableCommandsPacket serializeAvailableCommands()
const;
1064 MCAPI
void setSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
1074 MCAPI ~CommandRegistry();
1081 MCNAPI static ::BlockType
const* _getBlockFromCmdParameters(::std::string
const& parameters);
1084 MCAPI static ::std::string _removeStringQuotes(::std::string
const& str);
1086 MCNAPI static ::CommandRegistry::ParseToken*
1095 MCNAPI static ::CommandRegistry::ParseToken*
1104 MCNAPI static ::CommandRegistry::ParseToken*
fold(
1110 MCNAPI static ::CommandRegistry::ParseToken*
1116 ::std::string& error,
1117 ::std::vector<::std::string>& errorParams
1123 ::std::string& error,
1124 ::std::vector<::std::string>& errorParams
1131 bool readIntegerAsCentered,
1132 ::std::string& error,
1133 ::std::vector<::std::string>& errorParams
1137 ::std::string& value,
1139 ::std::string& error,
1140 ::std::vector<::std::string>& errorParams