Skip to content

Commit 648c575

Browse files
committed
[SILGen] Teach SILGen to emit property wrapper generator functions that
take in a projected value.
1 parent 13692fe commit 648c575

21 files changed

+176
-10
lines changed

docs/ABI/Mangling.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ Entities
325325
entity-spec ::= 'fA' INDEX // default argument N+1 generator
326326
entity-spec ::= 'fi' // non-local variable initializer
327327
entity-spec ::= 'fP' // property wrapper backing initializer
328+
entity-spec ::= 'fW' // property wrapper init from projected value
328329
entity-spec ::= 'fD' // deallocating destructor; untyped
329330
entity-spec ::= 'fd' // non-deallocating destructor; untyped
330331
entity-spec ::= 'fE' // ivar destroyer; untyped

include/swift/AST/ASTMangler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ class ASTMangler : public Mangler {
135135
std::string mangleInitializerEntity(const VarDecl *var, SymbolKind SKind);
136136
std::string mangleBackingInitializerEntity(const VarDecl *var,
137137
SymbolKind SKind = SymbolKind::Default);
138+
std::string mangleInitFromProjectedValueEntity(const VarDecl *var,
139+
SymbolKind SKind = SymbolKind::Default);
138140

139141
std::string mangleNominalType(const NominalTypeDecl *decl);
140142

@@ -405,6 +407,7 @@ class ASTMangler : public Mangler {
405407

406408
void appendInitializerEntity(const VarDecl *var);
407409
void appendBackingInitializerEntity(const VarDecl *var);
410+
void appendInitFromProjectedValueEntity(const VarDecl *var);
408411

409412
CanType getDeclTypeForMangling(const ValueDecl *decl,
410413
GenericSignature &genericSig,

include/swift/AST/PropertyWrappers.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,22 @@ struct PropertyWrapperBackingPropertyInfo {
231231
return wrappedValueInit.placeholder;
232232
}
233233

234+
bool hasInitFromProjectedValue() const {
235+
return projectedValueInit.expr != nullptr;
236+
}
237+
238+
Expr *getInitFromProjectedValue() {
239+
return projectedValueInit.expr;
240+
}
241+
242+
PropertyWrapperValuePlaceholderExpr *getProjectedValuePlaceholder() {
243+
return projectedValueInit.placeholder;
244+
}
245+
246+
bool hasSynthesizedInitializers() const {
247+
return hasInitFromWrappedValue() || hasInitFromProjectedValue();
248+
}
249+
234250
explicit operator bool() const { return isValid(); }
235251

236252
friend bool operator==(const PropertyWrapperBackingPropertyInfo &lhs,

include/swift/Demangling/DemangleNodes.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ NODE(PrefixOperator)
175175
NODE(PrivateDeclName)
176176
NODE(PropertyDescriptor)
177177
CONTEXT_NODE(PropertyWrapperBackingInitializer)
178+
CONTEXT_NODE(PropertyWrapperInitFromProjectedValue)
178179
CONTEXT_NODE(Protocol)
179180
CONTEXT_NODE(ProtocolSymbolicReference)
180181
NODE(ProtocolConformance)

include/swift/SIL/SILDeclRef.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ struct SILDeclRef {
140140
/// References the wrapped value injection function used to initialize
141141
/// the backing storage property from a wrapped value.
142142
PropertyWrapperBackingInitializer,
143+
144+
/// References the function used to initialize a property wrapper storage
145+
/// instance from a projected value.
146+
PropertyWrapperInitFromProjectedValue,
143147
};
144148

145149
/// The ValueDecl or AbstractClosureExpr represented by this SILDeclRef.
@@ -264,7 +268,8 @@ struct SILDeclRef {
264268
/// True if the SILDeclRef references the initializer for the backing storage
265269
/// of a property wrapper.
266270
bool isPropertyWrapperBackingInitializer() const {
267-
return kind == Kind::PropertyWrapperBackingInitializer;
271+
return (kind == Kind::PropertyWrapperBackingInitializer ||
272+
kind == Kind::PropertyWrapperInitFromProjectedValue);
268273
}
269274

270275
/// True if the SILDeclRef references the ivar initializer or deinitializer of

lib/AST/ASTMangler.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,14 @@ std::string ASTMangler::mangleBackingInitializerEntity(const VarDecl *var,
166166
return finalize();
167167
}
168168

169+
std::string ASTMangler::mangleInitFromProjectedValueEntity(const VarDecl *var,
170+
SymbolKind SKind) {
171+
beginMangling();
172+
appendInitFromProjectedValueEntity(var);
173+
appendSymbolKind(SKind);
174+
return finalize();
175+
}
176+
169177
std::string ASTMangler::mangleNominalType(const NominalTypeDecl *decl) {
170178
beginMangling();
171179
appendAnyGenericType(decl);
@@ -2806,6 +2814,11 @@ void ASTMangler::appendBackingInitializerEntity(const VarDecl *var) {
28062814
appendOperator("fP");
28072815
}
28082816

2817+
void ASTMangler::appendInitFromProjectedValueEntity(const VarDecl *var) {
2818+
appendEntity(var, "vp", var->isStatic());
2819+
appendOperator("fW");
2820+
}
2821+
28092822
/// Is this declaration a method for mangling purposes? If so, we'll leave the
28102823
/// Self type out of its mangling.
28112824
static bool isMethodDecl(const Decl *decl) {

lib/Demangling/Demangler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1614,6 +1614,7 @@ bool Demangle::nodeConsumesGenericArgs(Node *node) {
16141614
case Node::Kind::DefaultArgumentInitializer:
16151615
case Node::Kind::Initializer:
16161616
case Node::Kind::PropertyWrapperBackingInitializer:
1617+
case Node::Kind::PropertyWrapperInitFromProjectedValue:
16171618
return false;
16181619
default:
16191620
return true;
@@ -3275,6 +3276,10 @@ NodePointer Demangler::demangleFunctionEntity() {
32753276
Args = None;
32763277
Kind = Node::Kind::PropertyWrapperBackingInitializer;
32773278
break;
3279+
case 'W':
3280+
Args = None;
3281+
Kind = Node::Kind::PropertyWrapperInitFromProjectedValue;
3282+
break;
32783283
default: return nullptr;
32793284
}
32803285

lib/Demangling/NodePrinter.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ class NodePrinter {
419419
case Node::Kind::InfixOperator:
420420
case Node::Kind::Initializer:
421421
case Node::Kind::PropertyWrapperBackingInitializer:
422+
case Node::Kind::PropertyWrapperInitFromProjectedValue:
422423
case Node::Kind::KeyPathGetterThunkHelper:
423424
case Node::Kind::KeyPathSetterThunkHelper:
424425
case Node::Kind::KeyPathEqualsThunkHelper:
@@ -1266,6 +1267,10 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
12661267
return printEntity(
12671268
Node, asPrefixContext, TypePrinting::NoType,
12681269
/*hasName*/false, "property wrapper backing initializer");
1270+
case Node::Kind::PropertyWrapperInitFromProjectedValue:
1271+
return printEntity(
1272+
Node, asPrefixContext, TypePrinting::NoType,
1273+
/*hasName*/false, "property wrapper init from projected value");
12691274
case Node::Kind::DefaultArgumentInitializer:
12701275
return printEntity(Node, asPrefixContext, TypePrinting::NoType,
12711276
/*hasName*/false, "default argument ",
@@ -2897,7 +2902,8 @@ printEntity(NodePointer Entity, bool asPrefixContext, TypePrinting TypePr,
28972902
// Print any left over context which couldn't be printed in prefix form.
28982903
if (Entity->getKind() == Node::Kind::DefaultArgumentInitializer ||
28992904
Entity->getKind() == Node::Kind::Initializer ||
2900-
Entity->getKind() == Node::Kind::PropertyWrapperBackingInitializer) {
2905+
Entity->getKind() == Node::Kind::PropertyWrapperBackingInitializer ||
2906+
Entity->getKind() == Node::Kind::PropertyWrapperInitFromProjectedValue) {
29012907
Printer << " of ";
29022908
} else {
29032909
Printer << " in ";

lib/Demangling/OldRemangler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,11 @@ void Remangler::manglePropertyWrapperBackingInitializer(Node *node,
843843
mangleSimpleEntity(node, 'I', "P", ctx);
844844
}
845845

846+
void Remangler::manglePropertyWrapperInitFromProjectedValue(Node *node,
847+
EntityContext &ctx) {
848+
mangleSimpleEntity(node, 'I', "W", ctx);
849+
}
850+
846851
void Remangler::mangleDefaultArgumentInitializer(Node *node,
847852
EntityContext &ctx) {
848853
mangleNamedEntity(node, 'I', "A", ctx);

lib/Demangling/Remangler.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,7 @@ void Remangler::mangleGenericArgs(Node *node, char &Separator,
528528
case Node::Kind::DefaultArgumentInitializer:
529529
case Node::Kind::Initializer:
530530
case Node::Kind::PropertyWrapperBackingInitializer:
531+
case Node::Kind::PropertyWrapperInitFromProjectedValue:
531532
if (!fullSubstitutionMap)
532533
break;
533534

@@ -1708,6 +1709,11 @@ void Remangler::manglePropertyWrapperBackingInitializer(Node *node) {
17081709
Buffer << "fP";
17091710
}
17101711

1712+
void Remangler::manglePropertyWrapperInitFromProjectedValue(Node *node) {
1713+
mangleChildNodes(node);
1714+
Buffer << "fW";
1715+
}
1716+
17111717
void Remangler::mangleLazyProtocolWitnessTableAccessor(Node *node) {
17121718
mangleChildNodes(node);
17131719
Buffer << "Wl";
@@ -2800,6 +2806,7 @@ bool Demangle::isSpecialized(Node *node) {
28002806
case Node::Kind::ImplicitClosure:
28012807
case Node::Kind::Initializer:
28022808
case Node::Kind::PropertyWrapperBackingInitializer:
2809+
case Node::Kind::PropertyWrapperInitFromProjectedValue:
28032810
case Node::Kind::DefaultArgumentInitializer:
28042811
case Node::Kind::Getter:
28052812
case Node::Kind::Setter:
@@ -2840,6 +2847,7 @@ NodePointer Demangle::getUnspecialized(Node *node, NodeFactory &Factory) {
28402847
case Node::Kind::ImplicitClosure:
28412848
case Node::Kind::Initializer:
28422849
case Node::Kind::PropertyWrapperBackingInitializer:
2850+
case Node::Kind::PropertyWrapperInitFromProjectedValue:
28432851
case Node::Kind::DefaultArgumentInitializer:
28442852
NumToCopy = node->getNumChildren();
28452853
LLVM_FALLTHROUGH;

0 commit comments

Comments
 (0)