示例#1
0
 static IEnumerable <MonoDevelop.Projects.Dom.IEvent> GetAllEvents(
     MonoDevelop.Projects.Dom.Parser.ProjectDom projectDatabase,
     MonoDevelop.Projects.Dom.IType cls)
 {
     foreach (MonoDevelop.Projects.Dom.IType type in projectDatabase.GetInheritanceTree(cls))
     {
         foreach (MonoDevelop.Projects.Dom.IEvent ev in type.Events)
         {
             yield return(ev);
         }
     }
 }
示例#2
0
 static IEnumerable <MonoDevelop.Projects.Dom.IProperty> GetAllProperties(
     MonoDevelop.Projects.Dom.Parser.ProjectDom projectDatabase,
     MonoDevelop.Projects.Dom.IType cls)
 {
     foreach (MonoDevelop.Projects.Dom.IType type in projectDatabase.GetInheritanceTree(cls))
     {
         foreach (MonoDevelop.Projects.Dom.IProperty prop in type.Properties)
         {
             yield return(prop);
         }
     }
 }
示例#3
0
 public override bool IsAccessibleFrom(MonoDevelop.Projects.Dom.Parser.ProjectDom dom, IType calledType, IMember member, bool includeProtected)
 {
     if (calledType != null)
     {
         foreach (IType baseType in dom.GetInheritanceTree(calledType))
         {
             if (baseType.FullName == calledType.FullName)
             {
                 return(true);
             }
         }
     }
     return(base.IsAccessibleFrom(dom, calledType, member, includeProtected));
 }
		void UpdateTypeMembers (ProjectDom dom, NSObjectTypeInfo info, IType type)
		{
			info.Actions.Clear ();
			info.Outlets.Clear ();
			
			foreach (var prop in type.Properties) {
				foreach (var att in prop.Attributes) {
					bool isIBOutlet = att.AttributeType.FullName == iboutletAttType.FullName;
					if (!isIBOutlet) {
						if (att.AttributeType.FullName != connectAttType.FullName)
							continue;
					}
					string name = null;
					if (att.PositionalArguments.Count == 1)
						name = (string)((System.CodeDom.CodePrimitiveExpression)att.PositionalArguments[0]).Value;
					if (string.IsNullOrEmpty (name))
						name = prop.Name;
					
					// HACK: Work around bug #1586 in the least obtrusive way possible. Strip out any outlet
					// with the name 'view' on subclasses of MonoTouch.UIKit.UIViewController to avoid 
					// conflicts with the view property mapped there
					if (name == "view")
						if (dom.GetInheritanceTree (type).Any (p => p.FullName == "MonoTouch.UIKit.UIViewController"))
							continue;
					
					var ol = new IBOutlet (name, prop.Name, null, prop.ReturnType.FullName);
					if (MonoDevelop.DesignerSupport.CodeBehind.IsDesignerFile (prop.DeclaringType.CompilationUnit.FileName))
						ol.IsDesigner = true;
					info.Outlets.Add (ol);
					break;
				}
			}
			
			foreach (var meth in type.Methods) {
				foreach (var att in meth.Attributes) {
					bool isIBAction = att.AttributeType.FullName == ibactionAttType.FullName;
					if (!isIBAction) {
						if (att.AttributeType.FullName != exportAttType.FullName)
							continue;
					}
					bool isDesigner =  MonoDevelop.DesignerSupport.CodeBehind.IsDesignerFile (
						meth.DeclaringType.CompilationUnit.FileName);
					//only support Export from old designer files, user code must be IBAction
					if (!isDesigner && !isIBAction)
						continue;
					
					string[] name = null;
					if (att.PositionalArguments.Count == 1) {
						var n = (string)((System.CodeDom.CodePrimitiveExpression)att.PositionalArguments[0]).Value;
						if (!string.IsNullOrEmpty (n))
							name = n.Split (colonChar);
					}
					var action = new IBAction (name != null? name [0] : meth.Name, meth.Name);
					int i = 1;
					foreach (var param in meth.Parameters) {
						string label = name != null && i < name.Length? name[i] : null;
						if (label != null && label.Length == 0)
							label = null;
						action.Parameters.Add (new IBActionParameter (label, param.Name, null, param.ReturnType.FullName));
					}
					if (MonoDevelop.DesignerSupport.CodeBehind.IsDesignerFile (meth.DeclaringType.CompilationUnit.FileName))
						action.IsDesigner = true;
					info.Actions.Add (action);
					break;
				}
			}
		}
