示例#1
0
        /// <summary>
        /// Looks up the <see cref="Generator"/> that owns a referenced type.
        /// </summary>
        /// <param name="typeRef">The generator and type reference from the requesting generator.</param>
        /// <param name="targetGenerator">Receives the generator that owns the referenced type.</param>
        /// <returns><see langword="true"/> if a matching generator was found; otherwise <see langword="false"/>.</returns>
        internal bool TryGetTargetGenerator(QualifiedTypeReference typeRef, [NotNullWhen(true)] out Generator?targetGenerator)
        {
            if (typeRef.Reference.ResolutionScope.Kind != HandleKind.AssemblyReference)
            {
                targetGenerator = null;
                return(false);
            }

            AssemblyReference assemblyRef = typeRef.Generator.Reader.GetAssemblyReference((AssemblyReferenceHandle)typeRef.Reference.ResolutionScope);
            string            scope       = typeRef.Generator.Reader.GetString(assemblyRef.Name);

            return(this.TryGetGenerator(scope, out targetGenerator));
        }
示例#2
0
        /// <summary>
        /// Requests generation of a type referenced across metadata files.
        /// </summary>
        /// <param name="typeRef">The referenced type, with generator.</param>
        /// <returns><see langword="true" /> if a matching generator was found; <see langword="false" /> otherwise.</returns>
        internal bool TryRequestInteropType(QualifiedTypeReference typeRef)
        {
            if (typeRef.Reference.ResolutionScope.Kind != HandleKind.AssemblyReference)
            {
                throw new ArgumentException("Only type references across assemblies should be requested.", nameof(typeRef));
            }

            if (this.TryGetTargetGenerator(typeRef, out Generator? generator))
            {
                string ns   = typeRef.Generator.Reader.GetString(typeRef.Reference.Namespace);
                string name = typeRef.Generator.Reader.GetString(typeRef.Reference.Name);
                generator.RequestInteropType(ns, name);
                return(true);
            }

            return(false);
        }
示例#3
0
        internal bool TryGetTypeDefinitionHandle(QualifiedTypeReferenceHandle typeRefHandle, out QualifiedTypeDefinitionHandle typeDefHandle)
        {
            if (typeRefHandle.Generator.TryGetTypeDefHandle(typeRefHandle.ReferenceHandle, out TypeDefinitionHandle localHandle))
            {
                typeDefHandle = new QualifiedTypeDefinitionHandle(typeRefHandle.Generator, localHandle);
                return(true);
            }

            QualifiedTypeReference typeRef = typeRefHandle.Resolve();

            if (this.TryGetTargetGenerator(typeRef, out Generator? targetGenerator))
            {
                var @namespace = typeRef.Generator.Reader.GetString(typeRef.Reference.Namespace);
                var @name      = typeRef.Generator.Reader.GetString(typeRef.Reference.Name);
                if (targetGenerator.TryGetTypeDefHandle(@namespace, name, out TypeDefinitionHandle targetTypeDefHandle))
                {
                    typeDefHandle = new QualifiedTypeDefinitionHandle(targetGenerator, targetTypeDefHandle);
                    return(true);
                }
            }

            typeDefHandle = default;
            return(false);
        }