public static IEnumerable <IType> ListControlClasses(IType baseType, ProjectDom database, string namespac) { if (database == null) { yield break; } //return classes if they derive from system.web.ui.control foreach (IType type in database.GetSubclasses(baseType, false, new string [] { namespac })) { if (!type.IsAbstract && type.IsPublic) { yield return(type); } } if (!baseType.IsAbstract && baseType.IsPublic && baseType.Namespace == namespac) { IType t = database.GetType(baseType.FullName); if (t != null) { yield return(baseType); } } }
internal static IEnumerable <INode> CollectMembers(ProjectDom dom, IMember member) { if (member is IMethod && ((IMethod)member).IsConstructor) { yield return(member); } else { bool isOverrideable = member.DeclaringType.ClassType == ClassType.Interface || member.IsOverride || member.IsVirtual || member.IsAbstract; bool isLastMember = false; // for members we need to collect the whole 'class' of members (overloads & implementing types) HashSet <string> alreadyVisitedTypes = new HashSet <string> (); foreach (IType type in dom.GetInheritanceTree(member.DeclaringType)) { if (type.ClassType == ClassType.Interface || isOverrideable || type.DecoratedFullName == member.DeclaringType.DecoratedFullName) { // search in the class for the member foreach (IMember interfaceMember in type.SearchMember(member.Name, true)) { if (interfaceMember.MemberType == member.MemberType) { yield return(interfaceMember); } } // now search in all subclasses of this class for the member isLastMember = !member.IsOverride; foreach (IType implementingType in dom.GetSubclasses(type)) { string name = implementingType.DecoratedFullName; if (alreadyVisitedTypes.Contains(name)) { continue; } alreadyVisitedTypes.Add(name); foreach (IMember typeMember in implementingType.SearchMember(member.Name, true)) { if (typeMember.MemberType == member.MemberType) { isLastMember = type.ClassType != ClassType.Interface && (typeMember.IsVirtual || typeMember.IsAbstract || !typeMember.IsOverride); yield return(typeMember); } } if (!isOverrideable) { break; } } if (isLastMember) { break; } } } } }
public Dictionary <string, IType> GetToolboxItems() { Dictionary <string, IType> tb_items = new Dictionary <string, IType> (); IType wt = ctx.GetType("Gtk.Widget", true); if (wt != null) { foreach (IType t in ctx.GetSubclasses(wt, true)) { if (t.SourceProjectDom == ctx && IsToolboxWidget(t)) { tb_items [t.FullName] = t; } } } return(tb_items); }
IEnumerable <NSObjectTypeInfo> GetRegisteredObjects(ProjectDom dom) { var nso = dom.GetType(nsobjectType); if (nso == null) { throw new Exception("Could not get NSObject from type database"); } yield return(new NSObjectTypeInfo("NSObject", nsobjectType.FullName, null, null, false)); foreach (var type in dom.GetSubclasses(nso, true)) { var info = ConvertType(dom, type); if (info != null) { yield return(info); } } }
void FillClasses(MoonlightProject project) { if (classesFilled) { return; } classesFilled = true; try { ProjectDom dom = ProjectDomService.GetProjectDom(project); IType appType = dom.GetType("System.Windows.Application", true); if (appType == null) { return; } foreach (IType type in dom.GetSubclasses(appType, false)) { classListStore.AppendValues(type.FullName); } } catch (InvalidOperationException) { // Project not found in parser database } }
public void GetSubclasses() { IType type = mainProject.GetType("Library2.CWidget", true); Assert.IsNotNull(type); List <string> types = new List <string> (); foreach (IType t in mainProject.GetSubclasses(type, true)) { types.Add(t.FullName); } Assert.IsTrue(types.Contains("Library2.CContainer")); Assert.IsTrue(types.Contains("Library2.SomeContainer.CInnerWidget")); Assert.IsTrue(types.Contains("Library2.CExtraContainer")); Assert.IsTrue(types.Contains("Library2.SomeContainer.CExtraInnerWidget")); Assert.IsTrue(types.Contains("Library1.CBin")); Assert.IsTrue(types.Contains("Library1.CList")); Assert.IsTrue(types.Contains("Library1.SomeContainer.CInnerWidget")); Assert.IsTrue(types.Contains("Library1.SomeContainer.SomeInnerContainer.CSubInnerWidget")); Assert.IsTrue(types.Contains("Library1.CExtraBin")); Assert.IsTrue(types.Contains("Library1.CExtraContainerSub")); Assert.IsTrue(types.Contains("Library1.CExtraContainerInnerSub")); Assert.IsTrue(types.Contains("Library1.CExtraContainerInnerSub.CInnerWidget1")); Assert.IsTrue(types.Contains("Library1.CExtraContainerInnerSub.CInnerWidget2")); Assert.IsTrue(types.Contains("Library1.CExtraContainerInnerSub.CInnerWidget3")); Assert.IsTrue(types.Contains("CompletionDbTest.CustomWidget1")); Assert.IsTrue(types.Contains("CompletionDbTest.CustomWidget2")); Assert.AreEqual(16, types.Count); // No deep search type = mainProject.GetType("Library2.CWidget", true); Assert.IsNotNull(type); types.Clear(); foreach (IType t in mainProject.GetSubclasses(type, false)) { types.Add(t.FullName); } Assert.IsTrue(types.Contains("CompletionDbTest.CustomWidget1")); Assert.IsTrue(types.Contains("CompletionDbTest.CustomWidget2")); Assert.AreEqual(2, types.Count); // Interface subclassing type = mainProject.GetType("Library2.IObject", true); Assert.IsNotNull(type); types.Clear(); foreach (IType t in mainProject.GetSubclasses(type, true)) { types.Add(t.FullName); } Assert.IsTrue(types.Contains("Library2.CExtraContainer")); Assert.IsTrue(types.Contains("Library2.SomeContainer.CExtraInnerWidget")); Assert.IsTrue(types.Contains("Library1.CExtraContainerInnerSub")); Assert.IsTrue(types.Contains("Library1.CExtraContainerInnerSub.CInnerWidget1")); Assert.IsTrue(types.Contains("Library1.CExtraContainerInnerSub.CInnerWidget2")); Assert.IsTrue(types.Contains("Library1.CExtraContainerSub")); Assert.IsTrue(types.Contains("Library1.ISimple")); Assert.IsTrue(types.Contains("CompletionDbTest.CustomWidget1")); Assert.IsTrue(types.Contains("CompletionDbTest.CustomWidget2")); Assert.AreEqual(9, types.Count); }