コード例 #1
0
        static string GetFullNameCore(TypeDeclarationSyntax typeDeclaration, DeclarationFullNameFlags flags)
        {
            var ident = new List <string>(10)
            {
                $"{typeDeclaration.Identifier}{typeDeclaration.TypeParameterList}"
            };
            var parent = typeDeclaration.Parent;

            while (parent != null)
            {
                if (parent is TypeDeclarationSyntax type)
                {
                    ident.Add(type.Identifier.ToString());
                    parent = parent.Parent;
                    continue;
                }

                if ((flags & DeclarationFullNameFlags.WithoutNamespaceName) == 0 && parent is NamespaceDeclarationSyntax ns)
                {
                    ident.Add(ns.Name.ToString());
                    parent = parent.Parent;
                    continue;
                }

                break;
            }

            ident.Reverse();
            return(string.Join(".", ident));
        }
コード例 #2
0
        /// <summary>
        /// Retrieves the fully qualified name of the given symbol.
        /// </summary>
        /// <param name="symbol"></param>
        /// <param name="flags"></param>
        /// <returns></returns>
        public static string GetFullName(this ISymbol symbol, DeclarationFullNameFlags flags = DeclarationFullNameFlags.Default)
        {
            var ident = new List <string>(10)
            {
                symbol.Name
            };
            var parent = symbol.ContainingSymbol;

            while (parent != null)
            {
                if (parent is INamespaceSymbol ns && ns.IsGlobalNamespace)
                {
                    break;
                }
                if ((flags & DeclarationFullNameFlags.WithoutNamespaceName) != 0 && parent is INamespaceSymbol)
                {
                    break;
                }
                ident.Add(parent.Name);
                parent = parent.ContainingSymbol;
            }

            ident.Reverse();
            return(string.Join(".", ident));
        }
コード例 #3
0
        /// <summary>
        /// Retrieves the fully qualified name of the given type declaration.
        /// </summary>
        /// <param name="declaration"></param>
        /// <param name="flags"></param>
        /// <returns></returns>
        public static string GetFullName(this MemberDeclarationSyntax declaration, DeclarationFullNameFlags flags = DeclarationFullNameFlags.Default)
        {
            if (declaration == null)
            {
                return(null);
            }

            if (declaration is TypeDeclarationSyntax typeDeclaration)
            {
                return(GetFullNameCore(typeDeclaration, flags));
            }

            if (declaration is FieldDeclarationSyntax)
            {
                throw new ArgumentException("Cannot get full names of field declarations as they may contain multiple fields. Retrieve the full names of the individual variable declarators.", nameof(declaration));
            }

            if (declaration is ConstructorDeclarationSyntax constructorDeclaration)
            {
                var parentName = GetFullName(constructorDeclaration.Parent as MemberDeclarationSyntax);
                if (parentName != null)
                {
                    return($"{parentName}..ctor");
                }
                return(".ctor");
            }
            if (declaration is MethodDeclarationSyntax methodDeclaration)
            {
                var parentName = GetFullName(methodDeclaration.Parent as MemberDeclarationSyntax);
                if (parentName != null)
                {
                    return($"{parentName}.{methodDeclaration.Identifier}");
                }
                return(methodDeclaration.Identifier.ToString());
            }
            if (declaration is EventDeclarationSyntax eventDeclaration)
            {
                var parentName = GetFullName(eventDeclaration.Parent as MemberDeclarationSyntax);
                if (parentName != null)
                {
                    return($"{parentName}.{eventDeclaration.Identifier}");
                }
                return(eventDeclaration.Identifier.ToString());
            }

            if (declaration is DelegateDeclarationSyntax delegateDeclaration)
            {
                var parentName = GetFullName(delegateDeclaration.Parent as MemberDeclarationSyntax);
                if (parentName != null)
                {
                    return($"{parentName}.{delegateDeclaration.Identifier}");
                }
                return(delegateDeclaration.Identifier.ToString());
            }

            throw new ArgumentException("Do not understand the declaration type", nameof(declaration));
        }
コード例 #4
0
        /// <summary>
        /// Retrieves the fully qualified name of the given type declaration.
        /// </summary>
        /// <param name="declaration"></param>
        /// <param name="flags"></param>
        /// <returns></returns>
        public static string GetFullName(this VariableDeclaratorSyntax declaration, DeclarationFullNameFlags flags = DeclarationFullNameFlags.Default)
        {
            if (declaration == null)
            {
                return(null);
            }

            var parent = declaration.Parent;

            while (!(parent is null || parent is TypeDeclarationSyntax))
            {
                parent = parent.Parent;
            }
            var parentName = GetFullName(parent as MemberDeclarationSyntax);

            if (parentName != null)
            {
                return($"{parentName}.{declaration.Identifier}");
            }

            return(declaration.Identifier.ToString());
        }
コード例 #5
0
        /// <summary>
        /// Retrieves the fully qualified name of the given symbol.
        /// </summary>
        /// <param name="symbol"></param>
        /// <param name="flags"></param>
        /// <returns></returns>
        public static string GetFullName(this ISymbol symbol, DeclarationFullNameFlags flags = DeclarationFullNameFlags.Default)
        {
            if (symbol is INamedTypeSymbol namedType)
            {
                var declaratorSyntax = namedType
                                       .DeclaringSyntaxReferences
                                       .FirstOrDefault()
                                       ?.GetSyntax();
                if (declaratorSyntax is TypeDeclarationSyntax typeDeclaration)
                {
                    return(typeDeclaration.GetFullName(flags));
                }
            }
            var ident = new List <string>(10)
            {
                symbol.Name
            };
            var parent = symbol.ContainingSymbol;

            while (parent != null)
            {
                if (parent is INamespaceSymbol ns && ns.IsGlobalNamespace)
                {
                    break;
                }
                if ((flags & DeclarationFullNameFlags.WithoutNamespaceName) != 0 && parent is INamespaceSymbol)
                {
                    break;
                }
                ident.Add(parent.Name);
                parent = parent.ContainingSymbol;
            }

            ident.Reverse();
            return(string.Join(".", ident));
        }