예제 #1
0
        public CommonType GetCommonType(IMetadataType type)
        {
            if (type is IMetadataArrayType)
            return GetCommonType(((IMetadataArrayType) type).TypeInfo);
              if (type is IMetadataClassType)
            return GetCommonType(((IMetadataClassType) type).Type);

              Trace.Fail(string.Format("Instance of type {0} cannot be converted to CommonType", type));
              throw new Exception();
        }
예제 #2
0
 public static Metadata Get(IMetadataType type, string description)
 {
     if (!Metadatas.ContainsKey(type))
     {
         Metadatas[type] = new Dictionary <string, Metadata>(100);
     }
     if (!Metadatas[type].ContainsKey(description))
     {
         Metadatas[type][description] = new Metadata(type, description);
     }
     return(Metadatas[type][description]);
 }
        public static ITypeInfo GetType(IMetadataType type, MetadataTypeInfoAdapter2 typeInfo,
            MetadataMethodInfoAdapter2 methodInfo)
        {
            var classType = type as IMetadataClassType;
            if (classType != null)
                return new MetadataTypeInfoAdapter2(classType);

            var argumentReferenceType = type as IMetadataGenericArgumentReferenceType;
            if (argumentReferenceType != null)
                return GetTypeFromGenericArgumentReferenceType(argumentReferenceType, typeInfo, methodInfo);

            return null;
        }
예제 #4
0
        public CommonType GetCommonType(IMetadataType type)
        {
            if (type is IMetadataArrayType)
            {
                return(GetCommonType(((IMetadataArrayType)type).TypeInfo));
            }
            if (type is IMetadataClassType)
            {
                return(GetCommonType(((IMetadataClassType)type).Type));
            }

            Trace.Fail($"Instance of type {type} cannot be converted to CommonType");
            throw new Exception();
        }
