Example #1
0
 public static AttributeFilterData GetAttributeFilterData(AttributeData attribute)
 {
     return(new AttributeFilterData
     {
         Id = VisitorHelper.GetId(attribute.AttributeClass),
         ConstructorArguments = attribute.ConstructorArguments.Select(GetLiteralString),
         ConstructorNamedArguments = attribute.NamedArguments.ToDictionary(pair => pair.Key, pair => GetLiteralString(pair.Value))
     });
 }
Example #2
0
        public override MetadataItem VisitMethod(IMethodSymbol symbol)
        {
            MetadataItem result = GetYamlItem(symbol);

            if (result == null)
            {
                return(null);
            }
            if (result.Syntax == null)
            {
                result.Syntax = new SyntaxDetail {
                    Content = new SortedList <SyntaxLanguage, string>()
                };
            }

            if (symbol.TypeParameters.Length > 0)
            {
                if (result.Syntax.TypeParameters == null)
                {
                    result.Syntax.TypeParameters = new List <ApiParameter>();
                }

                foreach (var p in symbol.TypeParameters)
                {
                    var param = VisitorHelper.GetTypeParameterDescription(p, result, GetTripleSlashCommentParserContext(result, _preserveRawInlineComments));
                    result.Syntax.TypeParameters.Add(param);
                }
            }

            var typeGenericParameters = symbol.ContainingType.IsGenericType ? symbol.ContainingType.Accept(TypeGenericParameterNameVisitor.Instance) : EmptyListOfString;

            var methodGenericParameters = symbol.IsGenericMethod ? (from p in symbol.TypeParameters select p.Name).ToList() : EmptyListOfString;

            AddMethodSyntax(symbol, result, typeGenericParameters, methodGenericParameters);

            if (result.Syntax.Content == null)
            {
                result.Syntax.Content = new SortedList <SyntaxLanguage, string>();
            }
            _generator.GenerateSyntax(result.Type, symbol, result.Syntax, this);

            _generator.GenerateMethod(symbol, result, this);

            if (symbol.IsOverride && symbol.OverriddenMethod != null)
            {
                result.Overridden = AddSpecReference(symbol.OverriddenMethod, typeGenericParameters, methodGenericParameters);
            }

            AddMemberImplements(symbol, result, typeGenericParameters, methodGenericParameters);

            result.Attributes = GetAttributeInfo(symbol.GetAttributes());

            result.IsExplicitInterfaceImplementation = !symbol.ExplicitInterfaceImplementations.IsEmpty;
            result.IsExtensionMethod = symbol.IsExtensionMethod;

            return(result);
        }
Example #3
0
 public static SymbolFilterData GetSymbolFilterData(ISymbol symbol)
 {
     return(new SymbolFilterData
     {
         Id = VisitorHelper.GetId(symbol),
         Kind = GetExtendedSymbolKindFromSymbol(symbol),
         Attributes = symbol.GetAttributes().Select(GetAttributeFilterData)
     });
 }
