public void Generate(IAssemblySymbol assembly, TypeDeclarationAnalysis typeDeclarationAnalysis, IProjectFileSystem fileSystem) { GenerateAssemblyAttributes(assembly, fileSystem); GenerateModuleAttributes(assembly, fileSystem); foreach (var(type, reason) in typeDeclarationAnalysis.ReasonsByType) { GenerateType(type, reason, typeDeclarationAnalysis, fileSystem); } }
private void GenerateType(INamedTypeSymbol type, TypeDeclarationReason reason, TypeDeclarationAnalysis typeDeclarationAnalysis, IProjectFileSystem fileSystem) { using var textWriter = fileSystem.CreateText(GetPathForType(type)); using var writer = new IndentedTextWriter(textWriter); var context = new GenerationContext(writer, type.ContainingNamespace); if (!type.ContainingNamespace.IsGlobalNamespace) { writer.Write("namespace "); context.WriteNamespace(type.ContainingNamespace); writer.WriteLine(); writer.WriteLine('{'); writer.Indent++; } var containingTypes = MetadataFacts.GetContainingTypes(type); foreach (var containingType in containingTypes) { WriteContainerTypeHeader(containingType, declareAsPartial: true, context); writer.WriteLine(); writer.WriteLine('{'); writer.Indent++; } var filteredAttributes = type.GetAttributes() .AddRange(PseudoCustomAttributeFacts.GenerateApiAttributes(type)) .Where(a => a.AttributeClass?.HasFullName("System", "Reflection", "DefaultMemberAttribute") != true); if ((reason & (TypeDeclarationReason.ExternallyVisible | TypeDeclarationReason.DeclaresUsedAttribute)) != 0) { WriteAttributes( filteredAttributes, target: null, context, onlyWriteAttributeUsageAttribute: (reason & TypeDeclarationReason.ExternallyVisible) == 0); } WriteAccessibility(type.DeclaredAccessibility, reason, writer); var declareAsPartial = type.GetTypeMembers().Any(typeDeclarationAnalysis.ReasonsByType.ContainsKey); if (type.TypeKind == TypeKind.Delegate) { GenerateDelegate(type, context); } else if (type.TypeKind == TypeKind.Enum) { if (declareAsPartial) { writer.Write("partial "); } GenerateEnum(type, context); } else { if (type.TypeKind == TypeKind.Class) { if (type.IsAbstract && type.IsSealed) { writer.Write("static "); } if (MetadataFacts.HidesBaseMember(type, typeDeclarationAnalysis)) { writer.Write("new "); } if (type.IsSealed) { writer.Write("sealed "); } else if (type.IsAbstract) { writer.Write("abstract "); } } WriteContainerTypeHeader(type, declareAsPartial, context); var generatedBaseType = type.BaseType; if (reason.HasFlag(TypeDeclarationReason.ExternallyVisible)) { var baseTypes = new List <INamedTypeSymbol>(); if (type.BaseType is { SpecialType : not(SpecialType.System_Object or SpecialType.System_ValueType) })