/// <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)); }
/// <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); }
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); }