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)); }