/// <summary> /// Prepares the <see cref="PropertyMemberBuilder"/> from the <paramref name="symbol"/> /// and adds it to <see cref="TypeMemberBuilder.ContentMembers"/> /// </summary> /// <param name="symbol">Source <see cref="INamedTypeSymbol"/></param> /// <param name="root">Builder root</param> /// <param name="type">Parent <see cref="TypeMemberBuilder"/></param> /// <param name="level">Hierarchy level (used to indent the console output)</param> private static void BuildProperty(IPropertySymbol symbol, RootMemberBuilder root, TypeMemberBuilder type, int level) { if (symbol.IsImplicitlyDeclared) { return; } if (symbol.GetAttributes().Any(a => a.AttributeClassString() == "System.Runtime.CompilerServices.CompilerGeneratedAttribute")) { return; } var p = new PropertyMemberBuilder() { Name = symbol.Name, NameBase = symbol.Name.Replace("[]", ""), Symbol = symbol, SourceFiles = symbol.DeclaringSyntaxReferences.Select(dsr => dsr.SyntaxTree.FilePath).ToList(), DocumentationId = symbol.GetDocumentationCommentId(), DocumentationXml = symbol.GetDocumentationCommentXml(), Documentation = Documentation.Read(symbol.GetDocumentationCommentXml()), Modifier = ModifierEnumExtensions.Modifier(symbol.DeclaredAccessibility), IsAbstract = symbol.IsAbstract, IsExtern = symbol.IsExtern, IsSealed = symbol.IsSealed, IsStatic = symbol.IsStatic, IsOverride = symbol.IsOverride, IsVirtual = symbol.IsVirtual, IsReadOnly = symbol.IsReadOnly, IsWriteOnly = symbol.IsWriteOnly, IsIndexer = symbol.IsIndexer, TypeRef = TypeRef.GetOrCreate(symbol.Type, root), IsNew = symbol.GetIsNew(), OverridesSymbol = symbol.OverriddenProperty, ExplicitInterfaceImplementationMemberSymbol = symbol.ExplicitInterfaceImplementations != null && symbol.ExplicitInterfaceImplementations.Length > 0 ? symbol.ExplicitInterfaceImplementations[0] : null }; var propertyModifier = ModifierEnumExtensions.Modifier(symbol.DeclaredAccessibility); var getterModifier = ModifierEnumExtensions.Modifier(symbol.GetMethod?.DeclaredAccessibility ?? symbol.DeclaredAccessibility); var setterModifier = ModifierEnumExtensions.Modifier(symbol.SetMethod?.DeclaredAccessibility ?? symbol.DeclaredAccessibility); if (getterModifier != propertyModifier) { p.GetterModifier = getterModifier.ToModifierString(); } if (setterModifier != propertyModifier) { p.SetterModifier = setterModifier.ToModifierString(); } if (symbol.Parameters != null && symbol.Parameters.Length > 0) { //Process the indexer parameters (the only property kind with parameters p.Parameters = GetMethodParameters(symbol.Parameters, root); p.Name = p.Name.Replace("[]", $"[{string.Join(", ", p.Parameters.Select(param => param.TypeRef.ApplySpecialName(false)))}]"); } p.SetAttributes(root); type.ContentMembers.Add(p); Console.WriteLine($"{new string(' ', level)} read as {p}"); }