private static void AddAccessibility(ISymbol symbol, ImmutableArray <SymbolDisplayPart> .Builder parts) { switch (symbol.DeclaredAccessibility) { case Accessibility.Private: parts.AddKeyword(SyntaxKind.PrivateKeyword); break; case Accessibility.Internal: parts.AddKeyword(SyntaxKind.InternalKeyword); break; case Accessibility.ProtectedAndInternal: case Accessibility.Protected: parts.AddKeyword(SyntaxKind.ProtectedKeyword); break; case Accessibility.ProtectedOrInternal: parts.AddKeyword(SyntaxKind.ProtectedKeyword); parts.AddSpace(); parts.AddKeyword(SyntaxKind.InternalKeyword); break; case Accessibility.Public: parts.AddKeyword(SyntaxKind.PublicKeyword); break; default: return; } parts.AddSpace(); }
private static void AddEventAccessorAttributes( ImmutableArray <SymbolDisplayPart> .Builder parts, IEnumerable <AttributeData> addAttributes, IEnumerable <AttributeData> removeAttributes, SymbolDisplayFormat format, SymbolDisplayAdditionalOptions additionalOptions) { parts.AddSpace(); parts.AddPunctuation("{"); parts.AddSpace(); AddAccessorAttributes(addAttributes); parts.AddKeyword("add"); parts.AddPunctuation(";"); parts.AddSpace(); AddAccessorAttributes(removeAttributes); parts.AddKeyword("remove"); parts.AddPunctuation(";"); parts.AddSpace(); parts.AddPunctuation("}"); void AddAccessorAttributes(IEnumerable <AttributeData> attributes) { AddAttributes( parts: parts, attributes: attributes, format: format, additionalOptions: additionalOptions, includeTrailingNewLine: false, formatAttributes: false); parts.AddSpace(); } }
private static void AddAttribute( ImmutableArray <SymbolDisplayPart> .Builder parts, AttributeData attribute, SymbolDisplayFormat format, SymbolDisplayAdditionalOptions additionalOptions) { parts.AddDisplayParts(attribute.AttributeClass, format, additionalOptions, removeAttributeSuffix: true); if (additionalOptions.HasOption(SymbolDisplayAdditionalOptions.IncludeAttributeArguments)) { AddAttributeArguments(); } void AddAttributeArguments() { bool hasConstructorArgument = false; bool hasNamedArgument = false; AppendConstructorArguments(); AppendNamedArguments(); if (hasConstructorArgument || hasNamedArgument) { parts.AddPunctuation(")"); } void AppendConstructorArguments() { ImmutableArray <TypedConstant> .Enumerator en = attribute.ConstructorArguments.GetEnumerator(); if (en.MoveNext()) { hasConstructorArgument = true; parts.AddPunctuation("("); while (true) { AddConstantValue(en.Current); if (en.MoveNext()) { parts.AddPunctuation(","); parts.AddSpace(); } else { break; } } } } void AppendNamedArguments() { ImmutableArray <KeyValuePair <string, TypedConstant> > .Enumerator en = attribute.NamedArguments.GetEnumerator(); if (en.MoveNext()) { hasNamedArgument = true; if (hasConstructorArgument) { parts.AddPunctuation(","); parts.AddSpace(); } else { parts.AddPunctuation("("); } while (true) { parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.PropertyName, null, en.Current.Key)); parts.AddSpace(); parts.AddPunctuation("="); parts.AddSpace(); AddConstantValue(en.Current.Value); if (en.MoveNext()) { parts.AddPunctuation(","); parts.AddSpace(); } else { break; } } } } } void AddConstantValue(TypedConstant typedConstant) { switch (typedConstant.Kind) { case TypedConstantKind.Primitive: { parts.Add(new SymbolDisplayPart( GetSymbolDisplayPart(typedConstant.Type.SpecialType), null, SymbolDisplay.FormatPrimitive(typedConstant.Value, quoteStrings: true, useHexadecimalNumbers: false))); break; } case TypedConstantKind.Enum: { OneOrMany <EnumFieldSymbolInfo> oneOrMany = EnumUtility.GetConstituentFields(typedConstant.Value, (INamedTypeSymbol)typedConstant.Type); OneOrMany <EnumFieldSymbolInfo> .Enumerator en = oneOrMany.GetEnumerator(); if (en.MoveNext()) { while (true) { AddDisplayParts(parts, en.Current.Symbol, format, additionalOptions); if (en.MoveNext()) { parts.AddSpace(); parts.AddPunctuation("|"); parts.AddSpace(); } else { break; } } } else { parts.AddPunctuation("("); AddDisplayParts(parts, (INamedTypeSymbol)typedConstant.Type, format, additionalOptions); parts.AddPunctuation(")"); parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.NumericLiteral, null, typedConstant.Value.ToString())); } break; } case TypedConstantKind.Type: { parts.AddKeyword("typeof"); parts.AddPunctuation("("); AddDisplayParts(parts, (ISymbol)typedConstant.Value, format, additionalOptions); parts.AddPunctuation(")"); break; } case TypedConstantKind.Array: { var arrayType = (IArrayTypeSymbol)typedConstant.Type; parts.AddKeyword("new"); parts.AddSpace(); AddDisplayParts(parts, arrayType.ElementType, format, additionalOptions); parts.AddPunctuation("["); parts.AddPunctuation("]"); parts.AddSpace(); parts.AddPunctuation("{"); parts.AddSpace(); ImmutableArray <TypedConstant> .Enumerator en = typedConstant.Values.GetEnumerator(); if (en.MoveNext()) { while (true) { AddConstantValue(en.Current); if (en.MoveNext()) { parts.AddPunctuation(","); parts.AddSpace(); } else { break; } } } parts.AddSpace(); parts.AddPunctuation("}"); break; } default: { throw new InvalidOperationException(); } } SymbolDisplayPartKind GetSymbolDisplayPart(SpecialType specialType) { switch (specialType) { case SpecialType.System_Boolean: return(SymbolDisplayPartKind.Keyword); case SpecialType.System_SByte: case SpecialType.System_Byte: case SpecialType.System_Int16: case SpecialType.System_UInt16: case SpecialType.System_Int32: case SpecialType.System_UInt32: case SpecialType.System_Int64: case SpecialType.System_UInt64: case SpecialType.System_Single: case SpecialType.System_Double: return(SymbolDisplayPartKind.NumericLiteral); case SpecialType.System_Char: case SpecialType.System_String: return(SymbolDisplayPartKind.StringLiteral); default: throw new InvalidOperationException(); } } } }
private static void AddAttributes( ImmutableArray <SymbolDisplayPart> .Builder builder, ImmutableArray <AttributeData> attributes, Func <INamedTypeSymbol, bool> predicate = null, INamespaceSymbol containingNamespace = null, bool splitAttributes = true, bool includeAttributeArguments = false, bool isAssemblyAttribute = false, bool addNewLine = true) { using (IEnumerator <AttributeData> en = attributes .Where(f => predicate(f.AttributeClass)) .OrderBy(f => ToDisplayString(f.AttributeClass, containingNamespace)).GetEnumerator()) { if (en.MoveNext()) { builder.AddPunctuation("["); if (isAssemblyAttribute) { builder.AddKeyword("assembly"); builder.AddPunctuation(":"); builder.AddSpace(); } while (true) { builder.AddDisplayParts(en.Current.AttributeClass, containingNamespace); if (includeAttributeArguments) { AddAttributeArguments(en.Current); } if (en.MoveNext()) { if (splitAttributes) { builder.AddPunctuation("]"); if (addNewLine) { builder.AddLineBreak(); } else { builder.AddSpace(); } builder.AddPunctuation("["); if (isAssemblyAttribute) { builder.AddKeyword("assembly"); builder.AddPunctuation(":"); builder.AddSpace(); } } else { builder.AddPunctuation(","); builder.AddSpace(); } } else { break; } } builder.AddPunctuation("]"); if (addNewLine) { builder.AddLineBreak(); } } } void AddAttributeArguments(AttributeData attributeData) { bool hasConstructorArgument = false; bool hasNamedArgument = false; AppendConstructorArguments(); AppendNamedArguments(); if (hasConstructorArgument || hasNamedArgument) { builder.AddPunctuation(")"); } void AppendConstructorArguments() { ImmutableArray <TypedConstant> .Enumerator en = attributeData.ConstructorArguments.GetEnumerator(); if (en.MoveNext()) { hasConstructorArgument = true; builder.AddPunctuation("("); while (true) { AddConstantValue(en.Current); if (en.MoveNext()) { builder.AddPunctuation(","); builder.AddSpace(); } else { break; } } } } void AppendNamedArguments() { ImmutableArray <KeyValuePair <string, TypedConstant> > .Enumerator en = attributeData.NamedArguments.GetEnumerator(); if (en.MoveNext()) { hasNamedArgument = true; if (hasConstructorArgument) { builder.AddPunctuation(","); builder.AddSpace(); } else { builder.AddPunctuation("("); } while (true) { builder.Add(new SymbolDisplayPart(SymbolDisplayPartKind.PropertyName, null, en.Current.Key)); builder.AddSpace(); builder.AddPunctuation("="); builder.AddSpace(); AddConstantValue(en.Current.Value); if (en.MoveNext()) { builder.AddPunctuation(","); builder.AddSpace(); } else { break; } } } } } void AddConstantValue(TypedConstant typedConstant) { switch (typedConstant.Kind) { case TypedConstantKind.Primitive: { builder.Add(new SymbolDisplayPart( GetSymbolDisplayPart(typedConstant.Type.SpecialType), null, SymbolDisplay.FormatPrimitive(typedConstant.Value, quoteStrings: true, useHexadecimalNumbers: false))); break; } case TypedConstantKind.Enum: { OneOrMany <EnumFieldInfo> oneOrMany = EnumUtility.GetConstituentFields(typedConstant.Value, (INamedTypeSymbol)typedConstant.Type); OneOrMany <EnumFieldInfo> .Enumerator en = oneOrMany.GetEnumerator(); if (en.MoveNext()) { while (true) { AddDisplayParts(builder, en.Current.Symbol, containingNamespace); if (en.MoveNext()) { builder.AddSpace(); builder.AddPunctuation("|"); builder.AddSpace(); } else { break; } } } else { builder.AddPunctuation("("); AddDisplayParts(builder, (INamedTypeSymbol)typedConstant.Type, containingNamespace); builder.AddPunctuation(")"); builder.Add(new SymbolDisplayPart(SymbolDisplayPartKind.NumericLiteral, null, typedConstant.Value.ToString())); } break; } case TypedConstantKind.Type: { builder.AddKeyword("typeof"); builder.AddPunctuation("("); AddDisplayParts(builder, (ISymbol)typedConstant.Value, containingNamespace); builder.AddPunctuation(")"); break; } case TypedConstantKind.Array: { var arrayType = (IArrayTypeSymbol)typedConstant.Type; builder.AddKeyword("new"); builder.AddSpace(); AddDisplayParts(builder, arrayType.ElementType, containingNamespace); builder.AddPunctuation("["); builder.AddPunctuation("]"); builder.AddSpace(); builder.AddPunctuation("{"); builder.AddSpace(); ImmutableArray <TypedConstant> .Enumerator en = typedConstant.Values.GetEnumerator(); if (en.MoveNext()) { while (true) { AddConstantValue(en.Current); if (en.MoveNext()) { builder.AddPunctuation(","); builder.AddSpace(); } else { break; } } } builder.AddSpace(); builder.AddPunctuation("}"); break; } default: { throw new InvalidOperationException(); } } SymbolDisplayPartKind GetSymbolDisplayPart(SpecialType specialType) { switch (specialType) { case SpecialType.System_Boolean: return(SymbolDisplayPartKind.Keyword); case SpecialType.System_SByte: case SpecialType.System_Byte: case SpecialType.System_Int16: case SpecialType.System_UInt16: case SpecialType.System_Int32: case SpecialType.System_UInt32: case SpecialType.System_Int64: case SpecialType.System_UInt64: case SpecialType.System_Single: case SpecialType.System_Double: return(SymbolDisplayPartKind.NumericLiteral); case SpecialType.System_Char: case SpecialType.System_String: return(SymbolDisplayPartKind.StringLiteral); default: throw new InvalidOperationException(); } } } }