private static bool IncludeMember(ISymbol member, CODEMEMBERTYPE memberType, Compilation compilation)
        {
            if (!member.CanBeReferencedByName)
            {
                return(false);
            }

            switch (memberType)
            {
            case CODEMEMBERTYPE.CODEMEMBERTYPE_EVENT_HANDLERS:
                // NOTE: the Dev10 C# codebase just returned
                if (member.Kind != SymbolKind.Method)
                {
                    return(false);
                }

                var method = (IMethodSymbol)member;
                if (!method.ReturnsVoid)
                {
                    return(false);
                }

                if (method.Parameters.Length != 2)
                {
                    return(false);
                }

                if (!method.Parameters[0].Type.Equals(compilation.ObjectType))
                {
                    return(false);
                }

                if (!method.Parameters[1].Type.InheritsFromOrEquals(compilation.EventArgsType()))
                {
                    return(false);
                }

                return(true);

            case CODEMEMBERTYPE.CODEMEMBERTYPE_EVENTS:
                return(member.Kind == SymbolKind.Event);

            case CODEMEMBERTYPE.CODEMEMBERTYPE_USER_FUNCTIONS:
                return(member.Kind == SymbolKind.Method);

            default:
                throw new ArgumentException("InvalidValue", nameof(memberType));
            }
        }
        /// <summary>
        /// Get the display names and unique ids of all the members of the given type in <paramref
        /// name="className"/>.
        /// </summary>
        public static IEnumerable <Tuple <string, string> > GetMembers(
            Document document, string className, CODEMEMBERTYPE codeMemberType, CancellationToken cancellationToken)
        {
            var type = document.Project.GetCompilationAsync(cancellationToken).WaitAndGetResult_Venus(cancellationToken).GetTypeByMetadataName(className);

            var compilation   = document.Project.GetCompilationAsync(cancellationToken).WaitAndGetResult_Venus(cancellationToken);
            var semanticModel = document.GetSemanticModelAsync(cancellationToken).WaitAndGetResult_Venus(cancellationToken);

            var allMembers = codeMemberType == CODEMEMBERTYPE.CODEMEMBERTYPE_EVENTS ?
                             semanticModel.LookupSymbols(position: type.Locations[0].SourceSpan.Start, container: type, name: null) :
                             type.GetMembers();

            var members = allMembers.Where(m => IncludeMember(m, codeMemberType, compilation));

            return(members.Select(m => Tuple.Create(m.Name, ConstructMemberId(m))));
        }
        private static bool IncludeMember(ISymbol member, CODEMEMBERTYPE memberType, Compilation compilation)
        {
            if (!member.CanBeReferencedByName)
            {
                return false;
            }

            switch (memberType)
            {
                case CODEMEMBERTYPE.CODEMEMBERTYPE_EVENT_HANDLERS:
                    // NOTE: the Dev10 C# codebase just returned 
                    if (member.Kind != SymbolKind.Method)
                    {
                        return false;
                    }

                    var method = (IMethodSymbol)member;
                    if (!method.ReturnsVoid)
                    {
                        return false;
                    }

                    if (method.Parameters.Length != 2)
                    {
                        return false;
                    }

                    if (!method.Parameters[0].Type.Equals(compilation.ObjectType))
                    {
                        return false;
                    }

                    if (!method.Parameters[1].Type.InheritsFromOrEquals(compilation.EventArgsType()))
                    {
                        return false;
                    }

                    return true;

                case CODEMEMBERTYPE.CODEMEMBERTYPE_EVENTS:
                    return member.Kind == SymbolKind.Event;

                case CODEMEMBERTYPE.CODEMEMBERTYPE_USER_FUNCTIONS:
                    return member.Kind == SymbolKind.Method;

                default:
                    throw new ArgumentException("InvalidValue", "memberType");
            }
        }
        /// <summary>
        /// Get the display names and unique ids of all the members of the given type in <paramref
        /// name="className"/>.
        /// </summary>
        public static IEnumerable<Tuple<string, string>> GetMembers(
            Document document, string className, CODEMEMBERTYPE codeMemberType, CancellationToken cancellationToken)
        {
            var type = document.Project.GetCompilationAsync(cancellationToken).WaitAndGetResult(cancellationToken).GetTypeByMetadataName(className);

            var compilation = document.Project.GetCompilationAsync(cancellationToken).WaitAndGetResult(cancellationToken);
            var semanticModel = document.GetSemanticModelAsync(cancellationToken).WaitAndGetResult(cancellationToken);

            var allMembers = codeMemberType == CODEMEMBERTYPE.CODEMEMBERTYPE_EVENTS ?
                semanticModel.LookupSymbols(position: type.Locations[0].SourceSpan.Start, container: type, name: null) :
                type.GetMembers();

            var members = allMembers.Where(m => IncludeMember(m, codeMemberType, compilation));
            return members.Select(m => Tuple.Create(m.Name, ConstructMemberId(m)));
        }