static void OnClosingKey(CKey key, EKeyAddingMode inKeyAddMode, ITreeBuildSupport inSupport) { if (key == null) { return; } if (key.IsEmpty) { inSupport.GetLogger().LogError(EErrorCode.HeadWithoutValues, key); return; } if (inKeyAddMode == EKeyAddingMode.AddUnique) { return; } CKey parent = key.Parent; if (parent == null) { inSupport.GetLogger().LogError(EErrorCode.KeyMustHaveParent, key); return; } key.SetParent(null); if (inKeyAddMode == EKeyAddingMode.Override) { var pathes = new List <List <string> >(); key.GetTerminalPathes(pathes, new List <string>()); //for correct deleting array elems for (int i = pathes.Count - 1; i >= 0; --i) { var path = pathes[i]; RemoveKeysByPath(parent, path); } inKeyAddMode = EKeyAddingMode.Add; } if (inKeyAddMode == EKeyAddingMode.Add) { CKey child_key = parent.FindChildKey(key.Name); if (child_key != null) { child_key.MergeKey(key); } else { key.SetParent(parent); } } }
//inStartLine - next of parent line static void CollectByDivs(CKey inParent, int inParentRank, int inStartLine, int inEndLine, List <CTokenLine> inLines, ITreeBuildSupport inSupport, CKey inRoot, EKeyAddingMode inKeyAddingMode) { int curr_rank = inParentRank + 1; List <Tuple <int, int> > recs_by_divs = new List <Tuple <int, int> >(); CollectDividers(inStartLine, inEndLine, curr_rank, inLines, inSupport, recs_by_divs); if (recs_by_divs.Count > 1) { if (inKeyAddingMode == EKeyAddingMode.Override) { inParent.ClearAllArrayKeys(); } for (int i = 0; i < recs_by_divs.Count; i++) { int first_line = recs_by_divs[i].Item1; int exlude_last_line = recs_by_divs[i].Item2; if (first_line < exlude_last_line) { CKey arr_key = CKey.CreateArrayKey(inParent, inLines[first_line].Position); if (IsLinePresent(curr_rank, first_line, exlude_last_line, inLines)) { Collect(arr_key, curr_rank, first_line, exlude_last_line, inLines, inSupport, inRoot, EKeyAddingMode.AddUnique); } else { CollectByDivs(arr_key, curr_rank, first_line, exlude_last_line, inLines, inSupport, inRoot, EKeyAddingMode.AddUnique); } if (arr_key.IsEmpty) { arr_key.SetParent(null); } } } } else { Collect(inParent, inParentRank, recs_by_divs[0].Item1, recs_by_divs[0].Item2, inLines, inSupport, inRoot, inKeyAddingMode); } }
void FindHeadAndTail(ILogger inLoger) { if (_tokens.Length == 0) { return; } if (_tokens[0].TokenType == ETokenType.Sharp) { return; } if (_tokens[0].TokenType == ETokenType.RecordDivider) { return; } int cur_index = 0; CToken toc = _tokens[cur_index]; if (toc.TokenType == ETokenType.AddKey) { _addition_mode = EKeyAddingMode.Add; cur_index++; } else if (toc.TokenType == ETokenType.OverrideKey) { _addition_mode = EKeyAddingMode.Override; cur_index++; } //if (toc.TokenType == ETokenType.OverrideKey) //{ // _addition_mode = EKeyAddingMode.Override; // cur_index++; //} int token_count = _tokens.Length - cur_index; if (cur_index == 0 && token_count == 1 && Utils.IsDataType(toc.TokenType)) {//written only one value _tail = new CToken[1] { _tokens[0] }; return; } if (token_count < 2) { inLoger.LogError(EErrorCode.CantResolveLine, this); return; } toc = _tokens[cur_index + 1]; if (toc.TokenType == ETokenType.Colon) { _head = _tokens[cur_index]; cur_index += 2; if (!Utils.IsDataType(_head.TokenType)) { inLoger.LogError(EErrorCode.StrangeHeadType, _head); } } else if (_tokens[0].TokenType == ETokenType.Colon) { IsNewArrayLine = true; } List <CToken> lst = new List <CToken>(); for (int i = cur_index; i < _tokens.Length; ++i) { if (Utils.IsDataType(_tokens[i].TokenType)) { lst.Add(_tokens[i]); } } _tail = lst.ToArray(); }
static Tuple <CKey, int> CreateKey(int inStartLine, int inEndLine, List <CTokenLine> inLines, ITreeBuildSupport inSupport, CKey inRoot, CKey inParent, EKeyAddingMode inKeyAddingMode) { CTokenLine line = inLines[inStartLine]; int key_rank = line.Rank; if (line.IsHeadEmpty) { CKey arr_key = CKey.CreateArrayKey(inParent, line.Position); arr_key.AddTokenTail(line, inSupport.GetLogger()); return(new Tuple <CKey, int>(arr_key, inStartLine + 1)); } else { CKey key = null; if (inKeyAddingMode != EKeyAddingMode.AddUnique) { key = inParent.FindChildKey(line.Head.Text); if (key == null) { inSupport.GetLogger().LogError(EErrorCode.CantFindKey, line, $"Key name: {line.Head.Text}"); } else { if (inKeyAddingMode == EKeyAddingMode.Override) { key.ClearComments(); key.ClearValues(); } if (inKeyAddingMode == EKeyAddingMode.Override || inKeyAddingMode == EKeyAddingMode.Add) { key.AddTokenTail(line, inSupport.GetLogger()); } } } else if (inParent.IsKeyWithNamePresent(line.Head.Text)) { inSupport.GetLogger().LogError(EErrorCode.ElementWithNameAlreadyPresent, line); } if (key == null) { key = CKey.Create(inParent, line, inSupport.GetLogger()); } int last_line = FindNextSameRankLine(inStartLine, inEndLine, key_rank, inLines); if (last_line > inStartLine + 1) { EKeyAddingMode next_add_mode = inKeyAddingMode; if (next_add_mode == EKeyAddingMode.Add) { next_add_mode = EKeyAddingMode.AddUnique; } CollectByDivs(key, key_rank, inStartLine + 1, last_line, inLines, inSupport, inRoot, next_add_mode); } if (key.KeyCount == 0 && key.ValuesCount == 0) { inSupport.GetLogger().LogError(EErrorCode.HeadWithoutValues, line); } return(new Tuple <CKey, int>(key, last_line)); } }
//inStartLine - next of parent line static void Collect(CKey inParent, int inParentRank, int inStartLine, int inEndLine, List <CTokenLine> inLines, ITreeBuildSupport inSupport, CKey inRoot, EKeyAddingMode inKeyAddingMode) { CBuildCommands command_for_next_string = null; int start = inStartLine; do { int old_start = start; CTokenLine line = inLines[start]; if (line.IsCommandLine()) { if (line.Command == ECommands.Name) { if (line.CommandParams.Length < 1) { inSupport.GetLogger().LogError(EErrorCode.EmptyCommand, line); } else { if (inParent.IsArray && line.Rank == inParentRank) { if (!inParent.SetName(line.CommandParams[0])) { inSupport.GetLogger().LogError(EErrorCode.DublicateKeyName, line); } } else { //inSupport.GetLogger().LogError(EErrorCode.NextArrayKeyNameMissParent, line); if (command_for_next_string == null) { command_for_next_string = new CBuildCommands(inSupport.GetLogger()); } command_for_next_string.SetNextArrayKeyName(line.CommandParams[0], line.Position.Line, inParent); } } } else if (line.Command == ECommands.Insert) { ExecuteCommand_Insert(inParent, line, inSupport, inRoot); } else if (line.Command == ECommands.Delete) { ExecuteCommand_Delete(inParent, line, inSupport); } else if (line.Command == ECommands.ChangeValue) { inParent.ChangeValues(line.CommandParams.GetDictionary()); } } else if (line.IsEmpty() && line.Comments != null) { if (command_for_next_string == null) { command_for_next_string = new CBuildCommands(inSupport.GetLogger()); } command_for_next_string.SetNextLineComment(line.Comments.Text, line.Position.Line, inParent); } else if (!line.IsEmpty()) { EKeyAddingMode adding_mode = inKeyAddingMode; if (adding_mode == EKeyAddingMode.AddUnique && line.AdditionMode != EKeyAddingMode.AddUnique) { adding_mode = line.AdditionMode; } Tuple <CKey, int> new_key_new_line = CreateKey(start, inEndLine, inLines, inSupport, inRoot, inParent, adding_mode); CKey new_key = new_key_new_line.Item1; if (command_for_next_string != null && command_for_next_string.IsNextArrayKeyNamePresent) { if (!new_key.SetName(command_for_next_string.PopNextArrayKeyName(inParent))) { inSupport.GetLogger().LogError(EErrorCode.DublicateKeyName, line); } } if (command_for_next_string != null && command_for_next_string.IsNextLineCommentPresent) { new_key.AddComments(command_for_next_string.PopNextLineComments(inParent)); } //if (!new_key.IsArray && line.AdditionMode == EKeyAddingMode.AddUnique && inParent.IsKeyWithNamePresent(new_key.Name)) // inSupport.GetLogger().LogError(EErrorCode.ElementWithNameAlreadyPresent, inLines[start]); //if(line.AdditionMode == EKeyAddingMode.AddUnique) // new_key.SetParent(inParent); //else if (line.AdditionMode == EKeyAddingMode.Override || line.AdditionMode == EKeyAddingMode.Add) //{ // if (line.AdditionMode == EKeyAddingMode.Override) // { // var pathes = new List<List<string>>(); // new_key.GetTerminalPathes(pathes, new List<string>()); // //for correct deleting array elems // for (int i = pathes.Count - 1; i >= 0; --i) // { // var path = pathes[i]; // RemoveKeysByPath(inParent, path); // } // } // CKey child_key = inParent.FindChildKey(new_key.Name); // if (child_key != null) // child_key.MergeKey(new_key); // else // new_key.SetParent(inParent); //} start = new_key_new_line.Item2; } if (old_start == start) { start++; } }while (start < inEndLine); }