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()); }
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); }