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

0 commit comments

Comments
 (0)