mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[IDE] Use Identifier for printing member name in generateMemberwiseInit
Avoid relying on the source text and print the identifier, escaping if needed.
This commit is contained in:
@@ -16,15 +16,23 @@ using namespace swift::refactoring;
|
||||
|
||||
namespace {
|
||||
struct MemberwiseParameter {
|
||||
CharSourceRange NameRange;
|
||||
Identifier Name;
|
||||
Type MemberType;
|
||||
Expr *DefaultExpr;
|
||||
|
||||
MemberwiseParameter(CharSourceRange nameRange, Type type, Expr *initialExpr)
|
||||
: NameRange(nameRange), MemberType(type), DefaultExpr(initialExpr) {}
|
||||
MemberwiseParameter(Identifier name, Type type, Expr *initialExpr)
|
||||
: Name(name), MemberType(type), DefaultExpr(initialExpr) {}
|
||||
};
|
||||
} // namespace
|
||||
|
||||
static void printMemberName(Identifier name, llvm::raw_ostream &OS) {
|
||||
if (escapeIdentifierInContext(name, PrintNameContext::TypeMember)) {
|
||||
OS << '`' << name << '`';
|
||||
} else {
|
||||
OS << name;
|
||||
}
|
||||
}
|
||||
|
||||
static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
|
||||
SourceManager &SM,
|
||||
ArrayRef<MemberwiseParameter> memberVector,
|
||||
@@ -34,7 +42,8 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
|
||||
auto insertMember = [&SM](const MemberwiseParameter &memberData,
|
||||
raw_ostream &OS, bool wantsSeparator) {
|
||||
{
|
||||
OS << SM.extractText(memberData.NameRange) << ": ";
|
||||
printMemberName(memberData.Name, OS);
|
||||
OS << ": ";
|
||||
// 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())) {
|
||||
@@ -73,8 +82,11 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
|
||||
OS << ") {\n";
|
||||
for (auto &member : memberVector) {
|
||||
// self.<property> = <property>
|
||||
auto name = SM.extractText(member.NameRange);
|
||||
OS << "self." << name << " = " << name << "\n";
|
||||
OS << "self.";
|
||||
printMemberName(member.Name, OS);
|
||||
OS << " = ";
|
||||
printMemberName(member.Name, OS);
|
||||
OS << "\n";
|
||||
}
|
||||
OS << "}\n";
|
||||
|
||||
@@ -104,8 +116,6 @@ collectMembersForInit(ResolvedCursorInfoPtr CursorInfo,
|
||||
if (!targetLocation.isValid())
|
||||
return SourceLoc();
|
||||
|
||||
SourceManager &SM = nominalDecl->getASTContext().SourceMgr;
|
||||
|
||||
for (auto member : nominalDecl->getMemberwiseInitProperties()) {
|
||||
auto varDecl = dyn_cast<VarDecl>(member);
|
||||
if (!varDecl) {
|
||||
@@ -130,9 +140,7 @@ collectMembersForInit(ResolvedCursorInfoPtr CursorInfo,
|
||||
defaultInit = patternBinding->getOriginalInit(i);
|
||||
}
|
||||
|
||||
auto NameRange =
|
||||
Lexer::getCharSourceRangeFromSourceRange(SM, varDecl->getNameLoc());
|
||||
memberVector.emplace_back(NameRange, varDecl->getTypeInContext(),
|
||||
memberVector.emplace_back(varDecl->getName(), varDecl->getTypeInContext(),
|
||||
defaultInit);
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ struct Place {
|
||||
let callback: Callback
|
||||
@MyWrapper var wrapped: String
|
||||
var `protocol`: String
|
||||
var `some raw identifier`: Int
|
||||
}
|
||||
|
||||
protocol Thing {
|
||||
|
||||
@@ -31,6 +31,7 @@ struct Place {
|
||||
let callback: Callback
|
||||
@MyWrapper var wrapped: String
|
||||
var `protocol`: String
|
||||
var `some raw identifier`: Int
|
||||
}
|
||||
|
||||
protocol Thing {
|
||||
|
||||
@@ -20,7 +20,7 @@ class Person {
|
||||
}
|
||||
|
||||
struct Place {
|
||||
internal init(person: Person, street: String, apartment: Optional<String> = nil, city: String, state: String, postalCode: Int, plusFour: Int? = nil, callback: @escaping Place.Callback, wrapped: String, `protocol`: String) {
|
||||
internal init(person: Person, street: String, apartment: Optional<String> = nil, city: String, state: String, postalCode: Int, plusFour: Int? = nil, callback: @escaping Place.Callback, wrapped: String, `protocol`: String, `some raw identifier`: Int) {
|
||||
self.person = person
|
||||
self.street = street
|
||||
self.apartment = apartment
|
||||
@@ -31,6 +31,7 @@ self.plusFour = plusFour
|
||||
self.callback = callback
|
||||
self.wrapped = wrapped
|
||||
self.`protocol` = `protocol`
|
||||
self.`some raw identifier` = `some raw identifier`
|
||||
}
|
||||
|
||||
typealias Callback = () -> ()
|
||||
@@ -44,6 +45,7 @@ self.`protocol` = `protocol`
|
||||
let callback: Callback
|
||||
@MyWrapper var wrapped: String
|
||||
var `protocol`: String
|
||||
var `some raw identifier`: Int
|
||||
}
|
||||
|
||||
protocol Thing {
|
||||
|
||||
@@ -31,6 +31,7 @@ struct Place {
|
||||
let callback: Callback
|
||||
@MyWrapper var wrapped: String
|
||||
var `protocol`: String
|
||||
var `some raw identifier`: Int
|
||||
}
|
||||
|
||||
protocol Thing {
|
||||
@@ -58,9 +59,9 @@ struct MyWrapper {
|
||||
// RUN: %refactor -memberwise-init -source-filename %s -pos=22:8 > %t.result/struct_members.swift
|
||||
// RUN: diff -u %S/Outputs/generate_memberwise/struct_members.swift.expected %t.result/struct_members.swift
|
||||
|
||||
// RUN: %refactor -memberwise-init -source-filename %s -pos=44:8 > %t.result/only_computed_members.swift
|
||||
// RUN: %refactor -memberwise-init -source-filename %s -pos=45:8 > %t.result/only_computed_members.swift
|
||||
// RUN: diff -u %S/Outputs/generate_memberwise/only_computed_members.swift.expected %t.result/only_computed_members.swift
|
||||
|
||||
// RUN: not %refactor -memberwise-init -source-filename %s -pos=36:10 > %t.result/protocol_members.swift
|
||||
// RUN: not %refactor -memberwise-init -source-filename %s -pos=40:6 > %t.result/enum_members.swift
|
||||
// RUN: not %refactor -memberwise-init -source-filename %s -pos=37:10 > %t.result/protocol_members.swift
|
||||
// RUN: not %refactor -memberwise-init -source-filename %s -pos=41:6 > %t.result/enum_members.swift
|
||||
|
||||
|
||||
Reference in New Issue
Block a user