in src/AutoRest.CSharp/Common/Generation/Writers/CodeWriter.cs [109:210]
public CodeWriter Append(FormattableString formattableString)
{
if (formattableString.ArgumentCount == 0)
{
return AppendRaw(formattableString.ToString());
}
const string literalFormatString = ":L";
const string declarationFormatString = ":D"; // :D :)
const string identifierFormatString = ":I";
const string crefFormatString = ":C"; // wraps content into "see cref" tag, available only in xmlDoc
foreach ((var span, bool isLiteral, int index) in StringExtensions.GetPathParts(formattableString.Format))
{
if (isLiteral)
{
AppendRaw(span);
continue;
}
var argument = formattableString.GetArgument(index);
var isDeclaration = span.EndsWith(declarationFormatString);
var isIdentifier = span.EndsWith(identifierFormatString);
var isLiteralFormat = span.EndsWith(literalFormatString);
var isCref = span.EndsWith(crefFormatString);
if (isCref)
{
if (!_writingXmlDocumentation)
{
throw new InvalidOperationException($"':C' formatter can be used only inside XmlDoc");
}
switch (argument)
{
case Type t:
AppendTypeForCRef(new CSharpType(t));
break;
case CSharpType t:
AppendTypeForCRef(t);
break;
default:
Append($"<see cref=\"{argument}\"/>");
break;
}
continue;
}
switch (argument)
{
case IEnumerable<FormattableString> fss:
foreach (var fs in fss)
{
Append(fs);
}
break;
case FormattableString fs:
Append(fs);
break;
case Type t:
AppendType(new CSharpType(t), false, false);
break;
case CSharpType t:
AppendType(t, isDeclaration, false);
break;
case CodeWriterDeclaration declaration when isDeclaration:
Declaration(declaration);
break;
case CodeWriterDeclaration declaration:
Append(declaration);
break;
case ValueExpression expression:
expression.Write(this);
break;
case var _ when isLiteralFormat:
Literal(argument);
break;
default:
string? s = argument?.ToString();
if (s == null)
{
throw new ArgumentNullException(index.ToString());
}
if (isDeclaration)
{
Declaration(s);
}
else if (isIdentifier)
{
Identifier(s);
}
else
{
AppendRaw(s);
}
break;
}
}
return this;
}