示例#5
0
        public override INode Visit(IReturnType type, IType contextType)
        {
            if (type.GenericArguments.Count == 0 && unit != null)
            {
                foreach (IUsing u in unit.Usings)
                {
                    if (u.IsFromNamespace || u.Aliases.Count == 0 && contextType != null && u.Region.Contains(contextType.Location))
                    {
                        continue;
                    }
                    foreach (KeyValuePair <string, IReturnType> alias in u.Aliases)
                    {
                        if (alias.Key == type.FullName)
                        {
                            return(Visit(alias.Value, contextType));
                        }
                    }
                }
            }

            if (currentMethod != null)
            {
                IMethod method = null;
                if (currentMethod.IsOverride)
                {
                    foreach (IType curType2 in db.GetInheritanceTree(contextType))
                    {
                        foreach (IMethod curMethod in curType2.SearchMember(currentMethod.Name, true))
                        {
                            if (!curMethod.IsOverride && curMethod.Parameters.Count == currentMethod.Parameters.Count && curMethod.TypeParameters.Count == currentMethod.TypeParameters.Count)
                            {
                                method = curMethod;
                                break;
                            }
                        }
                        if (method != null)
                        {
                            break;
                        }
                    }
                }
                if (method == null)
                {
                    method = currentMethod;
                }
                int idx = currentMethod.GetTypeParameterIndex(type.Name);
                if (idx >= 0)
                {
                    ITypeParameter t = method.TypeParameters [idx];
                    DomReturnType  typeParameterReturnType = new DomReturnType(type.FullName);
                    DomType        constructedType         = new InstantiatedParameterType(db, method, t);

                    if (constructedType.BaseType == null)
                    {
                        constructedType.BaseType = DomReturnType.Object;
                    }

                    constructedType.SourceProjectDom = db;

                    typeParameterReturnType.Type                = constructedType;
                    typeParameterReturnType.ArrayDimensions     = type.ArrayDimensions;
                    typeParameterReturnType.PointerNestingLevel = type.PointerNestingLevel;
                    for (int i = 0; i < type.ArrayDimensions; i++)
                    {
                        typeParameterReturnType.SetDimension(i, type.GetDimension(i));
                    }
                    return(typeParameterReturnType);
                }
            }

            IType lookupType = db.SearchType(unit, contextType, resolvePosition, type);

            if (visitAttribute && lookupType == null && type.Parts.Count > 0)
            {
                string oldName = type.Parts [type.Parts.Count - 1].Name;
                type.Parts [type.Parts.Count - 1].Name += "Attribute";
                lookupType = db.SearchType(unit, contextType, resolvePosition, type);
                if (lookupType == null)
                {
                    type.Parts [type.Parts.Count - 1].Name = oldName;
                }
            }

            if (lookupType == null)
            {
                unresolvedCount++;
                return(type);
            }

            List <IReturnTypePart> parts = new List <IReturnTypePart> (type.Parts.Count);
            IType curType  = lookupType.DeclaringType;
            int   typePart = 0;

            while (curType != null)
            {
                ReturnTypePart newPart = new ReturnTypePart {
                    Name = curType.Name
                };
                newPart.IsGenerated = true;
                for (int n = curType.TypeParameters.Count - 1; n >= 0; n--)
                {
                    newPart.AddTypeParameter(new DomReturnType("?"));
                }

                if (typePart >= type.Parts.Count || (type.Parts [typePart].Name != newPart.Name || type.Parts [typePart].GenericArguments.Count != newPart.GenericArguments.Count))
                {
                    parts.Insert(0, newPart);
                    typePart++;
                }
                curType = curType.DeclaringType;
            }

            foreach (ReturnTypePart part in type.Parts)
            {
                ReturnTypePart newPart = new ReturnTypePart();
                newPart.Name = part.Name;
                foreach (IReturnType ga in part.GenericArguments)
                {
                    newPart.AddTypeParameter((IReturnType)ga.AcceptVisitor(this, contextType));
                }
                parts.Add(newPart);
            }

            DomReturnType rt = new DomReturnType(lookupType.Namespace, parts);

            // Make sure the whole type is resolved
            if (parts.Count > 1 && db.SearchType(unit, contextType, resolvePosition, rt) == null)
            {
                unresolvedCount++;
                return(type);
            }

            rt.PointerNestingLevel = type.PointerNestingLevel;
            rt.IsNullable          = type.IsNullable;
            rt.ArrayDimensions     = type.ArrayDimensions;
            for (int n = 0; n < type.ArrayDimensions; n++)
            {
                rt.SetDimension(n, type.GetDimension(n));
            }
            return(db.GetSharedReturnType(rt));
        }
