Skip to content

Commit 684ef9c

Browse files
hborlaxedin
authored andcommitted
[AST] Add a new accessor kind for init accessors.
1 parent 3dc470f commit 684ef9c

27 files changed

+92
-4
lines changed

include/swift/AST/AccessorKinds.def

+14-1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@
100100
ANY_ADDRESSOR(ID, KEYWORD)
101101
#endif
102102

103+
/// INIT_ACCESSOR(ID, KEYWORD)
104+
/// The given accessor is an init accessor.
105+
///
106+
/// Defaults to SINGLETON_ACCESSOR(ID, KEYWORD).
107+
#ifndef INIT_ACCESSOR
108+
#define INIT_ACCESSOR(ID, KEYWORD) SINGLETON_ACCESSOR(ID, KEYWORD)
109+
#endif
110+
103111
// Suppress entries for accessors which can't be written in source code.
104112
#ifndef SUPPRESS_ARTIFICIAL_ACCESSORS
105113
#define SUPPRESS_ARTIFICIAL_ACCESSORS 0
@@ -174,11 +182,16 @@ IMMUTABLE_ADDRESSOR(Address, unsafeAddress)
174182
/// of the type).
175183
MUTABLE_ADDRESSOR(MutableAddress, unsafeMutableAddress)
176184

185+
/// This is an init accessor: a function that is called when DI
186+
/// re-writes assignment to initialization.
187+
INIT_ACCESSOR(Init, init)
188+
177189
#ifdef LAST_ACCESSOR
178-
LAST_ACCESSOR(MutableAddress)
190+
LAST_ACCESSOR(Init)
179191
#undef LAST_ACCESSOR
180192
#endif
181193

194+
#undef INIT_ACCESSOR
182195
#undef IMMUTABLE_ADDRESSOR
183196
#undef MUTABLE_ADDRESSOR
184197
#undef ANY_ADDRESSOR

include/swift/AST/Decl.h

+5
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ enum class DescriptiveDeclKind : uint8_t {
184184
DistributedMethod,
185185
Getter,
186186
Setter,
187+
InitAccessor,
187188
Addressor,
188189
MutableAddressor,
189190
ReadAccessor,
@@ -7563,6 +7564,10 @@ class AccessorDecl final : public FuncDecl {
75637564
llvm_unreachable("bad accessor kind");
75647565
}
75657566

7567+
bool isInitAccessor() const {
7568+
return (getAccessorKind() == AccessorKind::Init);
7569+
}
7570+
75667571
/// \returns true if this is non-mutating due to applying a 'mutating'
75677572
/// attribute. For example a "mutating set" accessor.
75687573
bool isExplicitNonMutating() const;

include/swift/AST/DiagnosticsSema.def

+2
Original file line numberDiff line numberDiff line change
@@ -5853,6 +5853,8 @@ ERROR(no_opaque_return_type_of,none,
58535853

58545854
ERROR(objc_observing_accessor, none,
58555855
"observing accessors are not allowed to be marked @objc", ())
5856+
ERROR(objc_init_accessor, none,
5857+
"init accessors cannot be marked @objc", ())
58565858
ERROR(objc_addressor, none,
58575859
"addressors are not allowed to be marked @objc", ())
58585860
ERROR(objc_coroutine_accessor, none,

lib/AST/ASTMangler.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ static StringRef getCodeForAccessorKind(AccessorKind kind) {
8181
return "lu";
8282
case AccessorKind::MutableAddress:
8383
return "au";
84+
case AccessorKind::Init:
85+
return "i";
8486
}
8587
llvm_unreachable("bad accessor kind");
8688
}

lib/AST/ASTPrinter.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -4332,6 +4332,7 @@ void PrintAST::visitAccessorDecl(AccessorDecl *decl) {
43324332
break;
43334333
case AccessorKind::Set:
43344334
case AccessorKind::WillSet:
4335+
case AccessorKind::Init:
43354336
recordDeclLoc(decl,
43364337
[&]{
43374338
Printer << getAccessorLabel(decl->getAccessorKind());
@@ -4346,6 +4347,7 @@ void PrintAST::visitAccessorDecl(AccessorDecl *decl) {
43464347
}
43474348
}
43484349
});
4350+
break;
43494351
}
43504352

43514353
// handle effects specifiers before the body

lib/AST/AccessRequests.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ AccessLevelRequest::evaluate(Evaluator &evaluator, ValueDecl *D) const {
6161
case AccessorKind::DidSet:
6262
// These are only needed to synthesize the setter.
6363
return AccessLevel::Private;
64+
case AccessorKind::Init:
65+
// These are only called from designated initializers.
66+
return AccessLevel::Private;
6467
}
6568
}
6669

