コード例 #1
0
        public InstantiatedParameterType(ProjectDom dom, ITypeParameterMember typeParameterMember, ITypeParameter tp)
        {
            IType outerType = typeParameterMember as IType ?? typeParameterMember.DeclaringType;

            typeparam       = tp;
            compilationUnit = outerType.CompilationUnit;
            ClassType       = ClassType.Class;
            Modifiers       = Modifiers.Public;
            Name            = tp.Name;
            Namespace       = outerType.DecoratedFullName;
            Location        = outerType.Location;
            DeclaringType   = outerType;
            if (tp.ValueTypeRequired)
            {
                BaseType = new DomReturnType("System.ValueType");
            }

            if (tp.Constraints.Count > 0)
            {
                ClassType = ClassType.Interface;
            }
            foreach (IReturnType rt in tp.Constraints)
            {
                if (FindCyclicReference(new HashSet <ITypeParameter> ()
                {
                    tp
                }, outerType, ((DomReturnType)rt).DecoratedFullName))
                {
                    continue;
                }
                IType       bt           = dom.SearchType(typeParameterMember, rt);
                IReturnType resolvedType = rt;
                if (bt != null)
                {
                    resolvedType = new DomReturnType(bt);
                    if (bt.ClassType == ClassType.Interface || BaseType != null)
                    {
                        AddInterfaceImplementation(resolvedType);
                    }
                    else
                    {
                        ClassType = bt.ClassType;
                        BaseType  = resolvedType;
                    }
                }
                else
                {
                    AddInterfaceImplementation(resolvedType);
                }
            }
            if (BaseType == null)
            {
                BaseType = DomReturnType.Object;
            }
        }
コード例 #2
0
ファイル: DomType.cs プロジェクト: poke/monodevelop
 static void AddInnerTypes(GenericTypeInstanceResolver resolver, string decoratedFullName, IType type, IList <IReturnType> genericArguments)
 {
     foreach (var inner in type.InnerTypes)
     {
         var constructedReturnType = new DomReturnType(type.Namespace, type.Name, false, genericArguments);
         constructedReturnType.Parts.Add(new ReturnTypePart(inner.Name));
         string constructedName = decoratedFullName + "." + inner.DecoratedFullName;
         resolver.Add(constructedName, constructedReturnType);
         AddInnerTypes(resolver, constructedName, inner, genericArguments);
     }
 }
コード例 #3
0
ファイル: DomType.cs プロジェクト: poke/monodevelop
            public override INode Visit(IReturnType type, IType typeToInstantiate)
            {
                DomReturnType copyFrom      = (DomReturnType)type;
                string        decoratedName = copyFrom.DecoratedFullName;
                IReturnType   result        = LookupReturnType(decoratedName, type, typeToInstantiate);
                IType         curType       = currentType;

                while (result == null && curType != null)
                {
                    result  = LookupReturnType(curType.DecoratedFullName + "." + decoratedName, type, typeToInstantiate);
                    curType = curType.DeclaringType;
                }
                return(result ?? base.Visit(type, typeToInstantiate));
            }
コード例 #4
0
            public override INode Visit(IReturnType type, object data)
            {
                IReturnType rt = (IReturnType)base.Visit(type, data);

                if (BuiltInTypes.Contains(rt.FullName))
                {
                    return(rt);
                }

                DomReturnType returnType = new DomReturnType(rt);
                string        longest    = "";
                string        lastAlias  = null;

                if (callingType != null && returnType.DecoratedFullName.StartsWith(callingType.FullName))
                {
                    int p1 = System.Math.Min(callingType.FullName.Count(ch => ch == '.') + 1, returnType.Parts.Count - 1);
                    returnType.Parts.RemoveRange(0, p1);
                    returnType.Namespace = "";
                    return(returnType);
                }

                foreach (IUsing u in unit.Usings.Where(u => u.ValidRegion.Contains(location)))
                {
                    foreach (string ns in u.Namespaces.Where(ns => returnType.Namespace == ns || returnType.Namespace != null && returnType.Namespace.StartsWith(ns + ".")))
                    {
                        if (longest.Length < ns.Length)
                        {
                            longest = ns;
                        }
                    }
                    foreach (KeyValuePair <string, IReturnType> alias in u.Aliases)
                    {
                        if (alias.Value.ToInvariantString() == type.ToInvariantString())
                        {
                            lastAlias = alias.Key;
                        }
                    }
                }
                if (lastAlias != null)
                {
                    return(new DomReturnType(lastAlias));
                }
                if (longest.Length > 0 && returnType.Namespace == longest)
                {
                    returnType.Namespace = "";
                }
                return(returnType);
            }