예제 #5
0
        public static ITypeInfo GetType(IMetadataType type, MetadataTypeInfoAdapter2 typeInfo,
                                        MetadataMethodInfoAdapter2 methodInfo)
        {
            var classType = type as IMetadataClassType;

            if (classType != null)
            {
                return(new MetadataTypeInfoAdapter2(classType));
            }

            var argumentReferenceType = type as IMetadataGenericArgumentReferenceType;

            if (argumentReferenceType != null)
            {
                return(GetTypeFromGenericArgumentReferenceType(argumentReferenceType, typeInfo, methodInfo));
            }

            return(null);
        }
                public static PartiallyIgnoredTypeBuilder Create(IMetadataType original)
                {
                    switch (original)
                    {
                    case IMetadataClass @class:
                        return(new PartiallyIgnoredClassBuilder(@class));

                    case IMetadataStruct @struct:
                        return(new PartiallyIgnoredStructBuilder(@struct));

                    case IMetadataInterface @interface:
                        return(new PartiallyIgnoredInterfaceBuilder(@interface));

                    case IMetadataEnum @enum:
                        return(new PartiallyIgnoredEnumBuilder(@enum));

                    case IMetadataDelegate @delegate:
                        return(new PartiallyIgnoredDelegateBuilder(@delegate));

                    default:
                        throw new NotImplementedException();
                    }
                }
                public bool TryUnignoreNested(TextNode referencePath, IReadOnlyList <IMetadataType> parentTypes, int parentIndex, IMetadataType typeToUnignore)
                {
                    var nextParentIndex = parentIndex + 1;

                    if (nextParentIndex != parentTypes.Count)
                    {
                        var nextParent = parentTypes[nextParentIndex];

                        var builder = nestedTypeBuilders.FirstOrDefault(_ => _.Name == nextParent.Name);
                        if (builder == null)
                        {
                            nestedTypeBuilders.Add(builder = Create(nextParent));
                        }

                        return(builder.TryUnignoreNested(referencePath, parentTypes, nextParentIndex, typeToUnignore));
                    }
                    else
                    {
                        var builder = nestedTypeBuilders.FirstOrDefault(_ => _.Name == typeToUnignore.Name);
                        if (builder == null)
                        {
                            nestedTypeBuilders.Add(builder = Create(typeToUnignore));
                        }

                        return(builder.TryUnignore(referencePath));
                    }
                }
 private PartiallyIgnoredTypeBuilder(IMetadataType original)
 {
     this.original = original;
 }
                /// <summary>
                /// Returns <see langword="false"/> if the type is not found or if it has already been unignored.
                /// </summary>
                public bool TryUnignore(TextNode referencePath, string topLevelName, IReadOnlyList <string> nestedNames, out IMetadataType unignoredType)
                {
                    var current = originalNamespace.Types.FirstOrDefault(_ => _.Name == topLevelName);

                    if (current != null)
                    {
                        if (nestedNames.Count == 0)
                        {
                            var builder = typeBuilders.FirstOrDefault(_ => _.Name == topLevelName);
                            if (builder == null)
                            {
                                typeBuilders.Add(builder = PartiallyIgnoredTypeBuilder.Create(current));
                            }

                            if (!builder.TryUnignore(referencePath))
                            {
                                unignoredType = null;
                                return(false);
                            }

                            unignoredType = current;
                            return(true);
                        }
                        else
                        {
                            var parentTypes = new List <IMetadataType>(nestedNames.Count);
                            foreach (var name in nestedNames)
                            {
                                parentTypes.Add(current);
                                current = current.NestedTypes.FirstOrDefault(_ => _.Name == name);
                                if (current == null)
                                {
                                    unignoredType = null;
                                    return(false);
                                }
                            }

                            var builder = typeBuilders.FirstOrDefault(_ => _.Name == topLevelName);
                            if (builder == null)
                            {
                                typeBuilders.Add(builder = PartiallyIgnoredTypeBuilder.Create(parentTypes[0]));
                            }

                            if (builder.TryUnignoreNested(referencePath, parentTypes, 0, current))
                            {
                                unignoredType = current;
                                return(true);
                            }
                        }
                    }

                    unignoredType = null;
                    return(false);
                }
            private void VisitNonignoredType(TextNode typeName, IMetadataType type)
            {
                // Types should not be brought in via interface implementations;
                // if interface implementations are the only thing bringing it in, that requires naming the ignored type.

                // Generic type and method constraints don't need to be considered;
                // they'll be picked up in an output position already by VisitTypeReference.

                foreach (var field in type.Fields)
                {
                    VisitTypeReference((typeName + ".") + field.Name, field.FieldType);
                }

                var @delegate = type as IMetadataDelegate;

                if (@delegate != null)
                {
                    // Delegate parameters don't require naming the ignored type in order to receive values from them.
                    // when passing the delegate as a parameter.
                    foreach (var parameter in @delegate.Parameters)
                    {
                        VisitTypeReference((typeName + " parameter ") + parameter.Name, parameter.ParameterType);
                    }

                    // Delegate returns don't require naming the ignored type in order to receive values from them
                    // when invoking them.
                    VisitTypeReference(typeName + " return type", @delegate.ReturnType);
                }

                foreach (var method in type.Methods) // Covers constructors, operators, properties and events
                {
                    if (@delegate != null && (
                            method.Name == "Invoke" ||
                            method.Name == "BeginInvoke" ||
                            method.Name == "EndInvoke"))
                    {
                        continue;
                    }

                    var methodName = (typeName + ".") + method.Name;

                    foreach (var parameter in method.Parameters)
                    {
                        if (parameter.IsOut || // Out var
                            (ParameterIsNamedType(parameter.ParameterType) &&
                             (!metadataReferenceResolver.TryGetIsDelegateType(parameter.ParameterType, out var isDelegate) ||    // Better safe than sorry
                              isDelegate)))          // Delegate parameter types can be syntactically inferred, so ignored types could be used without naming them
                        {
                            // For delegates we could be even smarter and skip if it has no byval parameters. Future enhancement.
                            VisitTypeReference((methodName + " parameter ") + parameter.Name, parameter.ParameterType);
                        }

                        // Otherwise, types should not be brought in via method parameters;
                        // if method parameters are the only thing bringing it in, that requires naming the ignored type.
                    }

                    VisitTypeReference(methodName + " return type", method.ReturnType);
                }

                if (type.BaseType != null)
                {
                    VisitTypeReference(typeName + " base type", type.BaseType);
                }

                foreach (var nestedType in type.NestedTypes)
                {
                    VisitNonignoredType((typeName + ".") + nestedType.Name, nestedType);
                }
            }
예제 #11
0
 public MetadataMock(IMetadataType type, string description)
 {
     Type        = type;
     Description = description;
 }
예제 #12
0
 public static CommonType ToCommon(this IMetadataType type)
 {
     return(IntrospectionUtility.Instance.GetCommonType(type));
 }
예제 #13
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Metadata"/> class.
 /// </summary>
 private Metadata(IMetadataType type, string description)
 {
     Type        = type;
     Description = description;
 }
예제 #14
0
 private CommonMember GetCommonMember(IMetadataTypeMember member, IMetadataType type)
 {
     return(new CommonMember(member.Name, type.ToCommon()));
 }