Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
            }
        }