Example #4
0
        public override MetadataItem VisitProperty(IPropertySymbol symbol)
        {
            MetadataItem result = GetYamlItem(symbol);

            if (result == null)
            {
                return(null);
            }
            if (result.Syntax == null)
            {
                result.Syntax = new SyntaxDetail {
                    Content = new SortedList <SyntaxLanguage, string>()
                };
            }
            if (result.Syntax.Parameters == null)
            {
                result.Syntax.Parameters = new List <ApiParameter>();
            }
            if (result.Syntax.Content == null)
            {
                result.Syntax.Content = new SortedList <SyntaxLanguage, string>();
            }
            _generator.GenerateSyntax(result.Type, symbol, result.Syntax, this);

            var typeGenericParameters = symbol.ContainingType.IsGenericType ? symbol.ContainingType.Accept(TypeGenericParameterNameVisitor.Instance) : EmptyListOfString;

            if (symbol.Parameters.Length > 0)
            {
                foreach (var p in symbol.Parameters)
                {
                    var id    = AddSpecReference(p.Type, typeGenericParameters);
                    var param = VisitorHelper.GetParameterDescription(p, result, id, false, GetTripleSlashCommentParserContext(result, _preserveRawInlineComments));
                    Debug.Assert(param.Type != null);
                    result.Syntax.Parameters.Add(param);
                }
            }
            {
                var id = AddSpecReference(symbol.Type, typeGenericParameters);
                result.Syntax.Return = VisitorHelper.GetParameterDescription(symbol, result, id, true, GetTripleSlashCommentParserContext(result, _preserveRawInlineComments));
                Debug.Assert(result.Syntax.Return.Type != null);
            }

            if (symbol.IsOverride && symbol.OverriddenProperty != null)
            {
                result.Overridden = AddSpecReference(symbol.OverriddenProperty, typeGenericParameters);
            }

            _generator.GenerateProperty(symbol, result, this);

            AddMemberImplements(symbol, result, typeGenericParameters);

            result.Attributes = GetAttributeInfo(symbol.GetAttributes());

            result.IsExplicitInterfaceImplementation = !symbol.ExplicitInterfaceImplementations.IsEmpty;

            return(result);
        }
Example #5
0
        public override MetadataItem DefaultVisit(ISymbol symbol)
        {
            if (!FilterVisitor.CanVisitApi(symbol))
            {
                return(null);
            }
            var item = new MetadataItem
            {
                Name       = VisitorHelper.GetId(symbol),
                CommentId  = VisitorHelper.GetCommentId(symbol),
                RawComment = symbol.GetDocumentationCommentXml(),
                Language   = Language,
            };

            item.DisplayNames          = new SortedList <SyntaxLanguage, string>();
            item.DisplayNamesWithType  = new SortedList <SyntaxLanguage, string>();
            item.DisplayQualifiedNames = new SortedList <SyntaxLanguage, string>();
            item.Source = VisitorHelper.GetSourceDetail(symbol);
            var assemblyName = symbol.ContainingAssembly?.Name;

            item.AssemblyNameList = string.IsNullOrEmpty(assemblyName) ? null : new List <string> {
                assemblyName
            };
            if (!(symbol is INamespaceSymbol))
            {
                var namespaceName = VisitorHelper.GetId(symbol.ContainingNamespace);
                item.NamespaceName = string.IsNullOrEmpty(namespaceName) ? null : namespaceName;
            }

            VisitorHelper.FeedComments(item, GetTripleSlashCommentParserContext(item, _preserveRawInlineComments));
            if (item.Exceptions != null)
            {
                foreach (var exceptions in item.Exceptions)
                {
                    AddReference(exceptions.Type, exceptions.CommentId);
                }
            }

            if (item.Sees != null)
            {
                foreach (var i in item.Sees.Where(l => l.LinkType == LinkType.CRef))
                {
                    AddReference(i.LinkId, i.CommentId);
                }
            }

            if (item.SeeAlsos != null)
            {
                foreach (var i in item.SeeAlsos.Where(l => l.LinkType == LinkType.CRef))
                {
                    AddReference(i.LinkId, i.CommentId);
                }
            }

            _generator.DefaultVisit(symbol, item, this);
            return(item);
        }
