// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

namespace Microsoft.AspNetCore.Razor.Language.Syntax;

internal static class SyntaxUtilities
{
    public static MarkupTextLiteralSyntax MergeTextLiterals(params MarkupTextLiteralSyntax[] literalSyntaxes)
    {
        if (literalSyntaxes == null || literalSyntaxes.Length == 0)
        {
            return null;
        }

        SyntaxNode parent = null;
        var position = 0;
        var seenFirstLiteral = false;
        var builder = Syntax.InternalSyntax.SyntaxListBuilder.Create();

        foreach (var syntax in literalSyntaxes)
        {
            if (syntax == null)
            {
                continue;
            }
            else if (!seenFirstLiteral)
            {
                // Set the parent and position of the merged literal to the value of the first non-null literal.
                parent = syntax.Parent;
                position = syntax.Position;
                seenFirstLiteral = true;
            }

            foreach (var token in syntax.LiteralTokens)
            {
                builder.Add(token.Green);
            }
        }

        var mergedLiteralSyntax = Syntax.InternalSyntax.SyntaxFactory.MarkupTextLiteral(
            builder.ToList<Syntax.InternalSyntax.SyntaxToken>(), chunkGenerator: null);

        return (MarkupTextLiteralSyntax)mergedLiteralSyntax.CreateRed(parent, position);
    }
}
