Skip to content

Commit f38f25a

Browse files
committed
AST: Factor out AbstractGenericSignatureRequest into a new buildGenericSignature() function
This is slightly cleaner.
1 parent 3ea9e9e commit f38f25a

File tree

17 files changed

+102
-124
lines changed

17 files changed

+102
-124
lines changed

include/swift/AST/GenericSignature.h

Lines changed: 18 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,21 @@ int compareAssociatedTypes(AssociatedTypeDecl *assocType1,
494496

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

499+
/// Build a generic signature from the given requirements, which are not
500+
/// required to be minimal or canonical, and may contain unresolved
501+
/// DependentMemberTypes.
502+
///
503+
/// If \p baseSignature is non-null, the new parameters and requirements
504+
/// are added on; existing requirements of the base signature might become
505+
/// redundant.
506+
///
507+
/// If \p baseSignature is null, build a new signature from scratch.
508+
GenericSignature buildGenericSignature(
509+
ASTContext &ctx,
510+
GenericSignature baseSignature,
511+
SmallVector<GenericTypeParamType *, 2> addedParameters,
512+
SmallVector<Requirement, 2> addedRequirements);
513+
497514
} // end namespace swift
498515

499516
namespace llvm {

lib/AST/ASTContext.cpp

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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,

lib/AST/GenericSignature.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "swift/AST/GenericEnvironment.h"
2323
#include "swift/AST/Module.h"
2424
#include "swift/AST/PrettyStackTrace.h"
25+
#include "swift/AST/TypeCheckRequests.h"
2526
#include "swift/AST/Types.h"
2627
#include "swift/Basic/SourceManager.h"
2728
#include "swift/Basic/STLExtras.h"
@@ -1735,4 +1736,18 @@ void GenericSignature::verify() const {
17351736
abort();
17361737
}
17371738
}
1739+
}
1740+
1741+
GenericSignature
1742+
swift::buildGenericSignature(ASTContext &ctx,
1743+
GenericSignature baseSignature,
1744+
SmallVector<GenericTypeParamType *, 2> addedParameters,
1745+
SmallVector<Requirement, 2> addedRequirements) {
1746+
return evaluateOrDefault(
1747+
ctx.evaluator,
1748+
AbstractGenericSignatureRequest{
1749+
baseSignature.getPointer(),
1750+
addedParameters,
1751+
addedRequirements},
1752+
GenericSignature());
17381753
}

lib/AST/RequirementEnvironment.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,8 @@ RequirementEnvironment::RequirementEnvironment(
207207
}
208208

209209
// Produce the generic signature and environment.
210-
// FIXME: Pass in a source location for the conformance, perhaps? It seems
211-
// like this could fail.
212-
syntheticSignature = evaluateOrDefault(
213-
ctx.evaluator,
214-
AbstractGenericSignatureRequest{
215-
nullptr, std::move(genericParamTypes), std::move(requirements)},
216-
GenericSignature());
210+
syntheticSignature = buildGenericSignature(ctx, GenericSignature(),
211+
std::move(genericParamTypes),
212+
std::move(requirements));
217213
syntheticEnvironment = syntheticSignature.getGenericEnvironment();
218214
}

lib/AST/Type.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1890,13 +1890,11 @@ class IsBindableVisitor
18901890