Example #6
0
        /// <summary>
        /// spec extension method's receiver type.
        /// for below overload: M(this A), M(this A, A), AddReference applies to the first method and AddSpecReference applies to the second method might get same id without prepending receiver type.
        /// </summary>
        /// <param name="symbol">symbol</param>
        /// <param name="id">id</param>
        /// <returns>id prefixed with receiver type</returns>
        private static string SpecExtensionMethodReceiverType(IMethodSymbol symbol, string id)
        {
            if (symbol.ReducedFrom == null || symbol.ReceiverType == null)
            {
                return(id);
            }

            return(VisitorHelper.GetId(symbol.ReceiverType) + "." + id);
        }
 public bool IsMatch(ISymbol symbol)
 {
     if (symbol == null)
     {
         throw new ArgumentNullException("symbol");
     }
     return((_uidRegex == null || _uidRegex.IsMatch(VisitorHelper.GetId(symbol))) &&
            (Kind == null || Kind.Value.Contains(symbol)) &&
            (Attribute == null || Attribute.ContainedIn(symbol)));
 }
        public override void VisitDynamicType(IDynamicTypeSymbol symbol)
        {
            var id = VisitorHelper.GetId(symbol.OriginalDefinition);

            ReferenceItem.Parts[SyntaxLanguage.CSharp].Add(new LinkItem
            {
                DisplayName           = NameVisitorCreator.GetCSharp(NameOptions.None).GetName(symbol),
                DisplayNamesWithType  = NameVisitorCreator.GetCSharp(NameOptions.WithType).GetName(symbol),
                DisplayQualifiedNames = NameVisitorCreator.GetCSharp(NameOptions.Qualified).GetName(symbol),
                Name = id,
            });
        }
Example #9
0
        public override void VisitField(IFieldSymbol symbol)
        {
            var id = VisitorHelper.GetId(symbol.OriginalDefinition);

            ReferenceItem.Parts[SyntaxLanguage.VB].Add(new LinkItem
            {
                DisplayName           = NameVisitorCreator.GetVB(NameOptions.WithGenericParameter).GetName(symbol),
                DisplayQualifiedNames = NameVisitorCreator.GetVB(NameOptions.Qualified | NameOptions.WithGenericParameter).GetName(symbol),
                Name           = id,
                IsExternalPath = symbol.IsExtern || symbol.DeclaringSyntaxReferences.Length == 0,
            });
        }
Example #10
0
 public string AddSpecReference(
     ISymbol symbol,
     IReadOnlyList <string> typeGenericParameters   = null,
     IReadOnlyList <string> methodGenericParameters = null)
 {
     try
     {
         return(_generator.AddSpecReference(symbol, typeGenericParameters, methodGenericParameters, _references, this));
     }
     catch (Exception ex)
     {
         throw new DocfxException($"Unable to generate spec reference for {VisitorHelper.GetCommentId(symbol)}", ex);
     }
 }
Example #11
0
        internal string AddSpecReference(
            ISymbol symbol,
            IReadOnlyList <string> typeGenericParameters,
            IReadOnlyList <string> methodGenericParameters,
            Dictionary <string, ReferenceItem> references,
            SymbolVisitorAdapter adapter)
        {
            var rawId = VisitorHelper.GetId(symbol);
            var id    = SpecIdHelper.GetSpecId(symbol, typeGenericParameters, methodGenericParameters);

            if (string.IsNullOrEmpty(id))
            {
                throw new InvalidDataException($"Fail to parse id for symbol {symbol.MetadataName} in namespace {symbol.ContainingSymbol?.MetadataName}.");
            }
            ReferenceItem reference = new ReferenceItem()
            {
                Parts = new SortedList <SyntaxLanguage, List <LinkItem> >()
            };

            GenerateReferenceInternal(symbol, reference, adapter);
            var originalSymbol = symbol;
            var reducedFrom    = (symbol as IMethodSymbol)?.ReducedFrom;

            if (reducedFrom != null)
            {
                originalSymbol = reducedFrom;
            }
            reference.IsDefinition = (originalSymbol == symbol) && (id == rawId) && (symbol.IsDefinition || VisitorHelper.GetId(symbol.OriginalDefinition) == rawId);

            if (!reference.IsDefinition.Value && rawId != null)
            {
                reference.Definition = AddReference(originalSymbol.OriginalDefinition, references, adapter);
            }

            reference.Parent    = GetReferenceParent(originalSymbol, typeGenericParameters, methodGenericParameters, references, adapter);
            reference.CommentId = VisitorHelper.GetCommentId(originalSymbol);

            if (!references.ContainsKey(id))
            {
                references[id] = reference;
            }
            else
            {
                references[id].Merge(reference);
            }

            return(id);
        }
