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}"; }
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(); }