Skip to content

Commit 78de7d1

Browse files
authored
Merge pull request #39990 from slavapestov/completely-encapsulate-gsb
Completely encapsulate GenericSignatureBuilder
2 parents 0251957 + 0d167a4 commit 78de7d1

26 files changed

+297
-303
lines changed

include/swift/AST/GenericSignature.h

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ class GenericSignature {
114114

115115
public:
116116
/// Create a new generic signature with the given type parameters and
117-
/// requirements.
117+
/// requirements. The requirements must already be minimal and canonical;
118+
/// to build a signature from an arbitrary set of requirements, use
119+
/// swift::buildGenericSignature() instead.
118120
static GenericSignature get(ArrayRef<GenericTypeParamType *> params,
119121
ArrayRef<Requirement> requirements,
120122
bool isKnownCanonical = false);
@@ -494,6 +496,31 @@ int compareAssociatedTypes(AssociatedTypeDecl *assocType1,
494496

495497
int compareDependentTypes(Type type1, Type type2);
496498

499+
/// Verify the correctness of the given generic signature.
500+
///
501+
/// This routine will test that the given generic signature is both minimal
502+
/// and canonical, emitting errors if it is not.
503+
void validateGenericSignature(ASTContext &context,
504+
GenericSignature sig);
505+
506+
/// Verify all of the generic signatures in the given module.
507+
void validateGenericSignaturesInModule(ModuleDecl *module);
508+
509+
/// Build a generic signature from the given requirements, which are not
510+
/// required to be minimal or canonical, and may contain unresolved
511+
/// DependentMemberTypes.
512+
///
513+
/// If \p baseSignature is non-null, the new parameters and requirements
514+
/// are added on; existing requirements of the base signature might become
515+
/// redundant.
516+
///
517+
/// If \p baseSignature is null, build a new signature from scratch.
518+
GenericSignature buildGenericSignature(
519+
ASTContext &ctx,
520+
GenericSignature baseSignature,
521+
SmallVector<GenericTypeParamType *, 2> addedParameters,
522+
SmallVector<Requirement, 2> addedRequirements);
523+
497524
} // end namespace swift
498525

499526
namespace llvm {

include/swift/AST/TypeCheckRequests.h

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,11 +1411,17 @@ class ClassAncestryFlagsRequest :
14111411

14121412
void simple_display(llvm::raw_ostream &out, AncestryFlags value);
14131413

1414+
/// AbstractGenericSignatureRequest and InferredGenericSignatureRequest
1415+
/// return this type, which stores a GenericSignature together with a bit
1416+
/// indicating if there were any errors detected in the original
1417+
/// requirements.
1418+
using GenericSignatureWithError = llvm::PointerIntPair<GenericSignature, 1>;
1419+
14141420
class AbstractGenericSignatureRequest :
14151421
public SimpleRequest<AbstractGenericSignatureRequest,
1416-
GenericSignature (const GenericSignatureImpl *,
1417-
SmallVector<GenericTypeParamType *, 2>,
1418-
SmallVector<Requirement, 2>),
1422+
GenericSignatureWithError (const GenericSignatureImpl *,
1423+
SmallVector<GenericTypeParamType *, 2>,
1424+
SmallVector<Requirement, 2>),
14191425
RequestFlags::Cached> {
14201426
public:
14211427
using SimpleRequest::SimpleRequest;
@@ -1424,7 +1430,7 @@ class AbstractGenericSignatureRequest :
14241430
friend SimpleRequest;
14251431

14261432
// Evaluation.
1427-
GenericSignature
1433+
GenericSignatureWithError
14281434
evaluate(Evaluator &evaluator,
14291435
const GenericSignatureImpl *baseSignature,
14301436
SmallVector<GenericTypeParamType *, 2> addedParameters,
@@ -1442,13 +1448,13 @@ class AbstractGenericSignatureRequest :
14421448

14431449
class InferredGenericSignatureRequest :
14441450
public SimpleRequest<InferredGenericSignatureRequest,
1445-
GenericSignature (ModuleDecl *,
1446-
const GenericSignatureImpl *,
1447-
GenericParamList *,
1448-
WhereClauseOwner,
1449-
SmallVector<Requirement, 2>,
1450-
SmallVector<TypeLoc, 2>,
1451-
bool),
1451+
GenericSignatureWithError (ModuleDecl *,
1452+
const GenericSignatureImpl *,
1453+
GenericParamList *,
1454+
WhereClauseOwner,
1455+
SmallVector<Requirement, 2>,
1456+
SmallVector<TypeLoc, 2>,
1457+
bool),
14521458
RequestFlags::Cached> {
14531459
public:
14541460
using SimpleRequest::SimpleRequest;
@@ -1457,7 +1463,7 @@ class InferredGenericSignatureRequest :
14571463
friend SimpleRequest;
14581464

14591465
// Evaluation.
1460-
GenericSignature
1466+
GenericSignatureWithError
14611467
evaluate(Evaluator &evaluator,
14621468
ModuleDecl *parentModule,
14631469
const GenericSignatureImpl *baseSignature,

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
//===----------------------------------------------------------------------===//
1717

1818
SWIFT_REQUEST(TypeChecker, AbstractGenericSignatureRequest,
19-
GenericSignature (const GenericSignatureImpl *,
20-
SmallVector<GenericTypeParamType *, 2>,
21-
SmallVector<Requirement, 2>),
19+
GenericSignatureWithError (const GenericSignatureImpl *,
20+
SmallVector<GenericTypeParamType *, 2>,
21+
SmallVector<Requirement, 2>),
2222
Cached, NoLocationInfo)
2323
SWIFT_REQUEST(TypeChecker, ApplyAccessNoteRequest,
2424
evaluator::SideEffect(ValueDecl *), Cached, NoLocationInfo)
@@ -131,12 +131,12 @@ SWIFT_REQUEST(TypeChecker, HasImplementationOnlyImportsRequest,
131131
SWIFT_REQUEST(TypeChecker, ModuleLibraryLevelRequest,
132132
LibraryLevel(ModuleDecl *), Cached, NoLocationInfo)
133133
SWIFT_REQUEST(TypeChecker, InferredGenericSignatureRequest,
134-
GenericSignature (ModuleDecl *,
135-
const GenericSignatureImpl *,
136-
GenericParamList *,
137-
WhereClauseOwner,
138-
SmallVector<Requirement, 2>,
139-
SmallVector<TypeLoc, 2>, bool),
134+
GenericSignatureWithError (ModuleDecl *,
135+
const GenericSignatureImpl *,
136+
GenericParamList *,
137+
WhereClauseOwner,
138+
SmallVector<Requirement, 2>,
139+
SmallVector<TypeLoc, 2>, bool),
140140
Cached, NoLocationInfo)
141141
SWIFT_REQUEST(TypeChecker, DistributedModuleIsAvailableRequest,
142142
bool(ModuleDecl *), Cached, NoLocationInfo)

lib/AST/ASTContext.cpp

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "swift/AST/ASTContext.h"
1818
#include "ClangTypeConverter.h"
1919
#include "ForeignRepresentationInfo.h"
20+
#include "GenericSignatureBuilder.h"
2021
#include "SubstitutionMapStorage.h"
2122
#include "swift/AST/ClangModuleLoader.h"
2223
#include "swift/AST/ConcreteDeclRef.h"
@@ -28,7 +29,6 @@
2829
#include "swift/AST/ForeignErrorConvention.h"
2930
#include "swift/AST/GenericEnvironment.h"
3031
#include "swift/AST/GenericSignature.h"
31-
#include "swift/AST/GenericSignatureBuilder.h"
3232
#include "swift/AST/ImportCache.h"
3333
#include "swift/AST/IndexSubset.h"
3434
#include "swift/AST/KnownProtocols.h"
@@ -4253,13 +4253,11 @@ OpaqueTypeArchetypeType::get(OpaqueTypeDecl *Decl, unsigned ordinal,
42534253
}
42544254
# endif
42554255
#endif
4256-
auto signature = evaluateOrDefault(
4257-
ctx.evaluator,
4258-
AbstractGenericSignatureRequest{
4259-
Decl->getOpaqueInterfaceGenericSignature().getPointer(),
4256+
auto signature = buildGenericSignature(
4257+
ctx,
4258+
Decl->getOpaqueInterfaceGenericSignature(),
42604259
/*genericParams=*/{ },
4261-
std::move(newRequirements)},
4262-
nullptr);
4260+
std::move(newRequirements));
42634261

42644262
auto reqs = signature->getLocalRequirements(opaqueParamType);
42654263
auto superclass = reqs.superclass;
@@ -5024,10 +5022,10 @@ CanGenericSignature ASTContext::getOpenedArchetypeSignature(Type type) {
50245022
auto genericParam = GenericTypeParamType::get(0, 0, *this);
50255023
Requirement requirement(RequirementKind::Conformance, genericParam,
50265024
existential);
5027-
auto genericSig = evaluateOrDefault(
5028-
evaluator,
5029-
AbstractGenericSignatureRequest{nullptr, {genericParam}, {requirement}},
5030-
GenericSignature());
5025+
auto genericSig = buildGenericSignature(*this,
5026+
GenericSignature(),
5027+
{genericParam},
5028+
{requirement});
50315029

50325030
CanGenericSignature canGenericSig(genericSig);
50335031

@@ -5125,13 +5123,9 @@ ASTContext::getOverrideGenericSignature(const ValueDecl *base,
51255123
}
51265124
}
51275125

5128-
auto genericSig = evaluateOrDefault(
5129-
evaluator,
5130-
AbstractGenericSignatureRequest{
5131-
derivedClassSig.getPointer(),
5132-
std::move(addedGenericParams),
5133-
std::move(addedRequirements)},
5134-
GenericSignature());
5126+
auto genericSig = buildGenericSignature(*this, derivedClassSig,
5127+
std::move(addedGenericParams),
5128+
std::move(addedRequirements));
51355129
getImpl().overrideSigCache.insert(std::make_pair(key, genericSig));
51365130
return genericSig;
51375131
}

lib/AST/ASTDemangler.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -897,12 +897,8 @@ CanGenericSignature ASTBuilder::demangleGenericSignature(
897897

898898
decodeRequirement<BuiltType, BuiltRequirement, BuiltLayoutConstraint,
899899
ASTBuilder>(node, requirements, *this);
900-
return evaluateOrDefault(Ctx.evaluator,
901-
AbstractGenericSignatureRequest{
902-
nominalDecl->getGenericSignature().getPointer(),
903-
{},
904-
std::move(requirements)},
905-
GenericSignature())
900+
return buildGenericSignature(Ctx, nominalDecl->getGenericSignature(),
901+
{}, std::move(requirements))
906902
.getCanonicalSignature();
907903
}
908904

lib/AST/AutoDiff.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -273,12 +273,9 @@ GenericSignature autodiff::getConstrainedDerivativeGenericSignature(
273273
requirements.push_back(req);
274274
}
275275
}
276-
return evaluateOrDefault(
277-
ctx.evaluator,
278-
AbstractGenericSignatureRequest{derivativeGenSig.getPointer(),
279-
/*addedGenericParams*/ {},
280-
std::move(requirements)},
281-
nullptr);
276+
return buildGenericSignature(ctx, derivativeGenSig,
277+
/*addedGenericParams*/ {},
278+
std::move(requirements));
282279
}
283280

284281
// Given the rest of a `Builtin.applyDerivative_{jvp|vjp}` or

lib/AST/Builtins.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -305,12 +305,10 @@ synthesizeGenericSignature(SynthesisContext &SC,
305305
CollectGenericParams collector(SC);
306306
list.Params.visit(collector);
307307

308-
return evaluateOrDefault(
309-
SC.Context.evaluator,
310-
AbstractGenericSignatureRequest{
311-
nullptr, std::move(collector.GenericParamTypes),
312-
std::move(collector.AddedRequirements)},
313-
nullptr);
308+
return buildGenericSignature(SC.Context,
309+
GenericSignature(),
310+
std::move(collector.GenericParamTypes),
311+
std::move(collector.AddedRequirements));
314312
}
315313

316314
/// Build a builtin function declaration.
@@ -671,8 +669,8 @@ namespace {
671669
bool Async = false;
672670
BuiltinThrowsKind Throws = BuiltinThrowsKind::None;
673671

674-
// Accumulate params and requirements here, so that we can make the
675-
// appropriate `AbstractGenericSignatureRequest` when `build()` is called.
672+
// Accumulate params and requirements here, so that we can call
673+
// `buildGenericSignature()` when `build()` is called.
676674
SmallVector<GenericTypeParamType *, 2> genericParamTypes;
677675
SmallVector<Requirement, 2> addedRequirements;
678676

@@ -727,11 +725,10 @@ namespace {
727725
}
728726

729727
FuncDecl *build(Identifier name) {
730-
auto GenericSig = evaluateOrDefault(
731-
Context.evaluator,
732-
AbstractGenericSignatureRequest{
733-
nullptr, std::move(genericParamTypes), std::move(addedRequirements)},
734-
nullptr);
728+
auto GenericSig = buildGenericSignature(
729+
Context, GenericSignature(),
730+
std::move(genericParamTypes),
731+
std::move(addedRequirements));
735732
return getBuiltinGenericFunction(name, InterfaceParams,
736733
InterfaceResult,
737734
TheGenericParamList, GenericSig,

0 commit comments

Comments
 (0)