public MergeResult Merge()

in code/src/CoreTemplateStudio/CoreTemplateStudio.Core/PostActions/Catalog/Merge/MergeHandler.cs [33:112]


        public MergeResult Merge(IEnumerable<string> source, IEnumerable<string> merge)
        {
            _result = source.ToList();

            var documentationEndIndex = merge.SafeIndexOf(merge.FirstOrDefault(m => m.Contains(MergeMacros.MacroEndDocumentation)), 0);
            var diffTrivia = FindDiffLeadingTrivia(source, merge, documentationEndIndex);

            foreach (var mergeLine in merge)
            {
                // try to find context line
                if (mergeMode == MergeMode.Context || mergeMode == MergeMode.OptionalContext || mergeMode == MergeMode.Remove)
                {
                    if (LineHasInlineAdditions(mergeLine))
                    {
                        _currentContextLineIndex = FindAndModifyContextLine(mergeLine, diffTrivia);
                    }
                    else
                    {
                        _currentContextLineIndex = FindContextLine(mergeLine, diffTrivia);
                    }
                }

                // if line is found, add buffer if any
                if (_currentContextLineIndex > -1)
                {
                    var linesAdded = TryAddBufferContent();
                    var linesRemoved = TryRemoveBufferContent();

                    _lastContextLineIndex = _currentContextLineIndex + linesAdded - linesRemoved;

                    CleanBuffers();
                }

                // get new merge direction or add to buffer
                if (IsMergeDirection(mergeLine))
                {
                    mergeMode = GetMergeMode(mergeLine, mergeMode, _codeStyleProvider?.CommentSymbol);
                }
                else
                {
                    switch (mergeMode)
                    {
                        case MergeMode.InsertBefore:
                        case MergeMode.Insert:
                            _insertionBuffer.Add(mergeLine.WithLeadingTrivia(diffTrivia));
                            break;
                        case MergeMode.Remove:
                            _removalBuffer.Add(mergeLine.WithLeadingTrivia(diffTrivia));
                            break;
                        case MergeMode.Context:
                            if (mergeLine == string.Empty)
                            {
                                _insertionBuffer.Add(mergeLine);
                            }
                            else if (_currentContextLineIndex == -1)
                            {
                                return new MergeResult()
                                {
                                    Success = false,
                                    ErrorLine = mergeLine,
                                    Result = source,
                                };
                            }

                            break;
                    }
                }
            }

            // Add remaining buffers before finishing
            TryAddBufferContent();
            TryRemoveBufferContent();

            return new MergeResult()
            {
                Success = true,
                ErrorLine = string.Empty,
                Result = _result,
            };
    }