72 using ValueTypeID = uint64;
74 using EnumValueID = uint64;
78 using SoftEnumID = uint;
80 using ChainedSubcommandValueID = uint64;
82 using ChainedSubcommandID = uint;
84 using SemanticConstraintID = uchar;
86 using ConstrainedValueID = uint;
88 using ConstrainedValueLookupKey = ::std::pair<uint64, uint>;
90 using CustomStorageGetFn =
void* (*)(
::Command*,
int);
92 using CustomStorageIsSetFn =
bool* (*)(
::Command*,
int);
94 using CommandOverrideFunctor =
95 ::std::function<void(::std::string
const&,
::CommandFlag&, ::CommandPermissionLevel&)>;
97 using ScoreboardScoreAccessor = ::std::function<int(
bool&, ::std::string
const&,
::Actor const&)>;
99 using HardTerminal = ::CommandLexer::TokenType;
101 enum class HardNonTerminal :
int {
107 WildcardInt = 1048581,
109 CompareOperator = 1048583,
111 StandaloneSelection = 1048585,
112 WildcardSelection = 1048586,
113 NonIdSelector = 1048587,
115 ScoresArgs = 1048589,
116 ScoreSelectParam = 1048590,
117 ScoreSelector = 1048591,
118 TagSelector = 1048592,
120 FilePathVal = 1048594,
121 FilePathCont = 1048595,
122 IntegerRangeVal = 1048596,
123 IntegerRangePostVal = 1048597,
124 IntegerRange = 1048598,
125 FullIntegerRange = 1048599,
126 RationalRangeVal = 1048600,
127 RationalRangePostVal = 1048601,
128 RationalRange = 1048602,
129 FullRationalRange = 1048603,
138 HasPermissionArg = 1048612,
139 HasPermissionArgs = 1048613,
140 HasPermissionSelector = 1048614,
141 HasPermissionElement = 1048615,
142 HasPermissionElements = 1048616,
144 HasItemElement = 1048618,
145 HasItemElements = 1048619,
146 HasItemArg = 1048620,
147 HasItemArgs = 1048621,
148 HasItemSelector = 1048622,
149 EquipmentSlotEnum = 1048623,
150 PropertyValue = 1048624,
151 HasPropertyParamValue = 1048625,
152 HasPropertyParamEnumValue = 1048626,
153 HasPropertyArg = 1048627,
154 HasPropertyArgs = 1048628,
155 HasPropertyElement = 1048629,
156 HasPropertyElements = 1048630,
157 HasPropertySelector = 1048631,
163 CoordXFloat = 1048637,
164 CoordYFloat = 1048638,
165 CoordZFloat = 1048639,
167 PositionFloat = 1048641,
168 MessageExp = 1048642,
170 MessageRoot = 1048644,
171 PostSelector = 1048645,
173 RawTextCont = 1048647,
176 JsonObject = 1048650,
177 JsonObjectFields = 1048651,
178 JsonObjectCont = 1048652,
180 JsonArrayValues = 1048654,
181 JsonArrayCont = 1048655,
183 BlockStateKey = 1048657,
184 BlockStateValue = 1048658,
185 BlockStateValues = 1048659,
186 BlockStateArray = 1048660,
187 BlockStateArrayCont = 1048661,
189 SlashCommand = 1048663,
190 CodeBuilderArg = 1048664,
191 CodeBuilderArgs = 1048665,
192 CodeBuilderSelectParam = 1048666,
193 CodeBuilderSelector = 1048667,
200 static int const NonTerminalBit = 0x100000;
201 static int const EnumBit = 0x200000;
202 static int const OptionalBit = 0x400000;
203 static int const FactorizationBit = 0x800000;
204 static int const PostfixBit = 0x1000000;
205 static int const EnumValueBit = 0x2000000;
206 static int const SoftEnumBit = 0x4000000;
210 Symbol(
int val) : mValue(val) {}
215 Symbol(HardNonTerminal data) : mValue(
static_cast<int>(data)) {}
217 Symbol(CommandLexer::TokenType data) : mValue(
static_cast<int>(data)) {}
220 mValue = other.mValue;
224 [[nodiscard]]
inline bool operator==(
Symbol const& other)
const {
return mValue == other.mValue; }
226 uint64 toIndex()
const {
return mValue & 0xffffffffe00fffffull; }
233 uint64 operator()(::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::Symbol>
const&)
const;
240 using SymbolVector = ::std::vector<::CommandRegistry::Symbol>;
243 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>;
245 using ParseMap = ::std::map<
247 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>;
259 ::std::vector<::CommandParameterData> params;
262 ::std::vector<::CommandRegistry::Symbol> paramsSymbol;
271 ::std::string description;
272 ::std::vector<::CommandRegistry::Overload> overloads;
273 ::std::vector<uint> chainedSubcommandIndexes;
274 ::CommandPermissionLevel permissionLevel;
279 int firstFactorization;
340 ::std::unique_ptr<::CommandRegistry::ParseToken> child;
341 ::std::unique_ptr<::CommandRegistry::ParseToken> next;
351 MCAPI ::std::string toString()
const;
355 using ProcessFunction =
362 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> nonTerminal;
368 ::ll::TypedStorage<8, 24, ::std::vector<::CommandRegistry::Symbol>> derivation;
369 ::ll::TypedStorage<4, 8, ::CommandVersion> versions;
385 using RuleIndex = int;
391 ::ll::TypedStorage<4, 4, int> parameterCount;
392 ::ll::TypedStorage<4, 4, int> followingRuleIndex;
393 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> paramSymbol;
401 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> commandSymbol;
411 ::std::vector<::std::string>&
414 using EnumConversionFunction = ::std::function<void(
void*, uint64)>;
423 ::std::vector<::std::pair<uint64, uint64>> values;
439 using ChainedSubcommandConversionFunction = ::std::function<void(
void*, uint64)>;
448 ::std::vector<::std::pair<uint64, uint>> values;
469 ::std::vector<::std::string> mValues;
477 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> mValue;
478 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> mEnum;
479 ::ll::TypedStorage<8, 24, ::std::vector<uchar>> mConstraints;
487 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> x;
488 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> y;
489 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> z;
490 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dx;
491 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dy;
492 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> dz;
493 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> r;
494 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rm;
495 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rx;
496 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rxm;
497 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> ry;
498 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> rym;
499 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> l;
500 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> lm;
501 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> c;
502 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> m;
503 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> name;
504 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> type;
505 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> family;
506 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> score;
507 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> tag;
508 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> hasitem;
509 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> haspermission;
510 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> hasproperty;
511 ::ll::TypedStorage<4, 4, ::CommandRegistry::Symbol> codebuilder;
531 ::ll::TypedStorage<4, 4, uint> signatureCount;
532 ::ll::TypedStorage<4, 4, uint> enumValueCount;
533 ::ll::TypedStorage<4, 4, uint> postfixCount;
534 ::ll::TypedStorage<4, 4, uint> enumCount;
535 ::ll::TypedStorage<4, 4, uint> enumLookupCount;
536 ::ll::TypedStorage<4, 4, uint> typeLookupCount;
537 ::ll::TypedStorage<4, 4, uint> factorizationCount;
538 ::ll::TypedStorage<4, 4, uint> optionalCount;
539 ::ll::TypedStorage<4, 4, uint> ruleCount;
540 ::ll::TypedStorage<4, 4, uint> softEnumCount;
541 ::ll::TypedStorage<4, 4, uint> constraintCount;
542 ::ll::TypedStorage<4, 4, uint> chainedSubcommandCount;
543 ::ll::TypedStorage<4, 4, uint> chainedSubcommandValueCount;
544 ::ll::TypedStorage<8, 24, ::std::vector<uint>> enumValuesCount;
545 ::ll::TypedStorage<8, 24, ::std::vector<uint>> constrainedValueCount;
546 ::ll::TypedStorage<8, 24, ::std::vector<uint>> softEnumValuesCount;
562 using PredictTable = ::entt::dense_map<
563 ::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::Symbol>,
566 ::std::equal_to<void>>;
574 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>
578 ::entt::dense_set<::CommandRegistry::Symbol, ::CommandRegistry::SymbolHasher, ::std::equal_to<void>>>
581 ::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::Symbol>,
584 ::std::equal_to<void>>
586 ::std::chrono::nanoseconds buildDuration;
594 ::ll::TypedStorage<1, 1, bool> mIsValid;
595 ::ll::TypedStorage<8, 24, ::std::vector<::CommandRegistry::Symbol>> mConstrainedParams;
596 ::ll::TypedStorage<8, 32, ::std::string> mSoftEnumText;
597 ::ll::TypedStorage<8, 32, ::std::string> mSoftEnumEscapeCharExceptions;
598 ::ll::TypedStorage<8, 16, ::std::set<::CommandRegistry::Symbol>> mAlreadyCompletedSymbols;
602 using ParamVisitCallback = ::std::function<
607 using ParseTableMap = ::std::map<uint, ::CommandRegistry::ParseTable>;
613 ::ll::TypedStorage<8, 8, ::CommandRegistry const&> mRegistry;
614 ::ll::TypedStorage<8, 8, ::CommandRegistry::ParseTable const*> mParseTable;
615 ::ll::TypedStorage<8, 40, ::std::deque<::std::pair<::CommandRegistry::Symbol, ::CommandRegistry::ParseToken*>>>
617 ::ll::TypedStorage<8, 32, ::CommandRegistry::LexicalToken> mNext;
618 ::ll::TypedStorage<8, 32, ::std::string> mInput;
619 ::ll::TypedStorage<8, 8, ::std::unique_ptr<::CommandRegistry::ParseToken>> mRoot;
620 ::ll::TypedStorage<8, 32, ::std::string> mError;
621 ::ll::TypedStorage<8, 24, ::std::vector<::std::string>> mErrorParams;
622 ::ll::TypedStorage<4, 4, int> mVersion;
623 ::ll::TypedStorage<1, 1, bool> mGenerateParams;
624 ::ll::TypedStorage<1, 1, bool> mBreakAtEnd;
638 MCAPI
bool _parse(::std::string
const& in);
640 MCAPI ::std::unique_ptr<::CommandSelector<::Actor>>
641 createSelector(::std::string
const& selectorString,
::CommandOrigin const& origin);
643 MCAPI ::std::vector<::std::string> getErrorParams()
const;
645 MCAPI
bool parseCommand(::std::string
const& in);
647 MCAPI
bool parseSelector(::std::string
const& in);
670 ::std::function<void(
::Packet const&)> mNetworkUpdateCallback;
671 ScoreboardScoreAccessor mGetScoreForObjective;
673 ::std::vector<::CommandRegistry::ParseRule> mRules;
674 ::std::map<uint, ::CommandRegistry::ParseTable> mParseTables;
675 ::std::vector<::CommandRegistry::OptionalParameterChain> mOptionals;
676 ::std::vector<::std::string> mEnumValues;
677 ::std::vector<::CommandRegistry::Enum> mEnums;
678 ::std::vector<::std::string> mChainedSubcommandValues;
679 ::std::vector<::CommandRegistry::ChainedSubcommand> mChainedSubcommands;
680 ::std::vector<::CommandRegistry::Factorization> mFactorizations;
681 ::std::vector<::std::string> mPostfixes;
682 ::std::map<::std::string, uint> mEnumLookup;
683 ::std::map<::std::string, uint64> mEnumValueLookup;
684 ::std::map<::std::string, uint> mChainedSubcommandLookup;
685 ::std::map<::std::string, uint64> mChainedSubcommandValueLookup;
686 ::std::vector<::CommandRegistry::Symbol> mCommandSymbols;
687 ::std::map<::std::string, ::CommandRegistry::Signature> mSignatures;
688 ::std::map<::Bedrock::typeid_t<::CommandRegistry>,
int> mTypeLookup;
689 ::std::map<::std::string, ::std::string> mAliases;
690 ::std::vector<::SemanticConstraint> mSemanticConstraints;
691 ::std::map<::SemanticConstraint, uchar> mSemanticConstraintLookup;
692 ::std::vector<::CommandRegistry::ConstrainedValue> mConstrainedValues;
693 ::std::map<::std::pair<uint64, uint>, uint> mConstrainedValueLookup;
694 ::std::vector<::CommandRegistry::SoftEnum> mSoftEnums;
695 ::std::map<::std::string, uint> mSoftEnumLookup;
696 ::std::vector<::CommandRegistry::RegistryState> mStateStack;
698 ::std::unordered_set<int> mSkipOnEpsAutocompleteSymbols;
699 ::std::unordered_set<int> mAllowEmptySymbols;
700 CommandOverrideFunctor mCommandOverrideFunctor;
701 ::std::unique_ptr<::CommandRunStats> mCommandRunStats;
711 std::vector<std::string>& errorParams
714 template <
class E,
class C>
721 std::vector<std::string>& errorParams
724 uint64 getEnumData(
ParseToken const& token)
const {
725 auto& values = mEnums[token.type.toIndex()].values;
726 return std::lower_bound(
729 token.child->type.toIndex(),
730 [](
auto& pair,
auto& child) { return pair.first < child; }
743 MCAPI ::CommandRegistry::Symbol _addChainedSubcommandValuesInternal(
744 ::std::string
const& name,
745 ::std::vector<::std::pair<::std::string, uint>>
const& strings,
753 ::std::vector<::std::string>&
758 MCAPI ::CommandRegistry::Symbol _addChainedSubcommandValuesInternal(
759 ::std::string
const& name,
760 ::std::vector<::std::pair<uint64, uint>>
const& values,
768 ::std::vector<::std::string>&
773 MCAPI ::CommandRegistry::Symbol _addEnumValuesInternal(
774 ::std::string
const& name,
775 ::std::vector<::std::pair<::std::string, uint64>>
const& strings,
783 ::std::vector<::std::string>&
787 MCAPI ::CommandRegistry::Symbol _addEnumValuesInternal(
788 ::std::string
const& name,
789 ::std::vector<::std::pair<uint64, uint64>>
const& values,
797 ::std::vector<::std::string>&
801 MCAPI ::CommandRegistry::Symbol _addFunctionSoftEnum();
803 MCAPI ::std::unique_ptr<::CommandSelector<::Actor>> _createSelector(
807 ::std::string& error,
808 ::std::vector<::std::string>& errorParams
813 MCAPI
bool _isCommandElementValid(::std::string
const& name)
const;
815 MCAPI
bool _matchesEnumConstraintsSet(
819 ::SemanticConstraint requiredConstraints
822 MCAPI
void addChainedSubcommandValuesToExisting(uint index, ::std::vector<::std::pair<uint64, uint>>
const& values);
824 MCAPI
void addEnumValueConstraints(
825 ::std::string
const& enumName,
826 ::std::vector<::std::string>
const& values,
827 ::SemanticConstraint constraints
830 MCAPI
int addEnumValues(::std::string
const& name, ::std::vector<::std::string>
const& values);
832 MCAPI
void addEnumValuesToExisting(uint index, ::std::vector<::std::pair<uint64, uint64>>
const& values);
834 MCAPI ::CommandRegistry::Symbol addPostfix(::std::string
const& name);
838 ::std::vector<::CommandRegistry::Symbol> derivation,
844 MCAPI
void addSemanticConstraint(::SemanticConstraint constraintType);
846 MCAPI
int addSoftEnum(::std::string
const& name, ::std::vector<::std::string> values);
848 MCAPI
void addSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
850 MCAPI ::CommandRegistry::Symbol addSoftTerminal(::std::string
const& name);
854 MCAPI
void buildFollowSet(
858 ::std::set<::CommandRegistry::Symbol>& workingSet
861 MCAPI ::CommandRegistry::Symbol buildOptionalRuleChain(
863 ::std::vector<::CommandParameterData>
const& params,
864 ::std::vector<::CommandRegistry::Symbol>
const& symbols
867 MCAPI
void buildParseTable(uint version)
const;
871 MCAPI ::CommandRegistry::Symbol buildRules(
873 ::std::vector<::gsl::not_null<::CommandRegistry::Overload*>>
const& overloads,
880 MCAPI ::std::unique_ptr<::Command> createCommand(
884 ::std::string& error,
885 ::std::vector<::std::string>& errorParams
892 MCAPI ::std::string describe(
894 ::std::string
const& alias,
901 MCAPI ::CommandRegistry::Signature
const* findCommand(::std::string
const&)
const;
903 MCFOLD ::CommandRegistry::Signature* findCommand(::std::string
const& name);
905 MCAPI ::CommandRegistry::Symbol findEnumValue(::std::string
const& name)
const;
907 MCAPI ::CommandRegistry::Symbol findIdentifierInfo(::std::string
const& name)
const;
909 MCAPI ::CommandRegistry::Symbol findPostfix(::std::string
const& input)
const;
911 MCAPI
void fireCommandParseTableTelemetry(
::IMinecraftEventing const& eventing,
bool isServer)
const;
915 MCAPI ::Json::Value generateDocumentationMetadata(
bool generateInternalMetadata)
const;
917 MCAPI ::std::vector<::std::string> getAliases(::std::string
const& command)
const;
919 MCAPI ::std::vector<::std::string> getAlphabeticalLookup(
::CommandOrigin const& origin)
const;
921 MCAPI ::std::string getCommandName(::std::string
const& commandLine)
const;
923 MCAPI ::CommandSyntaxInformation
924 getCommandOverloadSyntaxInformation(
::CommandOrigin const& origin, ::std::string
const& commandName)
const;
934 MCAPI
bool parseSelector(
939 ::std::string& error,
940 ::std::vector<::std::string>& errorParams
943 MCAPI
void registerAlias(::std::string name, ::std::string alias);
945 MCAPI
void registerCommand(
946 ::std::string
const& name,
947 char const* description,
948 ::CommandPermissionLevel requirement,
953 MCAPI
void registerOverload(
956 ::std::function<::std::unique_ptr<::Command>()> allocFn,
957 ::std::vector<::CommandParameterData> params
962 MCAPI
void removeSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
964 MCAPI ::AvailableCommandsPacket serializeAvailableCommands()
const;
966 MCAPI
void setCommandRegistrationOverride(CommandOverrideFunctor functor);
968 MCAPI
void setSoftEnumValues(::std::string
const& enumName, ::std::vector<::std::string> values);
982 MCAPI static ::std::string _removeStringQuotes(::std::string
const& str);
984 MCFOLD static ::CommandRegistry::ParseToken*
987 MCAPI static ::CommandRegistry::ParseToken* collapseOn(
993 MCAPI static ::CommandRegistry::ParseToken*
996 MCAPI static ::CommandRegistry::ParseToken* expandExcept(
1002 MCAPI static ::CommandRegistry::ParseToken* fold(
1008 MCAPI static ::CommandRegistry::ParseToken*
1011 MCAPI
static bool readFloat(
1014 ::std::string& error,
1015 ::std::vector<::std::string>& errorParams
1018 MCAPI
static bool readInt(
1021 ::std::string& error,
1022 ::std::vector<::std::string>& errorParams
1025 MCAPI
static bool readRelativeCoordinate(
1029 bool readIntegerAsCentered,
1030 ::std::string& error,
1031 ::std::vector<::std::string>& errorParams
1034 MCAPI
static bool readString(
1035 ::std::string& value,
1037 ::std::string& error,
1038 ::std::vector<::std::string>& errorParams
1045 MCAPI
static char const*& CODE_STATUS_PROPERTY_NAME();
1047 MCAPI
static char const*& COMMAND_NAME_ENUM_NAME();
1049 MCAPI
static char const*& FUNCTION_NAME_SOFTENUM_NAME();
1051 MCAPI
static char const*& HASITEM_PARAM_DATA();
1053 MCAPI
static char const*& HASITEM_PARAM_ITEM();
1055 MCAPI
static char const*& HASITEM_PARAM_LOCATION();
1057 MCAPI
static char const*& HASITEM_PARAM_QUANTITY();
1059 MCAPI
static char const*& HASITEM_PARAM_SLOT();
1061 MCAPI
static char const*& HASPERMISSIONSTATE_ENUM_DISABLED();
1063 MCAPI
static char const*& HASPERMISSIONSTATE_ENUM_ENABLED();
1065 MCAPI
static char const*& HASPROPERTY_PARAM_PROPERTY_NAME();
1067 MCAPI static ::std::add_lvalue_reference_t<::std::pair<
1074 ::std::vector<::std::string>&
1079 MCAPI
static char const*& TAG_VALUES_SOFTENUM_NAME();
1081 MCAPI
static char const*& UNLOCKABLE_RECIPES_SOFTENUM_NAME();
1087 MCAPI
void* $ctor(
bool isEduMode);