コード例 #5
0
        public virtual INode Visit(IReturnType type, T data)
        {
            List <IReturnTypePart> parts = new List <IReturnTypePart> (type.Parts.Count);

            foreach (IReturnTypePart part in type.Parts)
            {
                parts.Add((IReturnTypePart)Visit(part, data));
            }

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

            rt.PointerNestingLevel = type.PointerNestingLevel;
            rt.IsNullable          = type.IsNullable;
            rt.SetDimensions(type.GetDimensions());
            rt.Type = type.Type;             // for anonymous types
            return(rt);
        }
コード例 #6
0
            IReturnType LookupReturnType(string decoratedName, IReturnType type, IType typeToInstantiate)
            {
                IReturnType res;

                if (typeTable.TryGetValue(decoratedName, out res))
                {
                    if (type.ArrayDimensions == 0 && type.PointerNestingLevel == 0)
                    {
                        return(res);
                    }
                    DomReturnType copy = (DomReturnType)base.Visit(res, typeToInstantiate);
                    copy.PointerNestingLevel = type.PointerNestingLevel;
                    copy.SetDimensions(type.GetDimensions());
                    return(copy);
                }
                return(null);
            }
コード例 #7
0
            void CheckReturnType(IReturnType type)
            {
                if (type == null)
                {
                    return;
                }
                IType resultType;

                if (argTypes.TryGetValue(type.FullName, out resultType))
                {
                    DomReturnType returnType = (DomReturnType)type;
//					Console.Write ("Convert:" + returnType);
                    string returnTypeName = returnType.FullName;
                    returnType.SetType(resultType);
                    returnType.Parts.Add(new ReturnTypePart(returnTypeName, null));
//					Console.WriteLine (" to:" + returnType);
                }
            }
コード例 #8
0
        public DomReturnType(IReturnType type)
        {
            DomReturnType rt = (DomReturnType)type;

            if (rt.dimensions != null)
            {
                dimensions = new int [rt.dimensions.Length];
                rt.dimensions.CopyTo(dimensions, 0);
            }
            IsGenerated              = rt.IsGenerated;
            nspace                   = rt.nspace;
            pointerNestingLevel      = rt.pointerNestingLevel;
            arrayPointerNestingLevel = rt.arrayPointerNestingLevel;
            modifiers                = rt.modifiers;

            foreach (var p in rt.Parts)
            {
                parts.Add(new ReturnTypePart(p));
            }
        }
コード例 #9
0
ファイル: DomType.cs プロジェクト: poke/monodevelop
        public static string GetInstantiatedTypeName(string typeName, IList <IReturnType> genericArguments)
        {
            if (genericArguments == null || genericArguments.Count == 0)
            {
                return(typeName);
            }

            StringBuilder sb = new StringBuilder(typeName);

            sb.Append('[');
            for (int i = 0; i < genericArguments.Count; i++)
            {
                if (i > 0)
                {
                    sb.Append(',');
                }
                sb.Append(DomReturnType.ConvertToString(genericArguments [i]));
            }
            sb.Append(']');
            return(sb.ToString());
        }
コード例 #10
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);
        }
コード例 #11
0
            public override INode Visit(IReturnType type, IMethod typeToInstantiate)
            {
                DomReturnType copyFrom = (DomReturnType)type;
                IReturnType   res;

                if (typeTable.TryGetValue(copyFrom.DecoratedFullName, out res))
                {
                    if (type.ArrayDimensions > 0)
                    {
                        DomReturnType drr = new DomReturnType(res.FullName);
                        drr.PointerNestingLevel = type.PointerNestingLevel;
                        drr.ArrayDimensions     = type.ArrayDimensions;
                        drr.Type = type.Type;                          // May be anonymous type
                        for (int i = 0; i < type.ArrayDimensions; i++)
                        {
                            drr.SetDimension(i, type.GetDimension(i));
                        }
                        return(drr);
                    }
                    return(res);
                }
                return(base.Visit(type, typeToInstantiate));
            }
