@@ -133,6 +133,45 @@ PackType *TypeBase::getPackSubstitutionAsPackType() {
133
133
}
134
134
}
135
135
136
+ static Type increasePackElementLevelImpl (
137
+ Type type, unsigned level, unsigned outerLevel) {
138
+ assert (level > 0 );
139
+
140
+ return type.transformRec ([&](TypeBase *t) -> Optional<Type> {
141
+ if (auto *elementType = dyn_cast<PackElementType>(t)) {
142
+ if (elementType->getLevel () >= outerLevel) {
143
+ elementType = PackElementType::get (elementType->getPackType (),
144
+ elementType->getLevel () + level);
145
+ }
146
+
147
+ return Type (elementType);
148
+ }
149
+
150
+ if (auto *expansionType = dyn_cast<PackExpansionType>(t)) {
151
+ return Type (PackExpansionType::get (
152
+ increasePackElementLevelImpl (expansionType->getPatternType (),
153
+ level, outerLevel + 1 ),
154
+ expansionType->getCountType ()));
155
+ }
156
+
157
+ if (t->isParameterPack () || isa<PackArchetypeType>(t)) {
158
+ if (outerLevel == 0 )
159
+ return Type (PackElementType::get (t, level));
160
+
161
+ return Type (t);
162
+ }
163
+
164
+ return None;
165
+ });
166
+ }
167
+
168
+ Type TypeBase::increasePackElementLevel (unsigned level) {
169
+ if (level == 0 )
170
+ return Type (this );
171
+
172
+ return increasePackElementLevelImpl (Type (this ), level, 0 );
173
+ }
174
+
136
175
CanType PackExpansionType::getReducedShape () {
137
176
auto reducedShape = countType->getReducedShape ();
138
177
if (reducedShape == getASTContext ().TheEmptyTupleType )
0 commit comments