本文整理汇总了C++中NominalTypeDecl类的典型用法代码示例。如果您正苦于以下问题:C++ NominalTypeDecl类的具体用法?C++ NominalTypeDecl怎么用?C++ NominalTypeDecl使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了NominalTypeDecl类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: canEmitWitnessTableLazily
bool IRGenerator::canEmitWitnessTableLazily(SILWitnessTable *wt) {
if (Opts.UseJIT)
return false;
// Regardless of the access level, if the witness table is shared it means
// we can safely not emit it. Every other module which needs it will generate
// its own shared copy of it.
if (wt->getLinkage() == SILLinkage::Shared)
return true;
NominalTypeDecl *ConformingTy =
wt->getConformingType()->getNominalOrBoundGenericNominal();
switch (ConformingTy->getEffectiveAccess()) {
case AccessLevel::Private:
case AccessLevel::FilePrivate:
return true;
case AccessLevel::Internal:
return PrimaryIGM->getSILModule().isWholeModule();
default:
return false;
}
llvm_unreachable("switch does not handle all cases");
}
示例2: getAsNominalTypeOrNominalTypeExtensionContext
SmallVector<ProtocolDecl *, 2>
DeclContext::getLocalProtocols(
ConformanceLookupKind lookupKind,
SmallVectorImpl<ConformanceDiagnostic> *diagnostics,
bool sorted) const
{
SmallVector<ProtocolDecl *, 2> result;
// Dig out the nominal type.
NominalTypeDecl *nominal = getAsNominalTypeOrNominalTypeExtensionContext();
if (!nominal)
return result;
// Update to record all potential conformances.
nominal->prepareConformanceTable();
nominal->ConformanceTable->lookupConformances(
nominal,
const_cast<DeclContext *>(this),
getASTContext().getLazyResolver(),
lookupKind,
&result,
nullptr,
diagnostics);
// Sort if required.
if (sorted) {
llvm::array_pod_sort(result.begin(), result.end(),
&ProtocolType::compareProtocols);
}
return result;
}
示例3: findBaseTypeForReplacingArchetype
static Type findBaseTypeForReplacingArchetype(const ValueDecl *VD, const Type Ty) {
if (Ty.isNull())
return Type();
// Find the nominal type decl related to VD.
auto TC = VD->getDeclContext()->getInnermostTypeContext();
NominalTypeDecl *NTD = dyn_cast_or_null<NominalTypeDecl>(TC);
if (!NTD) {
ExtensionDecl *ED = dyn_cast_or_null<ExtensionDecl>(TC);
if (ED) {
if (auto T = ED->getExtendedType())
NTD = T->getAnyNominal();
}
}
if (!NTD)
return Type();
Type Result;
// Walk the type tree to find the a sub-type who's convertible to the
// found nominal.
Ty.visit([&](Type T) {
if (!Result && (T->getAnyNominal() == NTD ||
isConvertibleTo(T, NTD->getDeclaredType(),
VD->getDeclContext()))) {
Result = T;
}
});
return Result;
}
示例4: lookupDeclsFromProtocolsBeingConformedTo
static void lookupDeclsFromProtocolsBeingConformedTo(
Type BaseTy, VisibleDeclConsumer &Consumer, LookupState LS,
const DeclContext *FromContext, DeclVisibilityKind Reason,
LazyResolver *TypeResolver, VisitedSet &Visited) {
NominalTypeDecl *CurrNominal = BaseTy->getAnyNominal();
if (!CurrNominal)
return;
for (auto Conformance : CurrNominal->getAllConformances()) {
auto Proto = Conformance->getProtocol();
if (!Proto->isAccessibleFrom(FromContext))
continue;
DeclVisibilityKind ReasonForThisProtocol;
if (Reason == DeclVisibilityKind::MemberOfCurrentNominal)
ReasonForThisProtocol =
DeclVisibilityKind::MemberOfProtocolImplementedByCurrentNominal;
else
ReasonForThisProtocol = getReasonForSuper(Reason);
auto NormalConformance = Conformance->getRootNormalConformance();
for (auto Member : Proto->getMembers()) {
if (auto *ATD = dyn_cast<AssociatedTypeDecl>(Member)) {
// Skip type decls if they aren't visible, or any type that has a
// witness. This cuts down on duplicates.
if (areTypeDeclsVisibleInLookupMode(LS) &&
!NormalConformance->hasTypeWitness(ATD)) {
Consumer.foundDecl(ATD, ReasonForThisProtocol);
}
continue;
}
if (auto *VD = dyn_cast<ValueDecl>(Member)) {
if (TypeResolver) {
TypeResolver->resolveDeclSignature(VD);
if (!NormalConformance->hasWitness(VD) &&
(Conformance->getDeclContext()->getParentSourceFile() !=
FromContext->getParentSourceFile()))
TypeResolver->resolveWitness(NormalConformance, VD);
}
// Skip value requirements that have corresponding witnesses. This cuts
// down on duplicates.
if (!NormalConformance->hasWitness(VD) ||
!NormalConformance->getWitness(VD, nullptr) ||
NormalConformance->getWitness(VD, nullptr).getDecl()->getFullName()
!= VD->getFullName()) {
Consumer.foundDecl(VD, ReasonForThisProtocol);
}
}
}
// Add members from any extensions.
SmallVector<ValueDecl *, 2> FoundDecls;
doGlobalExtensionLookup(BaseTy, Proto->getDeclaredType(), FoundDecls,
FromContext, LS, ReasonForThisProtocol,
TypeResolver);
for (auto *VD : FoundDecls)
Consumer.foundDecl(VD, ReasonForThisProtocol);
}
}
示例5: while
/// Recursively traverse the conformance lists to determine sole conforming
/// class, struct or enum type.
NominalTypeDecl *
ProtocolConformanceAnalysis::findSoleConformingType(ProtocolDecl *Protocol) {
/// First check in the SoleConformingTypeCache.
auto SoleConformingTypeIt = SoleConformingTypeCache.find(Protocol);
if (SoleConformingTypeIt != SoleConformingTypeCache.end())
return SoleConformingTypeIt->second;
SmallVector<ProtocolDecl *, 8> PDWorkList;
SmallPtrSet<ProtocolDecl *, 8> VisitedPDs;
NominalTypeDecl *SoleConformingNTD = nullptr;
PDWorkList.push_back(Protocol);
while (!PDWorkList.empty()) {
auto *PD = PDWorkList.pop_back_val();
// Protocols must have internal or lower access.
if (PD->getEffectiveAccess() > AccessLevel::Internal) {
return nullptr;
}
VisitedPDs.insert(PD);
auto NTDList = getConformances(PD);
for (auto *ConformingNTD : NTDList) {
// Recurse on protocol types.
if (auto *Proto = dyn_cast<ProtocolDecl>(ConformingNTD)) {
// Ignore visited protocol decls.
if (!VisitedPDs.count(Proto))
PDWorkList.push_back(Proto);
} else { // Classes, Structs and Enums are added here.
// Bail if more than one conforming types were found.
if (SoleConformingNTD && ConformingNTD != SoleConformingNTD) {
return nullptr;
} else {
SoleConformingNTD = ConformingNTD;
}
}
}
}
// Bail if we did not find a sole conforming type.
if (!SoleConformingNTD)
return nullptr;
// Generic declarations are ignored.
if (SoleConformingNTD->isGenericContext()) {
return nullptr;
}
// Populate SoleConformingTypeCache.
SoleConformingTypeCache.insert(std::pair<ProtocolDecl *, NominalTypeDecl *>(
Protocol, SoleConformingNTD));
// Return SoleConformingNTD.
return SoleConformingNTD;
}
示例6: getIndexForValueDecl
static unsigned getIndexForValueDecl(ValueDecl *Decl) {
NominalTypeDecl *D = cast<NominalTypeDecl>(Decl->getDeclContext());
unsigned i = 0;
for (auto *V : D->getStoredProperties()) {
if (V == Decl)
return i;
++i;
}
llvm_unreachable("Failed to find Decl in its decl context?!");
}
示例7: shouldPrintAsFavorable
static bool shouldPrintAsFavorable(const Decl *D, PrintOptions &Options) {
if (!Options.TransformContext ||
!D->getDeclContext()->isExtensionContext() ||
!Options.TransformContext->isPrintingSynthesizedExtension())
return true;
NominalTypeDecl *Target = Options.TransformContext->getNominal();
Type BaseTy = Target->getDeclaredTypeInContext();
const auto *FD = dyn_cast<FuncDecl>(D);
if (!FD)
return true;
ResolvedMemberResult Result =
resolveValueMember(*Target->getDeclContext(), BaseTy,
FD->getEffectiveFullName());
return !(Result.hasBestOverload() && Result.getBestOverload() != D);
}
示例8: Implementation
Implementation(NominalTypeDecl *Target,
bool IncludeUnconditional,
PrintOptions Options):
Target(Target),
BaseType(Target->getDeclaredInterfaceType()),
DC(Target),
IncludeUnconditional(IncludeUnconditional),
Options(Options), AllGroups(MergeGroupVector()),
InfoMap(collectSynthesizedExtensionInfo(AllGroups)) {}
示例9: canEmitWitnessTableLazily
bool IRGenerator::canEmitWitnessTableLazily(SILWitnessTable *wt) {
if (Opts.UseJIT)
return false;
NominalTypeDecl *ConformingTy =
wt->getConformance()->getType()->getNominalOrBoundGenericNominal();
switch (ConformingTy->getEffectiveAccess()) {
case AccessLevel::Private:
case AccessLevel::FilePrivate:
return true;
case AccessLevel::Internal:
return PrimaryIGM->getSILModule().isWholeModule();
default:
return false;
}
llvm_unreachable("switch does not handle all cases");
}
示例10: lookupTypeMembers
/// \brief Enumerate immediate members of the type \c LookupType and its
/// extensions, as seen from the context \c CurrDC.
///
/// Don't do lookup into superclasses or implemented protocols. Uses
/// \p BaseType as the underlying type when checking any constraints on the
/// extensions.
static void lookupTypeMembers(Type BaseType, Type LookupType,
VisibleDeclConsumer &Consumer,
const DeclContext *CurrDC, LookupState LS,
DeclVisibilityKind Reason,
LazyResolver *TypeResolver) {
NominalTypeDecl *D = LookupType->getAnyNominal();
assert(D && "should have a nominal type");
bool LookupFromChildDeclContext = false;
const DeclContext *TempDC = CurrDC;
while (!TempDC->isModuleContext()) {
if (TempDC == D) {
LookupFromChildDeclContext = true;
break;
}
TempDC = TempDC->getParent();
}
SmallVector<ValueDecl*, 2> FoundDecls;
if (LookupFromChildDeclContext) {
// Current decl context is contained inside 'D', so generic parameters
// are visible.
if (D->getGenericParams())
for (auto Param : *D->getGenericParams())
if (isDeclVisibleInLookupMode(Param, LS, CurrDC, TypeResolver))
FoundDecls.push_back(Param);
}
for (Decl *Member : D->getMembers()) {
if (auto *VD = dyn_cast<ValueDecl>(Member))
if (isDeclVisibleInLookupMode(VD, LS, CurrDC, TypeResolver))
FoundDecls.push_back(VD);
}
doGlobalExtensionLookup(BaseType, LookupType, FoundDecls, CurrDC, LS, Reason,
TypeResolver);
// Report the declarations we found to the consumer.
for (auto *VD : FoundDecls)
Consumer.foundDecl(VD, Reason);
}
示例11: findExtensionsFromConformingProtocols
void findExtensionsFromConformingProtocols(Decl *D,
llvm::SmallPtrSetImpl<ExtensionDecl*> &Results) {
NominalTypeDecl* NTD = dyn_cast<NominalTypeDecl>(D);
if (!NTD || NTD->getKind() == DeclKind::Protocol)
return;
std::vector<NominalTypeDecl*> Unhandled;
auto addTypeLocNominal = [&](TypeLoc TL){
if (TL.getType()) {
if (auto D = TL.getType()->getAnyNominal()) {
Unhandled.push_back(D);
}
}
};
for (auto TL : NTD->getInherited()) {
addTypeLocNominal(TL);
}
while(!Unhandled.empty()) {
NominalTypeDecl* Back = Unhandled.back();
Unhandled.pop_back();
for (ExtensionDecl *E : Back->getExtensions()) {
if(E->isConstrainedExtension())
Results.insert(E);
for (auto TL : Back->getInherited()) {
addTypeLocNominal(TL);
}
}
}
}
示例12: findBaseTypeForReplacingArchetype
static Type findBaseTypeForReplacingArchetype(const ValueDecl *VD, const Type Ty) {
if (Ty.isNull())
return Type();
// Find the nominal type decl related to VD.
NominalTypeDecl *NTD = VD->getDeclContext()->
getAsNominalTypeOrNominalTypeExtensionContext();
if (!NTD)
return Type();
Type Result;
// Walk the type tree to find the a sub-type who's convertible to the
// found nominal.
Ty.visit([&](Type T) {
if (!Result && (T->getAnyNominal() == NTD ||
isConvertibleTo(T, NTD->getDeclaredType(),
VD->getDeclContext()))) {
Result = T;
}
});
return Result;
}
示例13: lookupTypeMembers
/// Enumerate immediate members of the type \c LookupType and its
/// extensions, as seen from the context \c CurrDC.
///
/// Don't do lookup into superclasses or implemented protocols. Uses
/// \p BaseType as the underlying type when checking any constraints on the
/// extensions.
static void lookupTypeMembers(Type BaseType, Type LookupType,
VisibleDeclConsumer &Consumer,
const DeclContext *CurrDC, LookupState LS,
DeclVisibilityKind Reason,
LazyResolver *TypeResolver) {
NominalTypeDecl *D = LookupType->getAnyNominal();
assert(D && "should have a nominal type");
SmallVector<ValueDecl*, 2> FoundDecls;
for (Decl *Member : D->getMembers()) {
if (auto *VD = dyn_cast<ValueDecl>(Member))
if (isDeclVisibleInLookupMode(VD, LS, CurrDC, TypeResolver))
FoundDecls.push_back(VD);
}
doGlobalExtensionLookup(BaseType, LookupType, FoundDecls, CurrDC, LS, Reason,
TypeResolver);
// Report the declarations we found to the consumer.
for (auto *VD : FoundDecls)
Consumer.foundDecl(VD, Reason);
}
示例14: isNominalTypeOrNominalTypeExtensionContext
SmallVector<ProtocolConformance *, 2>
DeclContext::getLocalConformances(
ConformanceLookupKind lookupKind,
SmallVectorImpl<ConformanceDiagnostic> *diagnostics,
bool sorted) const
{
SmallVector<ProtocolConformance *, 2> result;
// Dig out the nominal type.
NominalTypeDecl *nominal = isNominalTypeOrNominalTypeExtensionContext();
if (!nominal)
return result;
// Protocols don't have conformances.
if (isa<ProtocolDecl>(nominal))
return { };
// Update to record all potential conformances.
nominal->prepareConformanceTable();
nominal->ConformanceTable->lookupConformances(
nominal,
const_cast<DeclContext *>(this),
nominal->getASTContext().getLazyResolver(),
lookupKind,
nullptr,
&result,
diagnostics);
// If requested, sort the results.
if (sorted) {
llvm::array_pod_sort(result.begin(), result.end(),
&ConformanceLookupTable::compareProtocolConformances);
}
return result;
}
示例15: switch
//===----------------------------------------------------------------------===//
// Qualified name lookup handling
//===----------------------------------------------------------------------===//
bool IterativeTypeChecker::isQualifiedLookupInDeclContextSatisfied(
TypeCheckRequest::DeclContextLookupPayloadType payload) {
auto dc = payload.DC;
NominalTypeDecl *nominal = nullptr;
switch (dc->getContextKind()) {
case DeclContextKind::AbstractClosureExpr:
case DeclContextKind::AbstractFunctionDecl:
case DeclContextKind::Initializer:
case DeclContextKind::TopLevelCodeDecl:
case DeclContextKind::SerializedLocal:
case DeclContextKind::SubscriptDecl:
llvm_unreachable("not a DeclContext that supports name lookup");
case DeclContextKind::Module:
case DeclContextKind::FileUnit:
// Modules and file units can always handle name lookup.
return true;
case DeclContextKind::GenericTypeDecl:
// Get the nominal type.
nominal = dyn_cast<NominalTypeDecl>(cast<GenericTypeDecl>(dc));
if (!nominal) return true;
break;
case DeclContextKind::ExtensionDecl: {
auto ext = cast<ExtensionDecl>(dc);
// FIXME: bind the extension. We currently assume this is done.
nominal = ext->getAsNominalTypeOrNominalTypeExtensionContext();
if (!nominal) return true;
break;
}
}
assert(nominal && "Only nominal types are handled here");
// FIXME: Cache a bit indicating when qualified lookup is possible.
// If we needed them for this query, did we already add implicit
// initializers?
auto name = payload.Name;
if ((!name || name.matchesRef(getASTContext().Id_init)) &&
!nominal->addedImplicitInitializers())
return false;
// For classes, check the superclass.
if (auto classDecl = dyn_cast<ClassDecl>(nominal)) {
if (!isSatisfied(requestTypeCheckSuperclass(classDecl)))
return false;
if (auto superclass = classDecl->getSuperclass()) {
if (auto superclassDecl = superclass->getAnyNominal()) {
if (!isSatisfied(requestQualifiedLookupInDeclContext({ superclassDecl,
payload.Name,
payload.Loc })))
return false;
}
}
}
return true;
}