Type ProtocolConformanceRef::getTypeWitnessByName(Type type, ProtocolConformanceRef conformance, Identifier name, LazyResolver *resolver) { // For an archetype, retrieve the nested type with the appropriate // name. There are no conformance tables. if (auto archetype = type->getAs<ArchetypeType>()) { return archetype->getNestedType(name); } // Find the named requirement. AssociatedTypeDecl *assocType = nullptr; auto members = conformance.getRequirement()->lookupDirect(name); for (auto member : members) { assocType = dyn_cast<AssociatedTypeDecl>(member); if (assocType) break; } // FIXME: Shouldn't this be a hard error? if (!assocType) return nullptr; if (conformance.isAbstract()) return DependentMemberType::get(type, assocType); auto concrete = conformance.getConcrete(); if (!concrete->hasTypeWitness(assocType, resolver)) { return nullptr; } return concrete->getTypeWitness(assocType, resolver); }
static void getWitnessMethodSubstitutions(ApplySite AI, SILFunction *F, ProtocolConformanceRef CRef, SmallVectorImpl<Substitution> &NewSubs) { auto &Module = AI.getModule(); auto requirementSig = AI.getOrigCalleeType()->getGenericSignature(); auto witnessThunkSig = F->getLoweredFunctionType()->getGenericSignature(); SubstitutionList origSubs = AI.getSubstitutions(); bool isDefaultWitness = F->getLoweredFunctionType()->getRepresentation() == SILFunctionTypeRepresentation::WitnessMethod && F->getLoweredFunctionType()->getDefaultWitnessMethodProtocol( *Module.getSwiftModule()) == CRef.getRequirement(); getWitnessMethodSubstitutions(Module, CRef, requirementSig, witnessThunkSig, origSubs, isDefaultWitness, NewSubs); }
static SubstitutionMap getWitnessMethodSubstitutions(SILModule &Module, ApplySite AI, SILFunction *F, ProtocolConformanceRef CRef) { auto witnessFnTy = F->getLoweredFunctionType(); assert(witnessFnTy->getRepresentation() == SILFunctionTypeRepresentation::WitnessMethod); auto requirementSig = AI.getOrigCalleeType()->getGenericSignature(); auto witnessThunkSig = witnessFnTy->getGenericSignature(); SubstitutionMap origSubs = AI.getSubstitutionMap(); auto *mod = Module.getSwiftModule(); bool isDefaultWitness = (witnessFnTy->getDefaultWitnessMethodProtocol() == CRef.getRequirement()); auto *classWitness = witnessFnTy->getWitnessMethodClass(*mod); return getWitnessMethodSubstitutions( mod, CRef, requirementSig, witnessThunkSig, origSubs, isDefaultWitness, classWitness); }