Skip to content

Commit d847bc1

Browse files
committed
Sema: Refactor InferredGenericSignatureRequest to take a WhereClauseOwner
1 parent c21218d commit d847bc1

7 files changed

+70
-108
lines changed

Diff for: include/swift/AST/GenericParamList.h

-2
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,6 @@ class RequirementRepr {
203203
void print(ASTPrinter &Printer) const;
204204
};
205205

206-
using GenericParamSource = PointerUnion<GenericContext *, GenericParamList *>;
207-
208206
/// GenericParamList - A list of generic parameters that is part of a generic
209207
/// function or type, along with extra requirements placed on those generic
210208
/// parameters and types derived from them.

Diff for: include/swift/AST/TypeCheckRequests.h

+15-7
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,8 @@ struct WhereClauseOwner {
459459
SpecializeAttr *, DifferentiableAttr *>
460460
source;
461461

462+
WhereClauseOwner() : dc(nullptr) {}
463+
462464
WhereClauseOwner(GenericContext *genCtx);
463465
WhereClauseOwner(AssociatedTypeDecl *atd);
464466

@@ -480,6 +482,10 @@ struct WhereClauseOwner {
480482
return llvm::hash_value(owner.source.getOpaqueValue());
481483
}
482484

485+
operator bool() const {
486+
return dc != nullptr;
487+
}
488+
483489
friend bool operator==(const WhereClauseOwner &lhs,
484490
const WhereClauseOwner &rhs) {
485491
return lhs.source.getOpaqueValue() == rhs.source.getOpaqueValue();
@@ -1437,11 +1443,12 @@ class AbstractGenericSignatureRequest :
14371443
class InferredGenericSignatureRequest :
14381444
public SimpleRequest<InferredGenericSignatureRequest,
14391445
GenericSignature (ModuleDecl *,
1440-
const GenericSignatureImpl *,
1441-
GenericParamSource,
1442-
SmallVector<Requirement, 2>,
1443-
SmallVector<TypeLoc, 2>,
1444-
bool),
1446+
const GenericSignatureImpl *,
1447+
GenericParamList *,
1448+
WhereClauseOwner,
1449+
SmallVector<Requirement, 2>,
1450+
SmallVector<TypeLoc, 2>,
1451+
bool),
14451452
RequestFlags::Cached> {
14461453
public:
14471454
using SimpleRequest::SimpleRequest;
@@ -1452,9 +1459,10 @@ class InferredGenericSignatureRequest :
14521459
// Evaluation.
14531460
GenericSignature
14541461
evaluate(Evaluator &evaluator,
1455-
ModuleDecl *module,
1462+
ModuleDecl *parentModule,
14561463
const GenericSignatureImpl *baseSignature,
1457-
GenericParamSource paramSource,
1464+
GenericParamList *genericParams,
1465+
WhereClauseOwner whereClause,
14581466
SmallVector<Requirement, 2> addedRequirements,
14591467
SmallVector<TypeLoc, 2> inferenceSources,
14601468
bool allowConcreteGenericParams) const;

Diff for: include/swift/AST/TypeCheckerTypeIDZone.def

+6-4
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,12 @@ SWIFT_REQUEST(TypeChecker, HasImplementationOnlyImportsRequest,
131131
SWIFT_REQUEST(TypeChecker, ModuleLibraryLevelRequest,
132132
LibraryLevel(ModuleDecl *), Cached, NoLocationInfo)
133133
SWIFT_REQUEST(TypeChecker, InferredGenericSignatureRequest,
134-
GenericSignature (ModuleDecl *, const GenericSignatureImpl *,
135-
GenericParamSource,
136-
SmallVector<Requirement, 2>,
137-
SmallVector<TypeLoc, 2>, bool),
134+
GenericSignature (ModuleDecl *,
135+
const GenericSignatureImpl *,
136+
GenericParamList *,
137+
WhereClauseOwner,
138+
SmallVector<Requirement, 2>,
139+
SmallVector<TypeLoc, 2>, bool),
138140
Cached, NoLocationInfo)
139141
SWIFT_REQUEST(TypeChecker, DistributedModuleIsAvailableRequest,
140142
bool(ModuleDecl *), Cached, NoLocationInfo)

Diff for: lib/AST/GenericSignatureBuilder.cpp

+7-16
Original file line numberDiff line numberDiff line change
@@ -8679,9 +8679,11 @@ AbstractGenericSignatureRequest::evaluate(
86798679

86808680
GenericSignature
86818681
InferredGenericSignatureRequest::evaluate(
8682-
Evaluator &evaluator, ModuleDecl *parentModule,
8682+
Evaluator &evaluator,
8683+
ModuleDecl *parentModule,
86838684
const GenericSignatureImpl *parentSig,
8684-
GenericParamSource paramSource,
8685+
GenericParamList *genericParams,
8686+
WhereClauseOwner whereClause,
86858687
SmallVector<Requirement, 2> addedRequirements,
86868688
SmallVector<TypeLoc, 2> inferenceSources,
86878689
bool allowConcreteGenericParams) const {
@@ -8729,12 +8731,6 @@ InferredGenericSignatureRequest::evaluate(
87298731
return false;
87308732
};
87318733

8732-
GenericParamList *genericParams = nullptr;
8733-
if (auto params = paramSource.dyn_cast<GenericParamList *>())
8734-
genericParams = params;
8735-
else
8736-
genericParams = paramSource.get<GenericContext *>()->getGenericParams();
8737-
87388734
if (genericParams) {
87398735
// Extensions never have a parent signature.
87408736
if (genericParams->getOuterParameters())
@@ -8777,15 +8773,10 @@ InferredGenericSignatureRequest::evaluate(
87778773
}
87788774
}
87798775

8780-
if (auto *ctx = paramSource.dyn_cast<GenericContext *>()) {
8781-
// The declaration might have a trailing where clause.
8782-
if (auto *where = ctx->getTrailingWhereClause()) {
8783-
// Determine where and how to perform name lookup.
8784-
lookupDC = ctx;
8785-
8786-
WhereClauseOwner(lookupDC, where).visitRequirements(
8776+
if (whereClause) {
8777+
lookupDC = whereClause.dc;
8778+
std::move(whereClause).visitRequirements(
87878779
TypeResolutionStage::Structural, visitRequirement);
8788-
}
87898780
}
87908781

87918782
/// Perform any remaining requirement inference.

Diff for: lib/Sema/TypeCheckGeneric.cpp

+34-47
Original file line numberDiff line numberDiff line change
@@ -517,44 +517,6 @@ void TypeChecker::checkReferencedGenericParams(GenericContext *dc) {
517517
/// Generic types
518518
///
519519

520-
GenericSignature TypeChecker::checkGenericSignature(
521-
GenericParamSource paramSource,
522-
DeclContext *dc,
523-
GenericSignature parentSig,
524-
bool allowConcreteGenericParams,
525-
SmallVector<Requirement, 2> additionalRequirements,
526-
SmallVector<TypeLoc, 2> inferenceSources) {
527-
if (auto genericParamList = paramSource.dyn_cast<GenericParamList *>())
528-
assert(genericParamList && "Missing generic parameters?");
529-
530-
auto request = InferredGenericSignatureRequest{
531-
dc->getParentModule(), parentSig.getPointer(), paramSource,
532-
additionalRequirements, inferenceSources,
533-
allowConcreteGenericParams};
534-
auto sig = evaluateOrDefault(dc->getASTContext().evaluator,
535-
request, nullptr);
536-
537-
// Debugging of the generic signature builder and generic signature
538-
// generation.
539-
if (dc->getASTContext().TypeCheckerOpts.DebugGenericSignatures) {
540-
llvm::errs() << "\n";
541-
if (auto *VD = dyn_cast_or_null<ValueDecl>(dc->getAsDecl())) {
542-
VD->dumpRef(llvm::errs());
543-
llvm::errs() << "\n";
544-
} else {
545-
dc->printContext(llvm::errs());
546-
}
547-
llvm::errs() << "Generic signature: ";
548-
sig->print(llvm::errs());
549-
llvm::errs() << "\n";
550-
llvm::errs() << "Canonical generic signature: ";
551-
sig.getCanonicalSignature()->print(llvm::errs());
552-
llvm::errs() << "\n";
553-
}
554-
555-
return sig;
556-
}
557-
558520
/// Form the interface type of an extension from the raw type and the
559521
/// extension's list of generic parameters.
560522
static Type formExtensionInterfaceType(
@@ -649,6 +611,8 @@ static unsigned getExtendedTypeGenericDepth(ExtensionDecl *ext) {
649611
GenericSignature
650612
GenericSignatureRequest::evaluate(Evaluator &evaluator,
651613
GenericContext *GC) const {
614+
auto &ctx = GC->getASTContext();
615+
652616
// The signature of a Protocol is trivial (Self: TheProtocol) so let's compute
653617
// it.
654618
if (auto PD = dyn_cast<ProtocolDecl>(GC)) {
@@ -660,7 +624,7 @@ GenericSignatureRequest::evaluate(Evaluator &evaluator,
660624

661625
// Debugging of the generic signature builder and generic signature
662626
// generation.
663-
if (GC->getASTContext().TypeCheckerOpts.DebugGenericSignatures) {
627+
if (ctx.TypeCheckerOpts.DebugGenericSignatures) {
664628
llvm::errs() << "\n";
665629
PD->printContext(llvm::errs());
666630
llvm::errs() << "Generic signature: ";
@@ -698,10 +662,10 @@ GenericSignatureRequest::evaluate(Evaluator &evaluator,
698662
// If there is no generic context for the where clause to
699663
// rely on, diagnose that now and bail out.
700664
if (!GC->isGenericContext()) {
701-
GC->getASTContext().Diags.diagnose(where->getWhereLoc(),
702-
GC->getParent()->isModuleScopeContext()
703-
? diag::where_nongeneric_toplevel
704-
: diag::where_nongeneric_ctx);
665+
ctx.Diags.diagnose(where->getWhereLoc(),
666+
GC->getParent()->isModuleScopeContext()
667+
? diag::where_nongeneric_toplevel
668+
: diag::where_nongeneric_ctx);
705669
return nullptr;
706670
}
707671
}
@@ -806,10 +770,33 @@ GenericSignatureRequest::evaluate(Evaluator &evaluator,
806770
inferenceSources.emplace_back(nullptr, extInterfaceType);
807771
}
808772

809-
return TypeChecker::checkGenericSignature(
810-
GC, GC, parentSig,
811-
allowConcreteGenericParams,
812-
sameTypeReqs, inferenceSources);
773+
auto request = InferredGenericSignatureRequest{
774+
GC->getParentModule(), parentSig.getPointer(),
775+
GC->getGenericParams(), WhereClauseOwner(GC),
776+
sameTypeReqs, inferenceSources,
777+
allowConcreteGenericParams};
778+
auto sig = evaluateOrDefault(ctx.evaluator,
779+
request, nullptr);
780+
781+
// Debugging of the generic signature builder and generic signature
782+
// generation.
783+
if (ctx.TypeCheckerOpts.DebugGenericSignatures) {
784+
llvm::errs() << "\n";
785+
if (auto *VD = dyn_cast_or_null<ValueDecl>(GC->getAsDecl())) {
786+
VD->dumpRef(llvm::errs());
787+
llvm::errs() << "\n";
788+
} else {
789+
GC->printContext(llvm::errs());
790+
}
791+
llvm::errs() << "Generic signature: ";
792+
sig->print(llvm::errs());
793+
llvm::errs() << "\n";
794+
llvm::errs() << "Canonical generic signature: ";
795+
sig.getCanonicalSignature()->print(llvm::errs());
796+
llvm::errs() << "\n";
797+
}
798+
799+
return sig;
813800
}
814801

815802
///

Diff for: lib/Sema/TypeChecker.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -437,10 +437,14 @@ swift::handleSILGenericParams(GenericParamList *genericParams,
437437
genericParams->walk(walker);
438438
}
439439

440-
return TypeChecker::checkGenericSignature(nestedList.back(), DC,
441-
/*parentSig=*/nullptr,
442-
/*allowConcreteGenericParams=*/true)
443-
.getGenericEnvironment();
440+
auto request = InferredGenericSignatureRequest{
441+
DC->getParentModule(), /*parentSig=*/nullptr,
442+
nestedList.back(), WhereClauseOwner(),
443+
{}, {}, /*allowConcreteGenericParams=*/true};
444+
auto sig = evaluateOrDefault(DC->getASTContext().evaluator,
445+
request, GenericSignature());
446+
447+
return sig.getGenericEnvironment();
444448
}
445449

446450
void swift::typeCheckPatternBinding(PatternBindingDecl *PBD,

Diff for: lib/Sema/TypeChecker.h

-28
Original file line numberDiff line numberDiff line change
@@ -422,34 +422,6 @@ void checkProtocolSelfRequirements(ValueDecl *decl);
422422
/// declaration's type, otherwise we have no way to infer them.
423423
void checkReferencedGenericParams(GenericContext *dc);
424424

425-
/// Construct a new generic environment for the given declaration context.
426-
///
427-
/// \param paramSource The source of generic info: either a generic parameter
428-
/// list or a generic context with a \c where clause dependent on outer
429-
/// generic parameters.
430-
///
431-
/// \param dc The declaration context in which to perform the validation.
432-
///
433-
/// \param outerSignature The generic signature of the outer
434-
/// context, if not available as part of the \c dc argument (used
435-
/// for SIL parsing).
436-
///
437-
/// \param allowConcreteGenericParams Whether or not to allow
438-
/// same-type constraints between generic parameters and concrete types.
439-
///
440-
/// \param additionalRequirements Additional requirements to add
441-
/// directly to the GSB.
442-
///
443-
/// \param inferenceSources Additional types to infer requirements from.
444-
///
445-
/// \returns the resulting generic signature.
446-
GenericSignature
447-
checkGenericSignature(GenericParamSource paramSource, DeclContext *dc,
448-
GenericSignature outerSignature,
449-
bool allowConcreteGenericParams,
450-
SmallVector<Requirement, 2> additionalRequirements = {},
451-
SmallVector<TypeLoc, 2> inferenceSources = {});
452-
453425
/// Create a text string that describes the bindings of generic parameters
454426
/// that are relevant to the given set of types, e.g.,
455427
/// "[with T = Bar, U = Wibble]".

0 commit comments

Comments
 (0)