void SuggestProperties(DataType dt, AccessorLevel accessorLevel, bool staticContext)
        {
            foreach (var member in dt.Properties)
            {
                if (!CompatibleAccessor(accessorLevel, member))
                {
                    continue;
                }
                if (member.IsStatic != staticContext)
                {
                    continue;
                }
                if (!(dt is ArrayType) && member.Modifiers.HasFlag(Modifiers.Generated))
                {
                    continue;
                }
                if ((_context.TypeOrNamespace is DataType) &&
                    !IsMemberAccessible(member, (_context.TypeOrNamespace as DataType)))
                {
                    continue;
                }
                if (_added.Contains(member))
                {
                    continue;
                }
                _added.Add(member.OverriddenProperty);

                var mods = new List <string>();
                if (member.SetMethod == null)
                {
                    mods.Add("readonly");                           //Hackish but want to display readonly for properties too
                }
                Suggest(SuggestItemType.Property, member, member.Name, null, null, () => member.ReturnType.ToString(), mods.ToArray(), null, null, null, SuggestItemPriority.Normal);
            }
        }
 void SuggestEvents(DataType dt, AccessorLevel accessorLevel, bool staticContext)
 {
     foreach (var member in dt.Events)
     {
         if (!CompatibleAccessor(accessorLevel, member))
         {
             continue;
         }
         if (member.IsStatic != staticContext)
         {
             continue;
         }
         if (member.Modifiers.HasFlag(Modifiers.Generated))
         {
             continue;
         }
         if ((_context.TypeOrNamespace is DataType) &&
             !IsMemberAccessible(member, (_context.TypeOrNamespace as DataType)))
         {
             continue;
         }
         var it = SuggestItemType.Field;
         it = SuggestItemType.Event;
         Suggest(it, member, member.Name);
     }
 }
        bool CompatibleAccessor(AccessorLevel level, Modifiers m)
        {
            switch (level)
            {
            case AccessorLevel.Public: return(m.HasFlag(Modifiers.Public));

            case AccessorLevel.Protected: return(m.HasFlag(Modifiers.Public) | m.HasFlag(Modifiers.Protected));
            }

            return(true);
        }
        void SuggestMethods(DataType dt, AccessorLevel accessorLevel, bool staticContext)
        {
            foreach (var member in dt.Methods)
            {
                if (!CompatibleAccessor(accessorLevel, member))
                {
                    continue;
                }
                if (member.IsStatic != staticContext)
                {
                    continue;
                }
                if (member.Modifiers.HasFlag(Modifiers.Generated))
                {
                    continue;
                }
                if ((_context.TypeOrNamespace is DataType) &&
                    !IsMemberAccessible(member, (_context.TypeOrNamespace as DataType)))
                {
                    continue;
                }
                var args = GetMethodArgsFromMethod(member);
                var hash = HashMethod(member.Name, args);
                if (_added.Contains(hash))
                {
                    continue;
                }
                if (member.OverriddenMethod != null)
                {
                    var om = member.OverriddenMethod;
                    _added.Add(HashMethod(om.Name, GetMethodArgsFromMethod(om)));
                }

                var priority = SuggestItemPriority.Normal;

                var accessMods = new List <string>();
                foreach (string mod in member.Modifiers.ToString().ToLower().Split(", "))
                {
                    accessMods.Add(mod);
                }

                Suggest(SuggestItemType.Method, member, member.Name, null, null, () => member.ReturnType.ToString(), accessMods.ToArray(), null, args, null, priority, false);
                _added.Add(hash);
            }
        }
 void SuggestLiterals(DataType dt, AccessorLevel accessorLevel)
 {
     foreach (var c in dt.Literals)
     {
         if (!CompatibleAccessor(accessorLevel, c.Modifiers))
         {
             continue;
         }
         if ((_context.TypeOrNamespace is DataType) &&
             !IsMemberAccessible(c, (_context.TypeOrNamespace as DataType)))
         {
             continue;
         }
         if (_added.Contains(c.Name))
         {
             continue;
         }
         _added.Add(c.Name);
         Suggest(SuggestItemType.Constant, c, c.Name);
     }
 }
 void SuggestField(DataType dt, AccessorLevel accessorLevel, bool staticContext)
 {
     foreach (var member in dt.Fields)
     {
         if (!CompatibleAccessor(accessorLevel, member))
         {
             continue;
         }
         if (member.IsStatic != staticContext)
         {
             continue;
         }
         if (member.Modifiers.HasFlag(Modifiers.Generated))
         {
             continue;
         }
         if ((_context.TypeOrNamespace is DataType) &&
             !IsMemberAccessible(member, (_context.TypeOrNamespace as DataType)))
         {
             continue;
         }
         var it         = SuggestItemType.Field;
         var accessMods = new List <string>();
         var fieldMods  = new List <string>();
         foreach (var s in member.Modifiers.ToString().ToLower().Split(", "))
         {
             accessMods.Add(s);
         }
         if (member.FieldModifiers.HasFlag(FieldModifiers.ReadOnly))
         {
             fieldMods.Add("readonly");
         }
         if (member.FieldModifiers.HasFlag(FieldModifiers.Const))
         {
             fieldMods.Add("const");
         }
         var priority = SuggestItemPriority.Normal;
         Suggest(it, member, member.Name, null, null, () => member.ReturnType.ToString(), accessMods.ToArray(), null, null, null, priority);
     }
 }
        void SuggestTypeMembers(DataType dt, AccessorLevel accessorLevel, bool staticContext, bool metaContext, bool recurseToBase, List <Method> extensionTypeMethods)
        {
            // Suggest base type members
            if (recurseToBase && dt.Base != null)
            {
                SuggestTypeMembers(dt.Base, accessorLevel == AccessorLevel.Public ? AccessorLevel.Public : AccessorLevel.Protected, staticContext, metaContext, recurseToBase, extensionTypeMethods);
            }

            SuggestInterfaceType(dt, staticContext, metaContext, recurseToBase, extensionTypeMethods);

            SuggestEnumsInStaticContext(dt, staticContext);

            var ct = dt as ClassType;

            dt.PopulateMembers();

            if (metaContext && ct != null && ct.Block != null)
            {
                SuggestBlockItems(ct.Block);
            }

            SuggestSwizzlerType(dt);

            SuggestField(dt, accessorLevel, staticContext);

            SuggestEvents(dt, accessorLevel, staticContext);

            SuggestMethods(dt, accessorLevel, staticContext);

            SuggestProperties(dt, accessorLevel, staticContext);

            SuggestLiterals(dt, accessorLevel);

            SuggestExtensionTypeMethods(extensionTypeMethods, ct);

            SuggestStaticContext(dt, staticContext);

            SuggestHasFlagForEnums(dt);
        }
 bool CompatibleAccessor(AccessorLevel level, Member m)
 {
     return(CompatibleAccessor(level, m.Modifiers));
 }