コード例 #12
0
            public void Add(ProjectDom dom, IReturnType parameterType, IReturnType type)
            {
//				Console.WriteLine ("Add:" + parameterType +"\n\t->" + type);
                if (type == null || string.IsNullOrEmpty(type.FullName))
                {
                    return;
                }
                string name     = parameterType.Name;
                bool   contains = typeTable.ContainsKey(name);

                // when the type is already in the table use the type that is more general in the inheritance tree.
                if (contains && dom != null)
                {
                    var t1 = dom.GetType(typeTable[name]);
                    var t2 = dom.GetType(type);
                    if (t1 != null && !dom.GetInheritanceTree(t1).Any(t => t.DecoratedFullName == t2.DecoratedFullName))
                    {
                        return;
                    }
                }

                DomReturnType newType = new DomReturnType(type.FullName);

                newType.ArrayDimensions     = Math.Max(0, type.ArrayDimensions - parameterType.ArrayDimensions);
                newType.PointerNestingLevel = Math.Max(0, type.PointerNestingLevel - parameterType.PointerNestingLevel);
                newType.Type = type.Type;                  // May be anonymous type
                for (int i = 0; i < newType.ArrayDimensions; i++)
                {
                    newType.SetDimension(i, parameterType.GetDimension(i));
                }
                foreach (var generic in type.GenericArguments)
                {
                    newType.AddTypeParameter(generic);
                }
                typeTable[name] = newType;
            }
コード例 #13
0
ファイル: DomReturnType.cs プロジェクト: poke/monodevelop
        public override bool Equals(object obj)
        {
            DomReturnType type = obj as DomReturnType;

            if (type == null)
            {
                return(false);
            }
            if (ArrayDimensions != type.ArrayDimensions)
            {
                return(false);
            }
            for (int n = 0; n < ArrayDimensions; n++)
            {
                if (GetDimension(n) != type.GetDimension(n))
                {
                    return(false);
                }
            }
            if (GenericArguments.Count != type.GenericArguments.Count)
            {
                return(false);
            }
            for (int i = 0; i < GenericArguments.Count; i++)
            {
                if (!GenericArguments[i].Equals(type.GenericArguments [i]))
                {
                    return(false);
                }
            }

            return(Name == type.Name &&
                   nspace == type.nspace &&
                   pointerNestingLevel == type.pointerNestingLevel &&
                   Modifiers == type.Modifiers);
        }
コード例 #14
0
ファイル: DomCecilMethod.cs プロジェクト: poke/monodevelop
        /*
         *      // Check if 'type' has some decorations applied to it
         *              if (type is Mono.Cecil.TypeSpecification) {
         *                      // Go through all levels of 'indirection', 'array dimensions'
         *                      // and 'generic types' - in the end, we should get the actual
         *                      // type of the ReturnType (but all data about its array
         *                      // dimensions, levels of indirection and even its generic
         *                      // parameters is correctly stored within ArrayCount and
         *                      // ArrayDimensions, PointerNestingLevel and GenericArguments
         *                      // respectively).
         *                      if (type is ArrayType) {
         *                              // This return type is obviously an array - add the rank
         *                              ArrayType at = (ArrayType) type;
         *                              if (arrays == null)
         *                                      arrays = new Stack<int>();
         *                              arrays.Push(at.Rank);
         *                              type = at.ElementType;
         *                      } else else if (type is Mono.Cecil.ReferenceType) {
         *                              Mono.Cecil.ReferenceType rt = (Mono.Cecil.ReferenceType) type;
         *                              byRef = true;
         *                              type = rt.ElementType;
         *                      } else if (type is PointerType) {
         *                              // The type is a pointer
         *                              PointerType pt = (PointerType) type;
         ++pointerNestingLevel;
         *                              type = pt.ElementType;
         *                              // Go down one level
         *                      } else {
         *                              // TODO: Check if we loose some relevant info here
         *                              type = ((TypeSpecification)type).ElementType;
         *                      }*/
        public static DomReturnType GetReturnType(TypeReference typeReference)
        {
            if (typeReference == null)
            {
                return(new DomReturnType(DomReturnType.Void.ToInvariantString()));
            }

            if (typeReference is Mono.Cecil.GenericInstanceType)
            {
                Mono.Cecil.GenericInstanceType genType = (Mono.Cecil.GenericInstanceType)typeReference;
                DomReturnType result = GetReturnType(genType.ElementType);

                foreach (TypeReference typeRef in genType.GenericArguments)
                {
                    DomReturnType param = GetReturnType(typeRef);

                    foreach (IReturnTypePart part in result.Parts)
                    {
                        if (part.Tag is TypeDefinition)
                        {
                            TypeDefinition typeDef = (TypeDefinition)part.Tag;
                            foreach (TypeReference typeParam in typeDef.GenericParameters)
                            {
                                if (typeParam.Name == param.Name)
                                {
                                    part.AddTypeParameter(param);
                                    goto skip;
                                }
                            }
                        }
                    }
                    result.AddTypeParameter(param);
                    skip :;
                }
                return(result);
            }

            if (typeReference is Mono.Cecil.ArrayType)
            {
                Mono.Cecil.ArrayType arrType = (Mono.Cecil.ArrayType)typeReference;
                DomReturnType        result  = GetReturnType(arrType.ElementType);
                result.ArrayDimensions++;
                result.SetDimension(result.ArrayDimensions - 1, arrType.Rank - 1);
                return(result);
            }

            if (typeReference is Mono.Cecil.PointerType)
            {
                Mono.Cecil.PointerType ptrType = (Mono.Cecil.PointerType)typeReference;
                DomReturnType          result  = GetReturnType(ptrType.ElementType);
                if (result.ArrayDimensions > 0)
                {
                    result.ArrayPointerNestingLevel++;
                }
                else
                {
                    result.PointerNestingLevel++;
                }
                return(result);
            }
            if (typeReference is Mono.Cecil.ByReferenceType)
            {
                return(GetReturnType(((Mono.Cecil.ByReferenceType)typeReference).ElementType));
            }

            if (typeReference is Mono.Cecil.TypeDefinition)
            {
                Mono.Cecil.TypeDefinition typeDefinition = (Mono.Cecil.TypeDefinition)typeReference;
                DomReturnType             result;
                if (typeDefinition.DeclaringType != null)
                {
                    result = GetReturnType(typeDefinition.DeclaringType);
                    result.Parts.Add(new ReturnTypePart(typeDefinition.Name));
                    result.Tag = typeDefinition;
                }
                else
                {
                    result           = new DomReturnType(typeDefinition.Name);
                    result.Namespace = typeDefinition.Namespace;
                    result.Tag       = typeDefinition;
                }
                return(result);
            }

            return(new DomReturnType(DomCecilType.RemoveGenericParamSuffix(typeReference.FullName)));
        }