Example #12
0
        public override void VisitMethod(IMethodSymbol symbol)
        {
            var id = _asOverload ? VisitorHelper.GetOverloadId(symbol.OriginalDefinition) : VisitorHelper.GetId(symbol.OriginalDefinition);

            ReferenceItem.Parts[SyntaxLanguage.VB].Add(new LinkItem
            {
                DisplayName           = NameVisitorCreator.GetVB(_asOverload ? NameOptions.WithMethodGenericParameter : NameOptions.WithGenericParameter).GetName(symbol),
                DisplayNamesWithType  = NameVisitorCreator.GetVB(NameOptions.WithType | (_asOverload ? NameOptions.WithMethodGenericParameter : NameOptions.WithGenericParameter)).GetName(symbol),
                DisplayQualifiedNames = NameVisitorCreator.GetVB(NameOptions.Qualified | (_asOverload ? NameOptions.WithMethodGenericParameter : NameOptions.WithGenericParameter)).GetName(symbol),
                Name           = id,
                IsExternalPath = symbol.IsExtern || symbol.DeclaringSyntaxReferences.Length == 0,
            });
            if (_asOverload)
            {
                return;
            }
            ReferenceItem.Parts[SyntaxLanguage.VB].Add(new LinkItem
            {
                DisplayName           = "(",
                DisplayNamesWithType  = "(",
                DisplayQualifiedNames = "(",
            });
            for (int i = 0; i < symbol.Parameters.Length; i++)
            {
                if (i > 0)
                {
                    ReferenceItem.Parts[SyntaxLanguage.VB].Add(new LinkItem
                    {
                        DisplayName           = ", ",
                        DisplayNamesWithType  = ", ",
                        DisplayQualifiedNames = ", ",
                    });
                }
                symbol.Parameters[i].Type.Accept(this);
            }
            ReferenceItem.Parts[SyntaxLanguage.VB].Add(new LinkItem
            {
                DisplayName           = ")",
                DisplayNamesWithType  = ")",
                DisplayQualifiedNames = ")",
            });
        }
Example #13
0
        private static string GetLiteralString(TypedConstant constant)
        {
            if (constant.Kind == TypedConstantKind.Enum)
            {
                var namedType = (INamedTypeSymbol)constant.Type;
                var name      = (from member in namedType.GetMembers().OfType <IFieldSymbol>()
                                 where member.IsConst && member.HasConstantValue
                                 where constant.Value.Equals(member.ConstantValue)
                                 select member.Name).FirstOrDefault();

                if (name != null)
                {
                    return($"{VisitorHelper.GetId(namedType)}.{name}");
                }

                // todo : define filter data format (language neutral), just use number for combine case by now.
                // e.g.: [Flags] public enum E { X=1,Y=2,Z=4,YZ=6 }
                // Case: [E(E.X | E.Y)]
                // Case: [E((E)99)]
                // Case: [E(E.X | E.YZ)]
                return(constant.Value.ToString());
            }

            if (constant.Kind == TypedConstantKind.Array)
            {
                if (constant.Values.IsDefaultOrEmpty)
                {
                    return("");
                }

                return(string.Join(",", constant.Values.Select(GetLiteralString)));
            }

            var value = constant.Value;

            if (value is ISymbol)
            {
                return(VisitorHelper.GetId(constant.Value as ISymbol));
            }

            return(value?.ToString() ?? "null");
        }
