Пример #1
0
        ResolveResult CreateResult(ICompilationUnit unit, IReturnType type)
        {
            MemberResolveResult result = new MemberResolveResult(null);

            result.CallingType    = resolver.CallingType;
            result.CallingMember  = resolver.CallingMember;
            result.ResolvedType   = type;
            result.UnresolvedType = type;
            if (unit != null && resolver.Dom != null && type != null && type.Type == null)
            {
                IType searchedType = resolver.SearchType(type);
                if (searchedType != null)
                {
                    DomReturnType resType = new DomReturnType(searchedType);
                    resType.ArrayDimensions = type.ArrayDimensions;
                    for (int i = 0; i < type.ArrayDimensions; i++)
                    {
                        resType.SetDimension(i, type.GetDimension(i));
                    }
                    resType.PointerNestingLevel = type.PointerNestingLevel;
                    result.ResolvedType         = resType;
                }
            }
            return(result);
        }
Пример #2
0
        public virtual IType GetType(IReturnType returnType)
        {
            if (returnType == null)
            {
                return(null);
            }

            if (returnType.ArrayDimensions > 0)
            {
                DomReturnType newType = new DomReturnType(returnType.FullName);
                newType.ArrayDimensions = returnType.ArrayDimensions - 1;
                for (int i = 0; i < newType.ArrayDimensions; i++)
                {
                    newType.SetDimension(i, returnType.ArrayDimensions - 1);
                }
                newType.PointerNestingLevel = returnType.PointerNestingLevel;
                return(GetArrayType(newType));
            }

            IType type = returnType.Type ?? GetType(((DomReturnType)returnType).DecoratedFullName, returnType.GenericArguments, true, true);

            if (type != null)
            {
                if (type.Kind == TypeKind.GenericInstantiation || type.Kind == TypeKind.GenericParameter)
                {
                    return(type);
                }
                if (!returnType.Parts.Any(part => part.GenericArguments.Count != 0))
                {
                    return(type);
                }
                List <IReturnType> aggregatedGenerics = new List <IReturnType> ();
                foreach (IReturnTypePart part in returnType.Parts)
                {
                    aggregatedGenerics.AddRange(part.GenericArguments);
                }

                return(CreateInstantiatedGenericType(type, aggregatedGenerics));
            }
            return(type);

/*
 *                      IReturnTypePart part = returnType.Parts [0];
 *                      string name = !string.IsNullOrEmpty (returnType.Namespace) ? returnType.Namespace + "." + part.Name : part.Name;
 *                      IType ptype = GetType (name, part.GenericArguments, true, true);
 *                      if (ptype == null)
 *                              return null;
 *                      for (int n=1; n < returnType.Parts.Count; n++) {
 *                              part = returnType.Parts [n];
 *                              ptype = SearchInnerType (ptype, part.Name, part.GenericArguments.Count, true);
 *                              if (ptype != null)
 *                                      break;
 *                              if (ptype == null)
 *                                      return null;
 *                              if (part.GenericArguments.Count > 0)
 *                                      ptype = CreateInstantiatedGenericType (ptype, part.GenericArguments);
 *                      }
 *                      return ptype;
 */
        }
Пример #3
0
        static IReturnType ConvertTypeReference(TypeReference typeRef)
        {
            if (typeRef == null)
            {
                return(null);
            }
            DomReturnType result = new DomReturnType(typeRef.Type);

            foreach (TypeReference genericArgument in typeRef.GenericTypes)
            {
                result.AddTypeParameter(ConvertTypeReference(genericArgument));
            }
            result.PointerNestingLevel = typeRef.PointerNestingLevel;
            if (typeRef.IsArrayType)
            {
                result.ArrayDimensions = typeRef.RankSpecifier.Length;
                for (int i = 0; i < typeRef.RankSpecifier.Length; i++)
                {
                    result.SetDimension(i, typeRef.RankSpecifier[i]);
                }
            }
            return(result);
        }
Пример #4
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));
        }