コード例 #15
0
        public ExtensionMethod(IType extensionType, IMethod originalMethod, IList <IReturnType> genericArguments, IEnumerable <IReturnType> methodArguments)
        {
            if (extensionType == null)
            {
                throw new ArgumentNullException("extensionType");
            }
            if (originalMethod == null)
            {
                throw new ArgumentNullException("originalMethod");
            }
            this.DeclaringType = extensionType;
            List <IReturnType> args = new List <IReturnType> ();

            if (extensionType.FullName.EndsWith("[]"))
            {
                foreach (IReturnType returnType in extensionType.BaseTypes)
                {
                    if (returnType.FullName == "System.Collections.Generic.IList" && returnType.GenericArguments.Count > 0)
                    {
                        args.Add(returnType.GenericArguments[0]);
                        break;
                    }
                }
                if (args.Count == 0)
                {
                    args.Add(new DomReturnType(extensionType));
                }
            }
            else if (extensionType is InstantiatedType)
            {
                InstantiatedType instType = (InstantiatedType)extensionType;
                DomReturnType    uninstantiatedReturnType = new DomReturnType(instType.UninstantiatedType.FullName);
                foreach (IReturnType genArg in instType.GenericParameters)
                {
                    uninstantiatedReturnType.AddTypeParameter(genArg);
                }
                args.Add(uninstantiatedReturnType);
            }
            else
            {
                args.Add(new DomReturnType(extensionType));
            }
            if (methodArguments != null)
            {
                args.AddRange(methodArguments);
            }
//			Console.WriteLine ("Create Extension method from:");
//			Console.WriteLine ("ext type:" + args[0]);
//			Console.WriteLine (originalMethod);
            this.method = DomMethod.CreateInstantiatedGenericMethod(originalMethod, genericArguments, args);

            // skip first parameter.
            for (int i = 1; i < method.Parameters.Count; i++)
            {
                Add(method.Parameters[i]);
            }
            foreach (ITypeParameter par in method.TypeParameters)
            {
                AddTypeParameter(par);
            }

            this.ExtensionType  = extensionType;
            this.OriginalMethod = originalMethod;
            //Console.WriteLine (this);
            //Console.WriteLine ("oOoOoOoOoOoOoOoOoOoOoOoOoOoO");
        }