Example #14
0
        internal string AddSpecReference(
            ISymbol symbol,
            IReadOnlyList <string> typeGenericParameters,
            IReadOnlyList <string> methodGenericParameters,
            Dictionary <string, ReferenceItem> references,
            SymbolVisitorAdapter adapter)
        {
            var           rawId     = VisitorHelper.GetId(symbol);
            var           id        = SpecIdHelper.GetSpecId(symbol, typeGenericParameters, methodGenericParameters);
            ReferenceItem reference = new ReferenceItem();

            reference.Parts = new SortedList <SyntaxLanguage, List <LinkItem> >();
            GenerateReferenceInternal(symbol, reference, adapter);
            var originalSymbol = symbol;
            var reducedFrom    = (symbol as IMethodSymbol)?.ReducedFrom;

            if (reducedFrom != null)
            {
                originalSymbol = reducedFrom;
            }
            reference.IsDefinition = (originalSymbol == symbol) && (id == rawId) && symbol.IsDefinition;

            if (!reference.IsDefinition.Value && rawId != null)
            {
                reference.Definition = AddReference(originalSymbol.OriginalDefinition, references, adapter);
            }

            reference.Parent    = GetReferenceParent(originalSymbol, typeGenericParameters, methodGenericParameters, references, adapter);
            reference.CommentId = VisitorHelper.GetCommentId(originalSymbol);

            if (!references.ContainsKey(id))
            {
                references[id] = reference;
            }
            else
            {
                references[id].Merge(reference);
            }

            return(id);
        }
Example #15
0
        public override void VisitProperty(IPropertySymbol symbol)
        {
            var id = _asOverload ? VisitorHelper.GetOverloadId(symbol.OriginalDefinition) : VisitorHelper.GetId(symbol.OriginalDefinition);

            ReferenceItem.Parts[SyntaxLanguage.CSharp].Add(new LinkItem
            {
                DisplayName           = NameVisitorCreator.GetCSharp(NameOptions.WithTypeGenericParameter).GetName(symbol),
                DisplayNamesWithType  = NameVisitorCreator.GetCSharp(NameOptions.WithType | NameOptions.WithTypeGenericParameter).GetName(symbol),
                DisplayQualifiedNames = NameVisitorCreator.GetCSharp(NameOptions.Qualified | NameOptions.WithTypeGenericParameter).GetName(symbol),
                Name           = id,
                IsExternalPath = symbol.IsExtern || symbol.DeclaringSyntaxReferences.Length == 0,
            });
            if (symbol.Parameters.Length > 0 && !_asOverload)
            {
                ReferenceItem.Parts[SyntaxLanguage.CSharp].Add(new LinkItem
                {
                    DisplayName           = "[",
                    DisplayNamesWithType  = "[",
                    DisplayQualifiedNames = "[",
                });
                for (int i = 0; i < symbol.Parameters.Length; i++)
                {
                    if (i > 0)
                    {
                        ReferenceItem.Parts[SyntaxLanguage.CSharp].Add(new LinkItem
                        {
                            DisplayName           = ", ",
                            DisplayNamesWithType  = ", ",
                            DisplayQualifiedNames = ", ",
                        });
                    }
                    symbol.Parameters[i].Type.Accept(this);
                }
                ReferenceItem.Parts[SyntaxLanguage.CSharp].Add(new LinkItem
                {
                    DisplayName           = "]",
                    DisplayNamesWithType  = "]",
                    DisplayQualifiedNames = "]",
                });
            }
        }
Example #16
0
        internal string AddReference(ISymbol symbol, Dictionary <string, ReferenceItem> references, SymbolVisitorAdapter adapter)
        {
            var id = VisitorHelper.GetId(symbol);

            ReferenceItem reference = new ReferenceItem();

            reference.Parts        = new SortedList <SyntaxLanguage, List <LinkItem> >();
            reference.IsDefinition = symbol.IsDefinition;
            GenerateReferenceInternal(symbol, reference, adapter);

            if (!references.ContainsKey(id))
            {
                references[id] = reference;
            }
            else
            {
                references[id].Merge(reference);
            }

            return(id);
        }
