static SAddLineResult AddLine(CKey inParent, CKey inCurrentArrayKey, CTokenLine line, ITreeBuildSupport inSupport, CBuildCommands inCommands) { SAddLineResult result = new SAddLineResult(); if (line.IsEmpty()) { if (line.Comments != null) { inCommands.SetNextLineComment(line.Comments.Text, line.Position.Line, inParent); } result.current_array_key = inCurrentArrayKey; } else if (line.IsRecordDivider()) { result.current_array_key = null; result.WasRecordDivider = true; } else if (line.IsCommandLine()) { result.current_array_key = ExecuteCommand(inParent, inCurrentArrayKey, line, inSupport, inCommands); } else if (line.Head != null) { result.current_array_key = inCurrentArrayKey; if (result.current_array_key == null) { result.current_array_key = CreateNewArrayKey(inParent, line, inCommands); } if (line.AdditionMode == EKeyAddingMode.AddUnique && result.current_array_key.IsKeyWithNamePresent(line.Head.Text)) { inSupport.GetLogger().LogError(EErrorCode.ElementWithNameAlreadyPresent, line); } result.last_key_add_mode = line.AdditionMode; result.last_record_key = CKey.Create(result.current_array_key, line, inSupport.GetLogger()); if (inCommands.IsNextLineCommentPresent) { result.last_record_key.AddComments(inCommands.PopNextLineComments(inParent)); } } else if (!line.IsTailEmpty) { //if (!line.IsNewArrayLine && line.TailLength == 1 && !inParent.IsArray) // inParent.AddTokenTail(line, true, inSupport.GetLogger()); //else { result.current_array_key = CreateNewArrayKey(inParent, line, inCommands); result.current_array_key.AddTokenTail(line, inSupport.GetLogger()); } } return(result); }
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)); } }