[Serialization] Use a helper to get dependencies from requirements

Refactoring suggested by Slava on ac6fd7214. In cases where multiple
requirements mention the same nominal type, this will also result in
doing slightly less work because we'll only record it once. Other than
that, no user-visible change expected.
This commit is contained in:
Jordan Rose
2017-11-17 10:47:16 -08:00
parent 588ac6b3e8
commit 3d6e9cc629

View File

@@ -2570,6 +2570,15 @@ static void collectDependenciesFromType(llvm::SmallSetVector<Type, 4> &seen,
});
}
static void
collectDependenciesFromRequirement(llvm::SmallSetVector<Type, 4> &seen,
const Requirement &req,
const ModuleDecl *excluding) {
collectDependenciesFromType(seen, req.getFirstType(), excluding);
if (req.getKind() != RequirementKind::Layout)
collectDependenciesFromType(seen, req.getSecondType(), excluding);
}
static SmallVector<Type, 4> collectDependenciesFromType(Type ty) {
llvm::SmallSetVector<Type, 4> result;
collectDependenciesFromType(result, ty, /*excluding*/nullptr);
@@ -2831,18 +2840,18 @@ void Serializer::writeDecl(const Decl *D) {
auto underlying = typeAlias->getUnderlyingTypeLoc().getType();
SmallVector<TypeID, 2> dependencies;
for (Type dep : collectDependenciesFromType(underlying->getCanonicalType()))
dependencies.push_back(addTypeRef(dep));
llvm::SmallSetVector<Type, 4> dependencies;
collectDependenciesFromType(dependencies, underlying->getCanonicalType(),
/*excluding*/nullptr);
for (Requirement req : typeAlias->getGenericRequirements()) {
for (Type dep : collectDependenciesFromType(req.getFirstType()))
dependencies.push_back(addTypeRef(dep));
if (req.getKind() != RequirementKind::Layout)
for (Type dep : collectDependenciesFromType(req.getSecondType()))
dependencies.push_back(addTypeRef(dep));
collectDependenciesFromRequirement(dependencies, req,
/*excluding*/nullptr);
}
SmallVector<TypeID, 4> dependencyIDs;
for (Type dep : dependencies)
dependencyIDs.push_back(addTypeRef(dep));
uint8_t rawAccessLevel =
getRawStableAccessLevel(typeAlias->getFormalAccess());
@@ -2856,7 +2865,7 @@ void Serializer::writeDecl(const Decl *D) {
addGenericEnvironmentRef(
typeAlias->getGenericEnvironment()),
rawAccessLevel,
dependencies);
dependencyIDs);
writeGenericParams(typeAlias->getGenericParams());
break;
}