Example #17
0
        public override MetadataItem VisitAssembly(IAssemblySymbol symbol)
        {
            var item = new MetadataItem
            {
                Name       = VisitorHelper.GetId(symbol),
                RawComment = symbol.GetDocumentationCommentXml(),
                Language   = Language,
            };

            item.DisplayNames = new SortedList <SyntaxLanguage, string>
            {
                { SyntaxLanguage.Default, symbol.MetadataName },
            };
            item.DisplayQualifiedNames = new SortedList <SyntaxLanguage, string>
            {
                { SyntaxLanguage.Default, symbol.MetadataName },
            };
            item.Type   = MemberType.Assembly;
            _references = new Dictionary <string, ReferenceItem>();

            IEnumerable <INamespaceSymbol> namespaces;

            if (!string.IsNullOrEmpty(VisitorHelper.GlobalNamespaceId))
            {
                namespaces = Enumerable.Repeat(symbol.GlobalNamespace, 1);
            }
            else
            {
                namespaces = symbol.GlobalNamespace.GetNamespaceMembers();
            }


            item.Items = VisitDescendants(
                namespaces,
                ns => ns.GetMembers().OfType <INamespaceSymbol>(),
                ns => ns.GetMembers().OfType <INamedTypeSymbol>().Any(t => FilterVisitor.CanVisitApi(t)));
            item.References = _references;
            return(item);
        }
Example #18
0
        private static string GetLiteralString(TypedConstant constant)
        {
            var type  = constant.Type;
            var value = constant.Value;

            if (type.TypeKind == TypeKind.Enum)
            {
                var namedType = (INamedTypeSymbol)type;
                var pairs     = (from member in namedType.GetMembers().OfType <IFieldSymbol>()
                                 where member.IsConst && member.HasConstantValue
                                 select Tuple.Create(member.Name, member.ConstantValue)).ToDictionary(tuple => tuple.Item2, tuple => tuple.Item1);

                return($"{VisitorHelper.GetId(namedType)}.{pairs[value]}");
            }

            if (value is ITypeSymbol)
            {
                return(VisitorHelper.GetId((ITypeSymbol)value));
            }

            return(value.ToString());
        }
Example #19
0
        public override MetadataItem VisitEvent(IEventSymbol symbol)
        {
            MetadataItem result = GetYamlItem(symbol);

            if (result == null)
            {
                return(null);
            }
            if (result.Syntax == null)
            {
                result.Syntax = new SyntaxDetail {
                    Content = new SortedList <SyntaxLanguage, string>()
                };
            }
            if (result.Syntax.Content == null)
            {
                result.Syntax.Content = new SortedList <SyntaxLanguage, string>();
            }
            _generator.GenerateSyntax(result.Type, symbol, result.Syntax, this);
            _generator.GenerateEvent(symbol, result, this);

            var typeGenericParameters = symbol.ContainingType.IsGenericType ? symbol.ContainingType.Accept(TypeGenericParameterNameVisitor.Instance) : EmptyListOfString;

            if (symbol.IsOverride && symbol.OverriddenEvent != null)
            {
                result.Overridden = AddSpecReference(symbol.OverriddenEvent, typeGenericParameters);
            }

            var id = AddSpecReference(symbol.Type, typeGenericParameters);

            result.Syntax.Return = VisitorHelper.GetParameterDescription(symbol, result, id, true, GetTripleSlashCommentParserContext(result, _preserveRawInlineComments));
            Debug.Assert(result.Syntax.Return.Type != null);

            result.Attributes = GetAttributeInfo(symbol.GetAttributes());

            return(result);
        }
Example #20
0
        public override MetadataItem VisitAssembly(IAssemblySymbol symbol)
        {
            var item = new MetadataItem
            {
                Name       = VisitorHelper.GetId(symbol),
                RawComment = symbol.GetDocumentationCommentXml(),
                Language   = Language,
            };

            item.DisplayNames = new SortedList <SyntaxLanguage, string>
            {
                { SyntaxLanguage.Default, symbol.MetadataName },
            };
            item.DisplayQualifiedNames = new SortedList <SyntaxLanguage, string>
            {
                { SyntaxLanguage.Default, symbol.MetadataName },
            };
            item.Type   = MemberType.Assembly;
            _references = new Dictionary <string, ReferenceItem>();

            var typeMembers = symbol.GlobalNamespace.GetTypeMembers();

            if (typeMembers.Any())
            {
                Logger.LogWarning($"DocFX currently only supports generating metadata with namespace defined. The following types in assembly \"{symbol.MetadataName}\" will have no metadata generated: {string.Join(", ", typeMembers.Select(m => m.MetadataName))}. ");
            }

            var namespaces = symbol.GlobalNamespace.GetNamespaceMembers().ToList();

            item.Items = VisitDescendants(
                namespaces,
                ns => ns.GetMembers().OfType <INamespaceSymbol>(),
                ns => ns.GetMembers().OfType <INamedTypeSymbol>().Any(t => FilterVisitor.CanVisitApi(t)));
            item.References = _references;
            return(item);
        }
