コード例 #1
0
        private static OpResult ParseEnumContent(ParserState state, LexerData data, ParsingIndex index)
        {
            var enumName = state.CurrentBlock.Name;

            if (TryReadToken(data, TokenType.CurlyBraceRight, out _, out _))
            {
                state.EndBlock();
                index.EndEnum(enumName);

                return(index.IsEnumNonEmpty(enumName) ?
                       OpResult.Ok() :
                       OpResult.Fail($"Enum `{enumName}` is empty. No default value is available"));
            }

            if (!TryReadToken(data, TokenType.Identifier, out var namePos, out var name))
            {
                return(OpResult.Fail($"Failed to read enum name at {namePos}"));
            }

            if (!ParsingHelper.IsNameValid(name))
            {
                return(OpResult.Fail($"Enum item `{enumName}.{name}` has invalid name at {namePos}"));
            }

            if (index.IsEnumContainsItem(enumName, name))
            {
                return(OpResult.Fail($"Enum item `{enumName}.{name}` is defined second time at {namePos}"));
            }

            if (!TryReadToken(data, TokenType.Assignment, out var assignPos, out _))
            {
                return(OpResult.Fail($"Missing `=` at {assignPos}"));
            }

            if (!TryReadToken(data, TokenType.Identifier, out var valPos, out var value))
            {
                return(OpResult.Fail($"Missing enum item `{enumName}.{name}` default value at {valPos}"));
            }

            if (!IsEnumValueValid(enumName, value, index))
            {
                return(OpResult.Fail($"Enum item `{enumName}.{name}` has invalid default value at {valPos}"));
            }

            if (!TryReadToken(data, TokenType.Semicolon, out var semicolonPos, out _))
            {
                return(OpResult.Fail($"Missing ; at {semicolonPos}"));
            }

            index.PutEnumItem(enumName, name, value);

            return(OpResult.Ok());
        }
コード例 #2
0
        private bool IsDefaultValueValid(string itemType, string value, ParsingIndex index)
        {
            if (ParsingHelper.IsPrimitive(itemType))
            {
                return(ParsingHelper.IsPrimitiveValueValid(itemType, value));
            }

            if (_externStructs.TryGetValue(itemType, out var externStructInfo))
            {
                return(externStructInfo.Values.Contains(value));
            }

            if (index.ContainsEnum(itemType))
            {
                return(index.IsEnumContainsItem(itemType, value));
            }

            return(false);
        }