Exemplo n.º 1
0
 public TypeReferenceType(Context cx, TypeReferenceHandle handle) : base(cx)
 {
     this.idWriter   = new NamedTypeIdWriter(this);
     this.handle     = handle;
     this.tr         = cx.MdReader.GetTypeReference(handle);
     this.typeParams = new Lazy <TypeTypeParameter[]>(GenericsHelper.MakeTypeParameters(this, ThisTypeParameterCount));
 }
            private void ExtractTypeArguments(ref string name, int lastBracketIndex, out string containerTypeArguments)
            {
                var firstBracketIndex = name.IndexOf('[');

                if (firstBracketIndex < 0)
                {
                    // not generic or non-constructed generic
                    TypeArguments          = null;
                    containerTypeArguments = "";
                    UnboundGenericTypeName = null;
                    return;
                }

                // "T3,[T4, Assembly1, Version=...],T5,T6"
                string typeArgs;

                (name, _, typeArgs, _) = name.Split(firstBracketIndex, firstBracketIndex + 1, lastBracketIndex - firstBracketIndex - 1);

                var thisTypeArgCount = GenericsHelper.GetGenericTypeParameterCount(name);

                if (thisTypeArgCount == 0)
                {
                    // not generic or non-constructed generic; container is constructed
                    TypeArguments          = null;
                    containerTypeArguments = $"[{typeArgs}]";
                    UnboundGenericTypeName = null;
                    return;
                }

                // constructed generic
                // "T3,[T4, Assembly1, Version=...]", ["T5", "T6"]
                var(containerTypeArgs, thisTypeArgs) = ParseTypeArgumentStrings(typeArgs, thisTypeArgCount);

                TypeArguments = thisTypeArgs;

                containerTypeArguments = string.IsNullOrWhiteSpace(containerTypeArgs)
                    ? ""                            // containing type is not constructed generics
                    : $"[{containerTypeArgs}]";     // "T3,[T4, Assembly1, Version=...],,]"

                UnboundGenericTypeName = $"{name}{AssemblySuffix}";
            }
Exemplo n.º 3
0
        public NoMetadataHandleType(Context cx, string originalName) : base(cx)
        {
            this.originalName = originalName;
            this.idWriter     = new NamedTypeIdWriter(this);

            var nameParser = new FullyQualifiedNameParser(originalName);

            name                 = nameParser.ShortName;
            assemblyName         = nameParser.AssemblyName;
            isContainerNamespace = nameParser.IsContainerNamespace;
            containerName        = nameParser.ContainerName;

            unboundGenericType = nameParser.UnboundGenericTypeName is null
                ? this
                : new NoMetadataHandleType(Context, nameParser.UnboundGenericTypeName);

            if (nameParser.TypeArguments is not null)
            {
                thisTypeArguments = nameParser.TypeArguments.Select(t => new NoMetadataHandleType(Context, t)).ToArray();
            }
            else
            {
                typeParams = new Lazy <TypeTypeParameter[]>(GenericsHelper.MakeTypeParameters(this, ThisTypeParameterCount));
            }

            containingType = isContainerNamespace
                ? null
                : new NoMetadataHandleType(Context, containerName);

            containingNamespace = isContainerNamespace
                ? containerName == Context.GlobalNamespace.Name
                    ? Context.GlobalNamespace
                    : containerName == Context.SystemNamespace.Name
                        ? Context.SystemNamespace
                        : new Namespace(Context, containerName)
                : null;

            Populate();
        }