示例#6
0
		internal static void AddType (ProjectDom dom, List<object> result, IType type, IMember callingMember, bool showStatic, Func<IMember, bool> filter)
		{
//			System.Console.WriteLine("Add Type:" + type);
			if (type == null)
				return;
			
			if (showStatic && type.ClassType == ClassType.Enum) {
				foreach (IMember member in type.Fields) {
					result.Add (member);
				}
				return;
			}
			List<IType> accessibleStaticTypes = null;
			if (callingMember != null && callingMember.DeclaringType != null)
				accessibleStaticTypes = DomType.GetAccessibleExtensionTypes (dom, callingMember.DeclaringType.CompilationUnit);
/* TODO: Typed extension methods
			IList<IReturnType> genericParameters = null;
			if (type is InstantiatedType) 
				genericParameters = ((InstantiatedType)type).GenericParameters;*/

			bool includeProtected = callingMember != null ? DomType.IncludeProtected (dom, type, callingMember.DeclaringType) : false;
			if (accessibleStaticTypes != null) {
				foreach (IMethod extensionMethod in type.GetAllExtensionMethods (accessibleStaticTypes))
					result.Add (extensionMethod);
			}
			foreach (IType curType in dom.GetInheritanceTree (type)) {
				if (curType.ClassType == ClassType.Interface && type.ClassType != ClassType.Interface && !(type is InstantiatedParameterType))
					continue;
				foreach (IMember member in curType.Members) {
					if (callingMember != null && !member.IsAccessibleFrom (dom, type, callingMember, includeProtected))
						continue;
// handled by member.IsAccessibleFrom
//					if (member.IsProtected && !includeProtected)
//						continue;
					if (member is IMethod && (((IMethod)member).IsConstructor || ((IMethod)member).IsFinalizer))
						continue;
					if (!showStatic && member is IType)
						continue;
					if (filter != null && filter (member))
						continue;
					if (member is IType || !(showStatic ^ (member.IsStatic || member.IsConst))) {
						result.Add (member);
					}
				}
			//	if (showStatic)
			//		break;
			}
		}
		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;
					}
				}
			}
		}
示例#8
0
		public static bool IdentifierExistsInClass (ProjectDom parserContext, IType cls, string identifier)
		{
			foreach (IMember member in cls.Members)
				if (member.Name == identifier)
					return true;
			
			return VisibleIdentifierExistsInBaseClasses (parserContext.GetInheritanceTree (cls), identifier);
		}
