in tools/apiview/parsers/csharp-api-parser/CSharpAPIParser/TreeToken/CodeFileBuilder.cs [251:345]
private void BuildType(List<ReviewLine> reviewLines, INamedTypeSymbol namedType, bool inHiddenScope)
{
if (!IsAccessible(namedType))
{
return;
}
bool isHidden = IsHiddenFromIntellisense(namedType) || inHiddenScope;
var reviewLine = new ReviewLine()
{
LineId = namedType.GetId(),
IsHidden = isHidden
};
// Build documentation, attributes, visibility, and name
BuildDocumentation(reviewLines, namedType, isHidden, namedType.GetId());
BuildAttributes(reviewLines, namedType.GetAttributes(), isHidden, namedType.GetId());
BuildVisibility(reviewLine.Tokens, namedType);
switch (namedType.TypeKind)
{
case TypeKind.Class:
BuildClassModifiers(reviewLine.Tokens, namedType);
reviewLine.Tokens.Add(ReviewToken.CreateKeywordToken(SyntaxKind.ClassKeyword));
break;
case TypeKind.Delegate:
reviewLine.Tokens.Add(ReviewToken.CreateKeywordToken(SyntaxKind.DelegateKeyword));
break;
case TypeKind.Enum:
reviewLine.Tokens.Add(ReviewToken.CreateKeywordToken(SyntaxKind.EnumKeyword));
break;
case TypeKind.Interface:
reviewLine.Tokens.Add(ReviewToken.CreateKeywordToken(SyntaxKind.InterfaceKeyword));
break;
case TypeKind.Struct:
if (namedType.IsReadOnly)
{
reviewLine.Tokens.Add(ReviewToken.CreateKeywordToken(SyntaxKind.ReadOnlyKeyword));
}
reviewLine.Tokens.Add(ReviewToken.CreateKeywordToken(SyntaxKind.StructKeyword));
break;
}
DisplayName(reviewLine, namedType, namedType);
// Add navigation short name and render classes to Type name token. Navigation tree is built dynamically based on these properties
var typeToken = reviewLine.Tokens.FirstOrDefault(t => t.Kind == TokenKind.TypeName && string.IsNullOrEmpty(t.NavigateToId));
if (typeToken != null)
{
typeToken.NavigationDisplayName = namedType.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat);
typeToken.RenderClasses.Add(namedType.TypeKind.ToString().ToLowerInvariant());
}
if (namedType.TypeKind == TypeKind.Delegate)
{
reviewLine.Tokens.Last().HasSuffixSpace = false;
reviewLine.Tokens.Add(ReviewToken.CreatePunctuationToken(SyntaxKind.SemicolonToken));
reviewLines.Add(reviewLine);
return;
}
reviewLine.Tokens.Last().HasSuffixSpace = true;
BuildBaseType(reviewLine, namedType);
reviewLine.Tokens.Add(ReviewToken.CreatePunctuationToken(SyntaxKind.OpenBraceToken));
foreach (var namedTypeSymbol in SymbolOrderProvider.OrderTypes(namedType.GetTypeMembers()))
{
BuildType(reviewLine.Children, namedTypeSymbol, isHidden);
}
foreach (var member in SymbolOrderProvider.OrderMembers(namedType.GetMembers()))
{
if (member.Kind == SymbolKind.NamedType || member.IsImplicitlyDeclared || !IsAccessible(member)) continue;
if (member is IMethodSymbol method)
{
if (method.MethodKind == MethodKind.PropertyGet ||
method.MethodKind == MethodKind.PropertySet ||
method.MethodKind == MethodKind.EventAdd ||
method.MethodKind == MethodKind.EventRemove ||
method.MethodKind == MethodKind.EventRaise)
{
continue;
}
}
BuildMember(reviewLine.Children, member, isHidden);
}
reviewLines.Add(reviewLine);
reviewLines.Add(new ReviewLine()
{
Tokens = [
ReviewToken.CreateStringLiteralToken("}")
],
IsHidden = isHidden,
IsContextEndLine = true
});
reviewLines.Add(new ReviewLine() { IsHidden = isHidden, RelatedToLine = reviewLine.LineId });
}