18911891
// Build the generic signature with the additional collected requirements.
18921892
if (!addedRequirements.empty()) {
1893-
upperBoundGenericSig = evaluateOrDefault(
1894-
decl->getASTContext().evaluator,
1895-
AbstractGenericSignatureRequest{
1896-
upperBoundGenericSig.getPointer(),
1897-
/*genericParams=*/{ },
1898-
std::move(addedRequirements)},
1899-
nullptr);
1893+
upperBoundGenericSig = buildGenericSignature(decl->getASTContext(),
1894+
upperBoundGenericSig,
1895+
/*genericParams=*/{ },
1896+
std::move(addedRequirements));
1897+
19001898
upperBoundSubstMap = SubstitutionMap::get(upperBoundGenericSig,
19011899
[&](SubstitutableType *t) -> Type {
19021900
// Type substitutions remain the same as the original substitution
@@ -3988,10 +3986,8 @@ static Type substGenericFunctionType(GenericFunctionType *genericFnType,
39883986
// If there were semantic changes, we need to build a new generic
39893987
// signature.
39903988
ASTContext &ctx = genericFnType->getASTContext();
3991-
genericSig = evaluateOrDefault(
3992-
ctx.evaluator,
3993-
AbstractGenericSignatureRequest{nullptr, genericParams, requirements},
3994-
GenericSignature());
3989+
genericSig = buildGenericSignature(ctx, GenericSignature(),
3990+
genericParams, requirements);
39953991
} else {
39963992
// Use the mapped generic signature.
39973993
genericSig = GenericSignature::get(genericParams, requirements);

lib/ClangImporter/ImportDecl.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9199,11 +9199,10 @@ GenericSignature ClangImporter::Implementation::buildGenericSignature(
91999199
}
92009200
}
92019201

9202-
return evaluateOrDefault(
9203-
SwiftContext.evaluator,
9204-
AbstractGenericSignatureRequest{
9205-
nullptr, std::move(genericParamTypes), std::move(requirements)},
9206-
GenericSignature());
9202+
return swift::buildGenericSignature(
9203+
SwiftContext, GenericSignature(),
9204+
std::move(genericParamTypes),
9205+
std::move(requirements));
92079206
}
92089207

92099208
Decl *

lib/SIL/IR/SILFunctionType.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -405,10 +405,7 @@ static CanGenericSignature buildDifferentiableGenericSignature(CanGenericSignatu
405405
});
406406
}
407407

408-
return evaluateOrDefault(
409-
ctx.evaluator,
410-
AbstractGenericSignatureRequest{sig.getPointer(), {}, reqs},
411-
GenericSignature()).getCanonicalSignature();
408+
return buildGenericSignature(ctx, sig, {}, reqs).getCanonicalSignature();
412409
}
413410

414411
/// Given an original type, computes its tangent type for the purpose of

