Print @escaping For Closures In Generated Memberwise Initializer

Augment the "generate memberwise initializer" refactoring action to
automatically print @escaping in parameter position. Closures as stored
properties always escape.

rdar://62202381
This commit is contained in:
Robert Widmann
2020-06-09 17:13:09 -07:00
parent 6a1534d5b0
commit 0d1f6ae8bb
4 changed files with 29 additions and 5 deletions

View File

@@ -3126,7 +3126,7 @@ struct MemberwiseParameter {
Expr *DefaultExpr;
MemberwiseParameter(Identifier name, Type type, Expr *initialExpr)
: Name(name), MemberType(type), DefaultExpr(initialExpr) {}
: Name(name), MemberType(type), DefaultExpr(initialExpr) {}
};
static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
@@ -3139,7 +3139,16 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
EditConsumer.accept(SM, targetLocation, "\ninternal init(");
auto insertMember = [&SM](const MemberwiseParameter &memberData,
llvm::raw_ostream &OS, bool wantsSeparator) {
OS << memberData.Name << ": " << memberData.MemberType.getString();
{
OS << memberData.Name << ": ";
// Unconditionally print '@escaping' if we print out a function type -
// the assignments we generate below will escape this parameter.
if (isa<AnyFunctionType>(memberData.MemberType->getCanonicalType())) {
OS << "@" << TypeAttributes::getAttrName(TAK_escaping) << " ";
}
OS << memberData.MemberType.getString();
}
if (auto *expr = memberData.DefaultExpr) {
if (isa<NilLiteralExpr>(expr)) {
OS << " = nil";