示例#9
0
		//TODO: check accessibility
		public static IEnumerable<IMethod> GetCompatibleMethodsInClass (ProjectDom ctx, IType cls, IMethod matchMeth)
		{
			IList<IType>[] pars = new IList<IType>[matchMeth.Parameters.Count];
			for (int i = 0; i < matchMeth.Parameters.Count; i++) {
				IType t = ctx.GetType (matchMeth.Parameters[i].ReturnType);
				if (t != null)
					pars[i] = new List<IType> (ctx.GetInheritanceTree (t));
				else
					pars[i] = new IType[0];
			}
			
			foreach (IType type in ctx.GetInheritanceTree (cls)) {
				if (type.ClassType != ClassType.Class)
					continue;
				
				foreach (IMethod method in type.Methods) {
					if (method.IsPrivate || method.Parameters.Count != pars.Length || method.ReturnType.FullName != matchMeth.ReturnType.FullName
					    
					    || method.IsInternal)
						continue;
					
					bool allCompatible = true;
					
					//compare each parameter
					for (int i = 0; i < pars.Length; i++) {
						bool parCompatible = false;
						foreach (IType t in pars[i]) {
							if (t.FullName == method.Parameters[i].ReturnType.FullName) {
								parCompatible = true;
								break;
							}
						}
						
						if (!parCompatible) {
							allCompatible = false;
							break;
						}
					}
					
					if (allCompatible)
						yield return method;
				}
			}
		}
示例#10
0
		void ResolveTypes (ProjectDom dom, NSObjectTypeInfo type)
		{
			NSObjectTypeInfo resolved;
			
			if (type.BaseObjCType == null && type.BaseCliType != null) {
				if (cliTypes.TryGetValue (type.BaseCliType, out resolved)) {
					if (resolved.IsModel)
						type.BaseIsModel = true;
					type.BaseObjCType = resolved.ObjCName;
					if (resolved.IsUserType)
						type.UserTypeReferences.Add (resolved.ObjCName);
				} else {
					//managed classes many have implicitly registered base classes with a name not
					//expressible in obj-c. In this case, the best we can do is walk down the 
					//hierarchy until we find a valid base class
					foreach (var bt in dom.GetInheritanceTree (dom.GetType (type.BaseCliType))) { 
						if (cliTypes.TryGetValue (bt.FullName, out resolved)) {
							if (resolved.IsModel)
								type.BaseIsModel = true;
							type.BaseObjCType = resolved.ObjCName;
							if (resolved.IsUserType)
								type.UserTypeReferences.Add (resolved.ObjCName);
							break;
						}
					}
					if (type.BaseObjCType == null)
						Console.WriteLine ("Could not resolve CLI type '{0}'", type.BaseCliType);
				}
			}
			
			if (type.BaseCliType == null && type.BaseObjCType != null) {
				if (objcTypes.TryGetValue (type.BaseObjCType, out resolved))
					type.BaseCliType = resolved.CliName;
			}
			
			foreach (var outlet in type.Outlets) {
				if (outlet.ObjCType == null) {
					if (cliTypes.TryGetValue (outlet.CliType, out resolved)) {
						outlet.ObjCType = resolved.ObjCName;
						if (resolved.IsUserType)
							type.UserTypeReferences.Add (resolved.ObjCName);
					}
				}
				if (outlet.CliType == null) {
					if (objcTypes.TryGetValue (outlet.ObjCType, out resolved))
						outlet.CliType = resolved.CliName;
				}
			}
			
			foreach (var action in type.Actions) {
				foreach (var param in action.Parameters) {
					if (param.ObjCType == null) {
						if (cliTypes.TryGetValue (param.CliType, out resolved)) {
							param.ObjCType = resolved.ObjCName;
							if (resolved.IsUserType)
								type.UserTypeReferences.Add (resolved.ObjCName);
						}
					}
					if (param.CliType == null) {
						if (objcTypes.TryGetValue (param.ObjCType, out resolved))
							param.CliType = resolved.CliName;
					}
				}
			}
		}
示例#11
0
 public override IEnumerable <IType> GetInheritanceTree(IType type)
 {
     return(decorated.GetInheritanceTree(type));
 }