lib/SIL/Parser/ParseSIL.cpp

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2256,12 +2256,10 @@ static bool parseSILDifferentiabilityWitnessConfigAndFunction(
22562256
SmallVector<Requirement, 4> witnessRequirements(
22572257
witnessGenSig.getRequirements().begin(),
22582258
witnessGenSig.getRequirements().end());
2259-
witnessGenSig = evaluateOrDefault(
2260-
P.Context.evaluator,
2261-
AbstractGenericSignatureRequest{origGenSig.getPointer(),
2262-
/*addedGenericParams=*/{},
2263-
std::move(witnessRequirements)},
2264-
nullptr);
2259+
witnessGenSig = buildGenericSignature(
2260+
P.Context, origGenSig,
2261+
/*addedGenericParams=*/{},
2262+
std::move(witnessRequirements));
22652263
}
22662264
auto origFnType = resultOrigFn->getLoweredFunctionType();
22672265
auto *parameterIndices = IndexSubset::get(
@@ -6274,13 +6272,10 @@ bool SILParserState::parseDeclSIL(Parser &P) {
62746272
// Resolve types and convert requirements.
62756273
FunctionState.convertRequirements(Attr.requirements, requirements);
62766274
auto *fenv = FunctionState.F->getGenericEnvironment();
6277-
auto genericSig = evaluateOrDefault(
6278-
P.Context.evaluator,
6279-
AbstractGenericSignatureRequest{
6280-
fenv->getGenericSignature().getPointer(),
6281-
/*addedGenericParams=*/{ },
6282-
std::move(requirements)},
6283-
GenericSignature());
6275+
auto genericSig = buildGenericSignature(P.Context,
6276+
fenv->getGenericSignature(),
6277+
/*addedGenericParams=*/{ },
6278+
std::move(requirements));
62846279
FunctionState.F->addSpecializeAttr(SILSpecializeAttr::create(
62856280
FunctionState.F->getModule(), genericSig, Attr.exported,
62866281
Attr.kind, Attr.target, Attr.spiGroupID, Attr.spiModule, Attr.availability));

lib/SILGen/SILGenPoly.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3054,11 +3054,9 @@ buildThunkSignature(SILGenFunction &SGF,
30543054
Requirement newRequirement(RequirementKind::Conformance, newGenericParam,
30553055
openedExistential->getOpenedExistentialType());
30563056

3057-
auto genericSig = evaluateOrDefault(
3058-
ctx.evaluator,
3059-
AbstractGenericSignatureRequest{
3060-
baseGenericSig.getPointer(), { newGenericParam }, { newRequirement }},
3061-
GenericSignature());
3057+
auto genericSig = buildGenericSignature(ctx, baseGenericSig,
3058+
{ newGenericParam },
3059+
{ newRequirement });
30623060
genericEnv = genericSig.getGenericEnvironment();
30633061

30643062
newArchetype = genericEnv->mapTypeIntoContext(newGenericParam)

lib/SILOptimizer/Differentiation/Thunk.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,9 @@ CanGenericSignature buildThunkSignature(SILFunction *fn, bool inheritGenericSig,
6868
Requirement newRequirement(RequirementKind::Conformance, newGenericParam,
6969
openedExistential->getOpenedExistentialType());
7070

71-
auto genericSig = evaluateOrDefault(
72-
ctx.evaluator,
73-
AbstractGenericSignatureRequest{
74-
baseGenericSig.getPointer(), { newGenericParam }, { newRequirement }},
75-
GenericSignature());
71+
auto genericSig = buildGenericSignature(ctx, baseGenericSig,
72+
{ newGenericParam },
73+
{ newRequirement });
7674
genericEnv = genericSig.getGenericEnvironment();
7775

7876
newArchetype =

lib/SILOptimizer/FunctionSignatureTransforms/ExistentialTransform.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -335,12 +335,9 @@ ExistentialTransform::createExistentialSpecializedFunctionType() {
335335
convertExistentialArgTypesToGenericArgTypes(GenericParams, Requirements);
336336

337337
/// Compute the updated generic signature.
338-
NewGenericSig = evaluateOrDefault(
339-
Ctx.evaluator,
340-
AbstractGenericSignatureRequest{
341-
OrigGenericSig.getPointer(), std::move(GenericParams),
342-
std::move(Requirements)},
343-
GenericSignature());
338+
NewGenericSig = buildGenericSignature(Ctx, OrigGenericSig,
339+
std::move(GenericParams),
340+
std::move(Requirements));
344341

345342
/// Create a lambda for GenericParams.
346343
auto getCanonicalType = [&](Type t) -> CanType {

lib/SILOptimizer/Utils/Generics.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -901,12 +901,9 @@ getGenericEnvironmentAndSignatureWithRequirements(
901901
SmallVector<Requirement, 2> RequirementsCopy(Requirements.begin(),
902902
Requirements.end());
903903

904-
auto NewGenSig = evaluateOrDefault(
905-
M.getASTContext().evaluator,
906-
AbstractGenericSignatureRequest{
907-
OrigGenSig.getPointer(), { }, std::move(RequirementsCopy)},
908-
GenericSignature());
909-
904+
auto NewGenSig = buildGenericSignature(M.getASTContext(),
905+
OrigGenSig, { },
906+
std::move(RequirementsCopy));
910907
auto NewGenEnv = NewGenSig.getGenericEnvironment();
911908
return { NewGenEnv, NewGenSig };
912909
}
@@ -1572,10 +1569,8 @@ FunctionSignaturePartialSpecializer::
15721569
return { nullptr, nullptr };
15731570

15741571
// Finalize the archetype builder.
1575-
auto GenSig = evaluateOrDefault(
1576-
Ctx.evaluator,
1577-
AbstractGenericSignatureRequest{nullptr, AllGenericParams, AllRequirements},
1578-
GenericSignature());
1572+
auto GenSig = buildGenericSignature(Ctx, GenericSignature(),
1573+
AllGenericParams, AllRequirements);
15791574
auto *GenEnv = GenSig.getGenericEnvironment();
15801575
return { GenEnv, GenSig };
15811576
}

lib/Sema/CodeSynthesis.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -537,14 +537,9 @@ computeDesignatedInitOverrideSignature(ASTContext &ctx,
537537
subMap = SubstitutionMap::get(superclassCtorSig,
538538
substFn, lookupConformanceFn);
539539

540-
genericSig = evaluateOrDefault(
541-
ctx.evaluator,
542-
AbstractGenericSignatureRequest{
543-
classSig.getPointer(),
544-
std::move(newParamTypes),
545-
std::move(requirements)
546-
},
547-
GenericSignature());
540+
genericSig = buildGenericSignature(ctx, classSig,
541+
std::move(newParamTypes),
542+
std::move(requirements));
548543
}
549544
}
550545

0 commit comments

Comments
 (0)