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,
};
}