Example #21
0
        internal string AddOverloadReference(ISymbol symbol, Dictionary <string, ReferenceItem> references, SymbolVisitorAdapter adapter)
        {
            string uidBody = VisitorHelper.GetOverloadIdBody(symbol);

            ReferenceItem reference = new ReferenceItem();

            reference.Parts        = new SortedList <SyntaxLanguage, List <LinkItem> >();
            reference.IsDefinition = true;
            reference.CommentId    = "Overload:" + uidBody;
            GenerateReferenceInternal(symbol, reference, adapter, true);

            var uid = uidBody + "*";

            if (!references.ContainsKey(uid))
            {
                references[uid] = reference;
            }
            else
            {
                references[uid].Merge(reference);
            }

            return(uid);
        }
 /// <summary>
 /// return a symbol in the assigned container
 /// </summary>
 /// <param name="container">container</param>
 /// <param name="symbol">symbol</param>
 /// <returns>related symbol in the compilation</returns>
 public static ISymbol FindSymbol(this INamespaceOrTypeSymbol container, ISymbol symbol)
 {
     return(FindCore(container, GetQualifiedNameList(symbol)).Where(m => VisitorHelper.GetCommentId(m) == VisitorHelper.GetCommentId(symbol)).FirstOrDefault());
 }
Example #23
0
        private MemberType GetMemberTypeFromSymbol(ISymbol symbol)
        {
            switch (symbol.Kind)
            {
            case SymbolKind.Namespace:
                return(MemberType.Namespace);

            case SymbolKind.NamedType:
                INamedTypeSymbol nameTypeSymbol = symbol as INamedTypeSymbol;
                Debug.Assert(nameTypeSymbol != null);
                if (nameTypeSymbol != null)
                {
                    return(VisitorHelper.GetMemberTypeFromTypeKind(nameTypeSymbol.TypeKind));
                }
                else
                {
                    return(MemberType.Default);
                }

            case SymbolKind.Event:
                return(MemberType.Event);

            case SymbolKind.Field:
                return(MemberType.Field);

            case SymbolKind.Property:
                return(MemberType.Property);

            case SymbolKind.Method:
            {
                var methodSymbol = symbol as IMethodSymbol;
                Debug.Assert(methodSymbol != null);
                if (methodSymbol == null)
                {
                    return(MemberType.Default);
                }
                switch (methodSymbol.MethodKind)
                {
                case MethodKind.AnonymousFunction:
                case MethodKind.DelegateInvoke:
                case MethodKind.Destructor:
                case MethodKind.ExplicitInterfaceImplementation:
                case MethodKind.Ordinary:
                case MethodKind.ReducedExtension:
                case MethodKind.DeclareMethod:
                    return(MemberType.Method);

                case MethodKind.BuiltinOperator:
                case MethodKind.UserDefinedOperator:
                case MethodKind.Conversion:
                    return(MemberType.Operator);

                case MethodKind.Constructor:
                case MethodKind.StaticConstructor:
                    return(MemberType.Constructor);

                // ignore: Property's get/set, and event's add/remove/raise
                case MethodKind.PropertyGet:
                case MethodKind.PropertySet:
                case MethodKind.EventAdd:
                case MethodKind.EventRemove:
                case MethodKind.EventRaise:
                default:
                    return(MemberType.Default);
                }
            }

            default:
                return(MemberType.Default);
            }
        }
