|
26 | 26 | #include "swift/AST/TypeCheckRequests.h" |
27 | 27 | #include "swift/AST/CanTypeVisitor.h" |
28 | 28 | #include "swift/SIL/TypeLowering.h" |
| 29 | +#include "swift/SIL/AbstractionPatternGenerators.h" |
29 | 30 | #include "clang/AST/ASTContext.h" |
30 | 31 | #include "clang/AST/Attr.h" |
31 | 32 | #include "clang/AST/DeclCXX.h" |
@@ -1202,55 +1203,33 @@ unsigned AbstractionPattern::getNumFunctionParams() const { |
1202 | 1203 |
|
1203 | 1204 | void AbstractionPattern:: |
1204 | 1205 | forEachFunctionParam(AnyFunctionType::CanParamArrayRef substParams, |
1205 | | - bool ignoreFinalParam, |
1206 | | - llvm::function_ref<void(unsigned origParamIndex, |
1207 | | - unsigned substParamIndex, |
1208 | | - ParameterTypeFlags origFlags, |
1209 | | - AbstractionPattern origParamType, |
1210 | | - AnyFunctionType::CanParam substParam)> |
1211 | | - handleScalar, |
1212 | | - llvm::function_ref<void(unsigned origParamIndex, |
1213 | | - unsigned substParamIndex, |
1214 | | - ParameterTypeFlags origFlags, |
1215 | | - AbstractionPattern origExpansionType, |
1216 | | - AnyFunctionType::CanParamArrayRef substParams)> |
1217 | | - handleExpansion) const { |
1218 | | - // Honor ignoreFinalParam for the substituted parameters on all paths. |
1219 | | - if (ignoreFinalParam) substParams = substParams.drop_back(); |
1220 | | - |
1221 | | - // If we don't have a function type, use the substituted type. |
1222 | | - if (isTypeParameterOrOpaqueArchetype() || |
1223 | | - getKind() == Kind::OpaqueFunction || |
1224 | | - getKind() == Kind::OpaqueDerivativeFunction) { |
1225 | | - for (auto substParamIndex : indices(substParams)) { |
1226 | | - handleScalar(substParamIndex, substParamIndex, |
1227 | | - substParams[substParamIndex].getParameterFlags(), |
1228 | | - AbstractionPattern::getOpaque(), |
1229 | | - substParams[substParamIndex]); |
1230 | | - } |
1231 | | - return; |
| 1206 | + bool ignoreFinalOrigParam, |
| 1207 | + llvm::function_ref<void(FunctionParamGenerator ¶m)> function) const { |
| 1208 | + FunctionParamGenerator generator(*this, substParams, ignoreFinalOrigParam); |
| 1209 | + for (; !generator.isFinished(); generator.advance()) { |
| 1210 | + function(generator); |
| 1211 | + } |
| 1212 | + generator.finish(); |
| 1213 | +} |
| 1214 | + |
| 1215 | +FunctionParamGenerator::FunctionParamGenerator( |
| 1216 | + AbstractionPattern origFunctionType, |
| 1217 | + AnyFunctionType::CanParamArrayRef substParams, |
| 1218 | + bool ignoreFinalOrigParam) |
| 1219 | + : origFunctionType(origFunctionType), allSubstParams(substParams) { |
| 1220 | + origFunctionTypeIsOpaque = |
| 1221 | + (origFunctionType.isTypeParameterOrOpaqueArchetype() || |
| 1222 | + origFunctionType.isOpaqueFunctionOrOpaqueDerivativeFunction()); |
| 1223 | + |
| 1224 | + if (origFunctionTypeIsOpaque) { |
| 1225 | + numOrigParams = allSubstParams.size(); |
| 1226 | + } else { |
| 1227 | + numOrigParams = origFunctionType.getNumFunctionParams(); |
| 1228 | + if (ignoreFinalOrigParam) |
| 1229 | + numOrigParams--; |
1232 | 1230 | } |
1233 | 1231 |
|
1234 | | - size_t numOrigParams = getNumFunctionParams(); |
1235 | | - if (ignoreFinalParam) numOrigParams--; |
1236 | | - |
1237 | | - size_t substParamIndex = 0; |
1238 | | - for (auto origParamIndex : range(numOrigParams)) { |
1239 | | - auto origParamType = getFunctionParamType(origParamIndex); |
1240 | | - if (origParamType.isPackExpansion()) { |
1241 | | - unsigned numComponents = origParamType.getNumPackExpandedComponents(); |
1242 | | - handleExpansion(origParamIndex, substParamIndex, |
1243 | | - getFunctionParamFlags(origParamIndex), origParamType, |
1244 | | - substParams.slice(substParamIndex, numComponents)); |
1245 | | - substParamIndex += numComponents; |
1246 | | - } else { |
1247 | | - handleScalar(origParamIndex, substParamIndex, |
1248 | | - getFunctionParamFlags(origParamIndex), origParamType, |
1249 | | - substParams[substParamIndex]); |
1250 | | - substParamIndex++; |
1251 | | - } |
1252 | | - } |
1253 | | - assert(substParamIndex == substParams.size()); |
| 1232 | + if (!isFinished()) loadParameter(); |
1254 | 1233 | } |
1255 | 1234 |
|
1256 | 1235 | static CanType getOptionalObjectType(CanType type) { |
@@ -2239,21 +2218,20 @@ class SubstFunctionTypePatternVisitor |
2239 | 2218 | }; |
2240 | 2219 |
|
2241 | 2220 | pattern.forEachFunctionParam(func.getParams(), /*ignore self*/ false, |
2242 | | - [&](unsigned origParamIndex, unsigned substParamIndex, |
2243 | | - ParameterTypeFlags origFlags, AbstractionPattern origParamType, |
2244 | | - AnyFunctionType::CanParam substParam) { |
2245 | | - auto newParamTy = visit(substParam.getParameterType(), origParamType); |
2246 | | - addParam(origFlags, newParamTy); |
2247 | | - }, [&](unsigned origParamIndex, unsigned substParamIndex, |
2248 | | - ParameterTypeFlags origFlags, |
2249 | | - AbstractionPattern origExpansionType, |
2250 | | - AnyFunctionType::CanParamArrayRef substParams) { |
2251 | | - CanType candidateSubstType; |
2252 | | - if (!substParams.empty()) |
2253 | | - candidateSubstType = substParams[0].getParameterType(); |
2254 | | - auto expansionType = |
2255 | | - handlePackExpansion(origExpansionType, candidateSubstType); |
2256 | | - addParam(origFlags, expansionType); |
| 2221 | + [&](FunctionParamGenerator ¶m) { |
| 2222 | + if (!param.isPackExpansion()) { |
| 2223 | + auto newParamTy = visit(param.getSubstParams()[0].getParameterType(), |
| 2224 | + param.getOrigType()); |
| 2225 | + addParam(param.getOrigFlags(), newParamTy); |
| 2226 | + } else { |
| 2227 | + auto substParams = param.getSubstParams(); |
| 2228 | + CanType candidateSubstType; |
| 2229 | + if (!substParams.empty()) |
| 2230 | + candidateSubstType = substParams[0].getParameterType(); |
| 2231 | + auto expansionType = |
| 2232 | + handlePackExpansion(param.getOrigType(), candidateSubstType); |
| 2233 | + addParam(param.getOrigFlags(), expansionType); |
| 2234 | + } |
2257 | 2235 | }); |
2258 | 2236 |
|
2259 | 2237 | if (yieldType) { |
|
0 commit comments