lib/AST/Decl.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,9 @@ DescriptiveDeclKind Decl::getDescriptiveKind() const {
254254

255255
case AccessorKind::Modify:
256256
return DescriptiveDeclKind::ModifyAccessor;
257+
258+
case AccessorKind::Init:
259+
return DescriptiveDeclKind::InitAccessor;
257260
}
258261
llvm_unreachable("bad accessor kind");
259262
}
@@ -354,6 +357,7 @@ StringRef Decl::getDescriptiveKindName(DescriptiveDeclKind K) {
354357
ENTRY(MutableAddressor, "mutableAddress accessor");
355358
ENTRY(ReadAccessor, "_read accessor");
356359
ENTRY(ModifyAccessor, "_modify accessor");
360+
ENTRY(InitAccessor, "init acecssor");
357361
ENTRY(EnumElement, "enum case");
358362
ENTRY(Module, "module");
359363
ENTRY(Missing, "missing decl");
@@ -8324,7 +8328,8 @@ DeclName AbstractFunctionDecl::getEffectiveFullName() const {
83248328

83258329
case AccessorKind::Set:
83268330
case AccessorKind::DidSet:
8327-
case AccessorKind::WillSet: {
8331+
case AccessorKind::WillSet:
8332+
case AccessorKind::Init: {
83288333
SmallVector<Identifier, 4> argNames;
83298334
// The implicit value/buffer parameter.
83308335
argNames.push_back(Identifier());
@@ -9305,6 +9310,7 @@ bool AccessorDecl::isAssumedNonMutating() const {
93059310
case AccessorKind::DidSet:
93069311
case AccessorKind::MutableAddress:
93079312
case AccessorKind::Modify:
9313+
case AccessorKind::Init:
93089314
return false;
93099315
}
93109316
llvm_unreachable("bad accessor kind");

lib/AST/PrettyStackTrace.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ void swift::printDeclDescription(llvm::raw_ostream &out, const Decl *D,
9191
case AccessorKind::Modify:
9292
out << "modify";
9393
break;
94+
case AccessorKind::Init:
95+
out << "init";
96+
break;
9497
}
9598

9699
out << " for " << ASD->getName();

lib/IRGen/IRGenDebugInfo.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,9 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
545545
case AccessorKind::Modify:
546546
Kind = ".modify";
547547
break;
548+
case AccessorKind::Init:
549+
Kind = ".init";
550+
break;
548551
}
549552

550553
SmallVector<char, 64> Buf;

lib/Index/Index.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ printArtificialName(const swift::AbstractStorageDecl *ASD, AccessorKind AK, llvm
5656
case AccessorKind::WillSet:
5757
OS << "willSet:" << ASD->getName() ;
5858
return false;
59+
case AccessorKind::Init:
60+
OS << "init:" << ASD->getName();
61+
return false;
5962

6063
case AccessorKind::Address:
6164
case AccessorKind::MutableAddress:

lib/Index/IndexSymbol.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ SymbolSubKind index::getSubKindForAccessor(AccessorKind AK) {
275275
return SymbolSubKind::SwiftAccessorMutableAddressor;
276276
case AccessorKind::Read: return SymbolSubKind::SwiftAccessorRead;
277277
case AccessorKind::Modify: return SymbolSubKind::SwiftAccessorModify;
278+
case AccessorKind::Init: return SymbolSubKind::SwiftAccessorInit;
278279
}
279280

280281
llvm_unreachable("Unhandled AccessorKind in switch.");

lib/Parse/ParseDecl.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -6981,6 +6981,8 @@ static StringRef getAccessorNameForDiagnostic(AccessorKind accessorKind,
69816981
return "'willSet'";
69826982
case AccessorKind::DidSet:
69836983
return "'didSet'";
6984+
case AccessorKind::Init:
6985+
return article ? "an init accessor" : "init accessor";
69846986
}
69856987
llvm_unreachable("bad accessor kind");
69866988
}
@@ -7005,7 +7007,7 @@ static void diagnoseRedundantAccessors(Parser &P, SourceLoc loc,
70057007
/*already*/ true);
70067008
}
70077009

7008-
static bool isAllowedInLimitedSyntax(AccessorKind kind) {
7010+
static bool isAllowedInProtocolRequirement(AccessorKind kind) {
70097011
switch (kind) {
70107012
case AccessorKind::Get:
70117013
case AccessorKind::Set:
@@ -7017,6 +7019,7 @@ static bool isAllowedInLimitedSyntax(AccessorKind kind) {
70177019
case AccessorKind::DidSet:
70187020
case AccessorKind::Read:
70197021
case AccessorKind::Modify:
7022+
case AccessorKind::Init:
70207023
return false;
70217024
}
70227025
llvm_unreachable("bad accessor kind");
@@ -7350,7 +7353,7 @@ ParserStatus Parser::parseGetSet(ParseDeclOptions Flags, ParameterList *Indices,
73507353

73517354
// For now, immediately reject illegal accessors in protocols just to
73527355
// avoid having to deal with them everywhere.
7353-
if (parsingLimitedSyntax && !isAllowedInLimitedSyntax(Kind)) {
7356+
if (parsingLimitedSyntax && !isAllowedInProtocolRequirement(Kind)) {
73547357
diagnose(Loc, diag::expected_getset_in_protocol);
73557358
continue;
73567359
}

lib/SIL/IR/SILPrinter.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,9 @@ void SILDeclRef::print(raw_ostream &OS) const {
341341
case AccessorKind::Modify:
342342
OS << "!modify";
343343
break;
344+
case AccessorKind::Init:
345+
OS << "!init";
346+
break;
344347
}
345348
break;
346349
}

lib/SILGen/SILGenLValue.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -2943,7 +2943,11 @@ namespace {
29432943
case AccessorKind::WillSet:
29442944
case AccessorKind::DidSet:
29452945
llvm_unreachable("cannot use accessor directly to perform an access");
2946+
2947+
case AccessorKind::Init:
2948+
llvm_unreachable("init accessor not yet implemented");
29462949
}
2950+
29472951
llvm_unreachable("bad kind");
29482952
}
29492953
};

lib/SILOptimizer/Mandatory/DefiniteInitialization.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1593,6 +1593,7 @@ void LifetimeChecker::handleInOutUse(const DIMemoryUse &Use) {
15931593
case AccessorKind::MutableAddress:
15941594
case AccessorKind::DidSet:
15951595
case AccessorKind::WillSet:
1596+
case AccessorKind::Init:
15961597
return true;
15971598
}
15981599
llvm_unreachable("bad kind");

lib/Sema/CSDiagnostics.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -4476,6 +4476,7 @@ bool InvalidMemberRefOnExistential::diagnoseAsError() {
44764476
case AccessorKind::Set:
44774477
case AccessorKind::WillSet:
44784478
case AccessorKind::DidSet:
4479+
case AccessorKind::Init:
44794480
// Ignore references to the 'newValue' or 'oldValue' parameters.
44804481
if (AccessorParams.front() == PD) {
44814482
return true;

lib/Sema/MiscDiagnostics.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -4586,6 +4586,7 @@ class ObjCSelectorWalker : public ASTWalker {
45864586
case AccessorKind::MutableAddress:
45874587
case AccessorKind::Read:
45884588
case AccessorKind::Modify:
4589+
case AccessorKind::Init:
45894590
llvm_unreachable("cannot be @objc");
45904591
}
45914592
} else {

lib/Sema/TypeCheckAttr.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -4901,6 +4901,8 @@ static DescriptiveDeclKind getAccessorDescriptiveDeclKind(AccessorKind kind) {
49014901
return DescriptiveDeclKind::Addressor;
49024902
case AccessorKind::MutableAddress:
49034903
return DescriptiveDeclKind::MutableAddressor;
4904+
case AccessorKind::Init:
4905+
return DescriptiveDeclKind::InitAccessor;
49044906
}
49054907
}
49064908

lib/Sema/TypeCheckDecl.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ static bool doesAccessorNeedDynamicAttribute(AccessorDecl *accessor) {
373373
storage->getWriteImpl() == WriteImplKind::StoredWithObservers)
374374
return storage->isDynamic();
375375
return false;
376+
case AccessorKind::Init:
377+
return false;
376378
}
377379
llvm_unreachable("covered switch");
378380
}
@@ -1708,6 +1710,9 @@ SelfAccessKindRequest::evaluate(Evaluator &evaluator, FuncDecl *FD) const {
17081710

17091711
break;
17101712
}
1713+
1714+
case AccessorKind::Init:
1715+
return SelfAccessKind::Mutating;
17111716
}
17121717
}
17131718

@@ -2118,6 +2123,7 @@ ResultTypeRequest::evaluate(Evaluator &evaluator, ValueDecl *decl) const {
21182123
case AccessorKind::DidSet:
21192124
case AccessorKind::WillSet:
21202125
case AccessorKind::Set:
2126+
case AccessorKind::Init:
21212127
return TupleType::getEmpty(ctx);
21222128

21232129
// Addressor result types can get complicated because of the owner.

lib/Sema/TypeCheckDeclObjC.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,13 @@ bool swift::isRepresentableInObjC(
717717
.limitBehavior(behavior);
718718
Reason.describe(accessor);
719719
return false;
720+
721+
case AccessorKind::Init:
722+
diagnoseAndRemoveAttr(accessor, Reason.getAttr(),
723+
diag::objc_init_accessor)
724+
.limitBehavior(behavior);
725+
Reason.describe(accessor);
726+
return false;
720727
}
721728
llvm_unreachable("bad kind");
722729
}
@@ -1402,6 +1409,7 @@ Optional<ObjCReason> shouldMarkAsObjC(const ValueDecl *VD, bool allowImplicit) {
14021409
case AccessorKind::Modify:
14031410
case AccessorKind::Read:
14041411
case AccessorKind::WillSet:
1412+
case AccessorKind::Init:
14051413
return false;
14061414

14071415
case AccessorKind::MutableAddress:

lib/Sema/TypeCheckDeclOverride.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2277,6 +2277,7 @@ OverriddenDeclsRequest::evaluate(Evaluator &evaluator, ValueDecl *decl) const {
22772277
case AccessorKind::DidSet:
22782278
case AccessorKind::Address:
22792279
case AccessorKind::MutableAddress:
2280+
case AccessorKind::Init:
22802281
// These accessors are never part of the opaque set. Bail out early
22812282
// to avoid computing the overridden declarations of the storage.
22822283
return noResults;

lib/Sema/TypeCheckProtocol.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -6799,6 +6799,7 @@ swift::findWitnessedObjCRequirements(const ValueDecl *witness,
67996799
case AccessorKind::MutableAddress:
68006800
case AccessorKind::Read:
68016801
case AccessorKind::Modify:
6802+
case AccessorKind::Init:
68026803
// These accessors are never exposed to Objective-C.
68036804
return result;
68046805
case AccessorKind::DidSet:

lib/Sema/TypeCheckStorage.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -2058,6 +2058,9 @@ synthesizeAccessorBody(AbstractFunctionDecl *fn, void *) {
20582058
case AccessorKind::Address:
20592059
case AccessorKind::MutableAddress:
20602060
break;
2061+
2062+
case AccessorKind::Init:
2063+
llvm_unreachable("init accessor not yet implemented");
20612064
}
20622065
llvm_unreachable("bad synthesized function kind");
20632066
}
@@ -2568,6 +2571,7 @@ IsAccessorTransparentRequest::evaluate(Evaluator &evaluator,
25682571

25692572
case AccessorKind::Read:
25702573
case AccessorKind::Modify:
2574+
case AccessorKind::Init:
25712575
break;
25722576

25732577
case AccessorKind::WillSet:

lib/Serialization/ModuleFormat.h

+1
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ enum AccessorKind : uint8_t {
330330
MutableAddress,
331331
Read,
332332
Modify,
333+
Init,
333334
};
334335
using AccessorKindField = BCFixed<4>;
335336

tools/SourceKit/lib/SwiftLang/SwiftLangSupport.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,8 @@ UIdent SwiftLangSupport::getUIDForAccessor(const ValueDecl *D,
369369
return IsRef ? KindRefAccessorRead : KindDeclAccessorRead;
370370
case AccessorKind::Modify:
371371
return IsRef ? KindRefAccessorModify : KindDeclAccessorModify;
372+
case AccessorKind::Init:
373+
return IsRef ? KindRefAccessorInit : KindDeclAccessorInit;
372374
}
373375

374376
llvm_unreachable("Unhandled AccessorKind in switch.");

tools/swift-ide-test/swift-ide-test.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -3426,6 +3426,9 @@ class ASTCommentPrinter : public ASTWalker {
34263426
case AccessorKind::Modify:
34273427
OS << "<modify accessor for ";
34283428
break;
3429+
case AccessorKind::Init:
3430+
OS << "init accessor for ";
3431+
break;
34293432
}
34303433
printDeclName(storage);
34313434
OS << ">";

utils/gyb_sourcekit_support/UIDs.py

+4
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,10 @@ def __init__(self, internal_name, external_name):
318318
'source.lang.swift.decl.function.accessor.modify'),
319319
KIND('RefAccessorModify',
320320
'source.lang.swift.ref.function.accessor.modify'),
321+
KIND('DeclAccessorInit',
322+
'source.lang.swift.decl.function.accessor.init'),
323+
KIND('RefAccessorInit',
324+
'source.lang.swift.ref.function.accessor.init'),
321325
KIND('DeclConstructor', 'source.lang.swift.decl.function.constructor'),
322326
KIND('RefConstructor', 'source.lang.swift.ref.function.constructor'),
323327
KIND('DeclDestructor', 'source.lang.swift.decl.function.destructor'),

0 commit comments

Comments
 (0)