Example #24
0
        public override MetadataItem VisitNamedType(INamedTypeSymbol symbol)
        {
            var item = DefaultVisit(symbol);

            if (item == null)
            {
                return(null);
            }

            GenerateInheritance(symbol, item);

            item.Type = VisitorHelper.GetMemberTypeFromTypeKind(symbol.TypeKind);
            if (item.Syntax == null)
            {
                item.Syntax = new SyntaxDetail {
                    Content = new SortedList <SyntaxLanguage, string>()
                };
            }
            if (item.Syntax.Content == null)
            {
                item.Syntax.Content = new SortedList <SyntaxLanguage, string>();
            }
            _generator.GenerateSyntax(item.Type, symbol, item.Syntax, this);

            if (symbol.TypeParameters.Length > 0)
            {
                if (item.Syntax.TypeParameters == null)
                {
                    item.Syntax.TypeParameters = new List <ApiParameter>();
                }

                foreach (var p in symbol.TypeParameters)
                {
                    var param = VisitorHelper.GetTypeParameterDescription(p, item, GetTripleSlashCommentParserContext(item, _preserveRawInlineComments));
                    item.Syntax.TypeParameters.Add(param);
                }
            }

            if (symbol.TypeKind == TypeKind.Delegate)
            {
                var typeGenericParameters = symbol.IsGenericType ? symbol.Accept(TypeGenericParameterNameVisitor.Instance) : EmptyListOfString;
                AddMethodSyntax(symbol.DelegateInvokeMethod, item, typeGenericParameters, EmptyListOfString);
            }

            _generator.GenerateNamedType(symbol, item, this);

            item.Items = new List <MetadataItem>();
            foreach (var member in symbol.GetMembers().Where(s => !(s is INamedTypeSymbol)))
            {
                var memberItem = member.Accept(this);
                if (memberItem != null)
                {
                    item.Items.Add(memberItem);
                }
            }

            AddReference(symbol);

            item.Attributes = GetAttributeInfo(symbol.GetAttributes());

            return(item);
        }
Example #25
0
 public override string DefaultVisit(ISymbol symbol)
 {
     return(VisitorHelper.GetId(symbol));
 }
Example #26
0
        public override void VisitNamedType(INamedTypeSymbol symbol)
        {
            if ((Options & NameOptions.UseAlias) == NameOptions.UseAlias &&
                TrySpecialType(symbol))
            {
                return;
            }
            if (symbol.ContainingType != null)
            {
                symbol.ContainingType.Accept(this);
                Append(".");
            }
            else if ((Options & NameOptions.WithNamespace) == NameOptions.WithNamespace)
            {
                if (!VisitorHelper.InGlobalNamespace(symbol))
                {
                    symbol.ContainingNamespace.Accept(this);
                    Append(".");
                }
            }
            if (symbol.IsTupleType)
            {
                if ((Options & NameOptions.Qualified) == NameOptions.Qualified)
                {
                    Append("ValueTuple");
                    symbol = symbol.TupleUnderlyingType ?? symbol;
                }
                else
                {
                    Append("(");
                    for (var i = 0; i < symbol.TupleElements.Length; i++)
                    {
                        if (i > 0)
                        {
                            Append(", ");
                        }
                        var tupleElement = symbol.TupleElements[i];
                        if (!tupleElement.IsImplicitlyDeclared)
                        {
                            Append(tupleElement.Name);
                            Append(" As ");
                        }
                        tupleElement.Type.Accept(this);
                    }
                    Append(")");
                }
            }
            else
            {
                Append(symbol.Name);
            }

            if ((Options & NameOptions.WithTypeGenericParameter) == NameOptions.WithTypeGenericParameter &&
                symbol.TypeParameters.Length > 0)
            {
                if (symbol.TypeArguments != null && symbol.TypeArguments.Length > 0)
                {
                    if (symbol.IsUnboundGenericType)
                    {
                        WriteGeneric(symbol.TypeArguments.Length);
                    }
                    else
                    {
                        WriteGeneric(symbol.TypeArguments);
                    }
                }
                else
                {
                    WriteGeneric(symbol.TypeParameters);
                }
            }
        }