Skip to content

Commit 7493fee

Browse files
authored
Merge pull request #6136 from DougGregor/minor-cleanups
2 parents 4e6fb23 + 0228c0c commit 7493fee

File tree

11 files changed

+59
-52
lines changed

11 files changed

+59
-52
lines changed

include/swift/AST/ASTContext.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,6 @@ class ASTContext {
203203
/// The name of the SwiftShims module "SwiftShims".
204204
Identifier SwiftShimsModuleName;
205205

206-
/// Note: in non-NDEBUG builds, tracks the context of each primary
207-
/// archetype type, which can be very useful for debugging.
208-
llvm::DenseMap<ArchetypeType *, DeclContext *> ArchetypeContexts;
209-
210206
// Define the set of known identifiers.
211207
#define IDENTIFIER_WITH_NAME(Name, IdStr) Identifier Id_##Name;
212208
#include "swift/AST/KnownIdentifiers.def"

include/swift/AST/Decl.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,6 +1466,9 @@ class ExtensionDecl final : public Decl, public DeclContext,
14661466
void setGenericEnvironment(GenericEnvironment *env) {
14671467
assert(!GenericEnv && "Already have generic context");
14681468
GenericEnv = env;
1469+
1470+
if (GenericEnv)
1471+
GenericEnv->setOwningDeclContext(this);
14691472
}
14701473

14711474
/// Retrieve the generic requirements.
@@ -2275,6 +2278,9 @@ class GenericTypeDecl : public TypeDecl, public DeclContext {
22752278
void setGenericEnvironment(GenericEnvironment *env) {
22762279
assert(!this->GenericEnv && "already have generic context?");
22772280
this->GenericEnv = env;
2281+
2282+
if (GenericEnv)
2283+
GenericEnv->setOwningDeclContext(this);
22782284
}
22792285

22802286
// Resolve ambiguity due to multiple base classes.
@@ -4558,6 +4564,9 @@ class AbstractFunctionDecl : public ValueDecl, public DeclContext {
45584564
void setGenericEnvironment(GenericEnvironment *GenericEnv) {
45594565
assert(!this->GenericEnv && "already have generic context?");
45604566
this->GenericEnv = GenericEnv;
4567+
4568+
if (GenericEnv)
4569+
GenericEnv->setOwningDeclContext(this);
45614570
}
45624571

45634572
// Expose our import as member status

include/swift/AST/GenericEnvironment.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ class alignas(1 << DeclAlignInBits) GenericEnvironment final
3838
: private llvm::TrailingObjects<GenericEnvironment, Type,
3939
std::pair<ArchetypeType *,
4040
GenericTypeParamType *>> {
41-
GenericSignature *Signature;
42-
ArchetypeBuilder *Builder;
41+
GenericSignature *Signature = nullptr;
42+
ArchetypeBuilder *Builder = nullptr;
43+
DeclContext *OwningDC = nullptr;
4344

4445
// The number of generic type parameter -> context type mappings we have
4546
// recorded so far. This saturates at the number of generic type parameters,
@@ -164,6 +165,18 @@ class alignas(1 << DeclAlignInBits) GenericEnvironment final
164165
GenericEnvironment *getIncomplete(GenericSignature *signature,
165166
ArchetypeBuilder *builder);
166167

168+
/// Set the owning declaration context for this generic environment.
169+
void setOwningDeclContext(DeclContext *owningDC);
170+
171+
/// Retrieve the declaration context that owns this generic environment, if
172+
/// there is one.
173+
///
174+
/// Note that several generic environments may refer to the same declaration
175+
/// context, because non-generic declarations nested within generic ones
176+
/// inherit the enclosing generic environment. In such cases, the owning
177+
/// context is the outermost context.
178+
DeclContext *getOwningDeclContext() const { return OwningDC; }
179+
167180
/// Add a mapping of a generic parameter to a specific type (which may be
168181
/// an archetype)
169182
void addMapping(GenericParamKey key, Type contextType);

lib/AST/ASTContext.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2386,13 +2386,9 @@ void ASTContext::dumpArchetypeContext(ArchetypeType *archetype,
23862386
if (archetype->isOpenedExistential())
23872387
return;
23882388

2389-
archetype = archetype->getPrimary();
2390-
if (!archetype)
2391-
return;
2392-
2393-
auto knownDC = ArchetypeContexts.find(archetype);
2394-
if (knownDC != ArchetypeContexts.end())
2395-
knownDC->second->printContext(os, indent);
2389+
if (auto env = archetype->getGenericEnvironment())
2390+
if (auto owningDC = env->getOwningDeclContext())
2391+
owningDC->printContext(os, indent);
23962392
}
23972393

23982394
//===----------------------------------------------------------------------===//

lib/AST/ASTVerifier.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -451,11 +451,12 @@ struct ASTNodeBase {};
451451
Out << "AST verification error: archetype "
452452
<< archetype->getString() << " not allowed in this context\n";
453453

454-
auto knownDC = Ctx.ArchetypeContexts.find(parent);
455-
if (knownDC != Ctx.ArchetypeContexts.end()) {
456-
llvm::errs() << "archetype came from:\n";
457-
knownDC->second->dumpContext();
458-
llvm::errs() << "\n";
454+
if (auto env = parent->getGenericEnvironment()) {
455+
if (auto owningDC = env->getOwningDeclContext()) {
456+
llvm::errs() << "archetype came from:\n";
457+
owningDC->dumpContext();
458+
llvm::errs() << "\n";
459+
}
459460
}
460461

461462
return true;

lib/AST/ArchetypeBuilder.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -546,11 +546,11 @@ Type ArchetypeBuilder::PotentialArchetype::getTypeInContext(
546546

547547
// Local function to check whether we have a generic parameter that has
548548
// already been recorded
549-
auto getAlreadyRecoveredGenericParam = [&]() -> Optional<Type> {
550-
if (!isGenericParam()) return None;
549+
auto getAlreadyRecoveredGenericParam = [&]() -> Type {
550+
if (!isGenericParam()) return Type();
551551

552552
auto type = genericEnv->getMappingIfPresent(getGenericParamKey());
553-
if (!type) return None;
553+
if (!type) return Type();
554554

555555
// We already have a mapping for this generic parameter in the generic
556556
// environment. Return it.
@@ -610,7 +610,7 @@ Type ArchetypeBuilder::PotentialArchetype::getTypeInContext(
610610
// We will build the archetype below.
611611
assocType = getResolvedAssociatedType();
612612
} else if (auto result = getAlreadyRecoveredGenericParam()) {
613-
return *result;
613+
return result;
614614
}
615615

616616
// Determine the superclass for the archetype. If it exists and involves
@@ -627,7 +627,7 @@ Type ArchetypeBuilder::PotentialArchetype::getTypeInContext(
627627
// We might have recursively recorded the archetype; if so, return early.
628628
// FIXME: This should be detectable before we end up building archetypes.
629629
if (auto result = getAlreadyRecoveredGenericParam())
630-
return *result;
630+
return result;
631631
}
632632

633633
// Build a new archetype.

lib/AST/GenericEnvironment.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,26 @@ GenericEnvironment::GenericEnvironment(
4040
addMapping(entry.first->castTo<GenericTypeParamType>(), entry.second);
4141
}
4242

43+
void GenericEnvironment::setOwningDeclContext(DeclContext *newNowningDC) {
44+
if (!OwningDC) {
45+
OwningDC = newNowningDC;
46+
return;
47+
}
48+
49+
if (!newNowningDC || OwningDC == newNowningDC)
50+
return;
51+
52+
// If we have found a outer context sharing the same generic environment,
53+
// use that.
54+
if (OwningDC->isChildContextOf(newNowningDC)) {
55+
OwningDC = newNowningDC;
56+
return;
57+
}
58+
59+
// Otherwise, we have an inner context sharing the envirtonment.
60+
assert(newNowningDC->isChildContextOf(OwningDC) && "Not an inner context");
61+
}
62+
4363
void GenericEnvironment::addMapping(GenericParamKey key,
4464
Type contextType) {
4565
// Find the index into the parallel arrays of generic parameters and

lib/IRGen/GenMeta.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4707,7 +4707,7 @@ namespace {
47074707
CanType getParentType() const {
47084708
Type type = Target->getDeclaredTypeInContext();
47094709
Type parentType = type->getNominalParent();
4710-
return parentType ? parentType->getCanonicalType() : CanType();
4710+
return parentType.getCanonicalTypeOrNull();
47114711
}
47124712

47134713
public:

lib/Sema/TypeCheckDecl.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,6 @@ TypeChecker::handleSILGenericParams(GenericParamList *genericParams,
728728
parentEnv = checkGenericEnvironment(genericParams, DC, parentSig,
729729
/*allowConcreteGenericParams=*/true);
730730
parentSig = parentEnv->getGenericSignature();
731-
recordArchetypeContexts(parentEnv, DC);
732731

733732
// Compute the final set of archetypes.
734733
revertGenericParamList(genericParams);
@@ -4782,8 +4781,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
47824781
// Assign archetypes.
47834782
auto *env = builder.getGenericEnvironment(sig);
47844783
FD->setGenericEnvironment(env);
4785-
4786-
TC.recordArchetypeContexts(env, FD);
47874784
} else if (FD->getDeclContext()->getGenericSignatureOfContext()) {
47884785
(void)TC.validateGenericFuncSignature(FD);
47894786
if (FD->getGenericEnvironment() == nullptr) {
@@ -6409,8 +6406,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
64096406
// Assign archetypes.
64106407
auto *env = builder.getGenericEnvironment(sig);
64116408
CD->setGenericEnvironment(env);
6412-
6413-
TC.recordArchetypeContexts(env, CD);
64146409
} else if (CD->getDeclContext()->getGenericSignatureOfContext()) {
64156410
(void)TC.validateGenericFuncSignature(CD);
64166411

@@ -7409,7 +7404,6 @@ checkExtensionGenericParams(TypeChecker &tc, ExtensionDecl *ext, Type type,
74097404
ext->getDeclContext(), nullptr,
74107405
/*allowConcreteGenericParams=*/true,
74117406
inferExtendedTypeReqs);
7412-
tc.recordArchetypeContexts(env, ext);
74137407

74147408
// Validate the generic parameters for the last time, to splat down
74157409
// actual archetypes.

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -790,23 +790,6 @@ static void revertDependentTypeLoc(TypeLoc &tl) {
790790
tl.setType(Type(), /*validated=*/false);
791791
}
792792

793-
/// Store a mapping from archetypes to DeclContexts for debugging.
794-
void
795-
TypeChecker::recordArchetypeContexts(GenericEnvironment *genericEnv,
796-
DeclContext *dc) {
797-
#ifndef NDEBUG
798-
// Record archetype contexts.
799-
auto genericSig = genericEnv->getGenericSignature();
800-
for (auto *paramTy : genericSig->getGenericParams()) {
801-
auto contextTy = genericEnv->mapTypeIntoContext(
802-
paramTy->castTo<GenericTypeParamType>());
803-
if (auto *archetype = contextTy->getAs<ArchetypeType>())
804-
if (Context.ArchetypeContexts.count(archetype) == 0)
805-
Context.ArchetypeContexts[archetype] = dc;
806-
}
807-
#endif
808-
}
809-
810793
/// Revert the dependent types within the given generic parameter list.
811794
void TypeChecker::revertGenericParamList(GenericParamList *genericParams) {
812795
// Revert the inherited clause of the generic parameter list.
@@ -858,7 +841,6 @@ void TypeChecker::validateGenericTypeSignature(GenericTypeDecl *typeDecl) {
858841
auto *env = checkGenericEnvironment(gp, dc, dc->getGenericSignatureOfContext(),
859842
/*allowConcreteGenericParams=*/false);
860843
typeDecl->setGenericEnvironment(env);
861-
recordArchetypeContexts(env, typeDecl);
862844
}
863845

864846
void TypeChecker::revertGenericFuncSignature(AbstractFunctionDecl *func) {

lib/Sema/TypeChecker.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,10 +1071,6 @@ class TypeChecker final : public LazyResolver {
10711071
[&](ArchetypeBuilder &) { });
10721072
}
10731073

1074-
/// Store a mapping from archetypes to DeclContexts for debugging.
1075-
void recordArchetypeContexts(GenericEnvironment *genericEnv,
1076-
DeclContext *dc);
1077-
10781074
/// Validate the signature of a generic type.
10791075
///
10801076
/// \param nominal The generic type.

0 commit comments

Comments
 (0)