Пример #5
0
		internal static void AddType (ProjectDom dom, List<object> result, IReturnType returnType, IMember callingMember, bool showStatic)
		{
			if (returnType == null || returnType.FullName == "System.Void")
				return;
			if (returnType.ArrayDimensions > 0) {
				DomReturnType elementType = new DomReturnType (returnType.FullName);
				elementType.ArrayDimensions = returnType.ArrayDimensions - 1;
				for (int i = 0; i < elementType.ArrayDimensions; i++) {
					elementType.SetDimension (i, returnType.ArrayDimensions - 1);
				}
				elementType.PointerNestingLevel = returnType.PointerNestingLevel;
				
				AddType (dom, result, dom.GetArrayType (elementType), callingMember, showStatic);
				return;
			}
			IType type = dom.GetType (returnType);
			
			AddType (dom, result, type, callingMember, showStatic);
		}
Пример #6
0
		ResolveResult CreateResult (ICompilationUnit unit, IReturnType type)
		{
			MemberResolveResult result = new MemberResolveResult (null);
			result.CallingType   = resolver.CallingType;
			result.CallingMember = resolver.CallingMember;
			result.ResolvedType = type;
			result.UnresolvedType = type;
			if (unit != null && resolver.Dom != null && type != null && type.Type == null) {
				IType searchedType = resolver.SearchType (type);
				if (searchedType != null) {
					DomReturnType resType = new DomReturnType (searchedType);
					resType.ArrayDimensions = type.ArrayDimensions;
					for (int i = 0; i < type.ArrayDimensions; i++) {
						resType.SetDimension (i, type.GetDimension (i));
					}
					resType.PointerNestingLevel = type.PointerNestingLevel;
					result.ResolvedType = resType;
				}
			}
			return result;
		}
Пример #7
0
		static IReturnType ConvertTypeReference (TypeReference typeRef)
		{
			if (typeRef == null)
				return null;
			DomReturnType result = new DomReturnType (typeRef.Type);
			foreach (TypeReference genericArgument in typeRef.GenericTypes) {
				result.AddTypeParameter (ConvertTypeReference (genericArgument));
			}
			result.PointerNestingLevel = typeRef.PointerNestingLevel;
			if (typeRef.IsArrayType) {
				result.ArrayDimensions = typeRef.RankSpecifier.Length;
				for (int i = 0; i < typeRef.RankSpecifier.Length; i++) {
					result.SetDimension (i, typeRef.RankSpecifier[i]);
				}
			}
			return result;
		}
Пример #8
0
		public virtual IType GetType (IReturnType returnType)
		{
			if (returnType == null)
				return null;
			
			if (returnType.ArrayDimensions > 0) {
				DomReturnType newType = new DomReturnType (returnType.FullName);
				newType.ArrayDimensions = returnType.ArrayDimensions - 1;
				for (int i = 0; i < newType.ArrayDimensions; i++) {
					newType.SetDimension (i, returnType.ArrayDimensions - 1);
				}
				newType.PointerNestingLevel = returnType.PointerNestingLevel;
				return GetArrayType (newType);
			}
			
			IType type = returnType.Type ?? GetType (((DomReturnType)returnType).DecoratedFullName, returnType.GenericArguments, true, true);
			if (type != null)  {
				if (type.Kind == TypeKind.GenericInstantiation || type.Kind == TypeKind.GenericParameter)
					return type;
				if (!returnType.Parts.Any (part => part.GenericArguments.Count != 0))
					return type;
				List<IReturnType> aggregatedGenerics = new List<IReturnType> ();
				foreach (IReturnTypePart part in returnType.Parts) {
					aggregatedGenerics.AddRange (part.GenericArguments);
				}
				
				return CreateInstantiatedGenericType (type, aggregatedGenerics);
			}
			return type;
/*			
			IReturnTypePart part = returnType.Parts [0];
			string name = !string.IsNullOrEmpty (returnType.Namespace) ? returnType.Namespace + "." + part.Name : part.Name;
			IType ptype = GetType (name, part.GenericArguments, true, true);
			if (ptype == null)
				return null;
			for (int n=1; n < returnType.Parts.Count; n++) {
				part = returnType.Parts [n];
				ptype = SearchInnerType (ptype, part.Name, part.GenericArguments.Count, true);
				if (ptype != null)
					break;
				if (ptype == null)
					return null;
				if (part.GenericArguments.Count > 0)
					ptype = CreateInstantiatedGenericType (ptype, part.GenericArguments);
			}
			return ptype;
			*/
			
			
		}