Skip to content

Commit 29bfdac

Browse files
committed
[ASTGen] Generate AccessorDecls
1 parent 526dcfb commit 29bfdac

File tree

8 files changed

+321
-3
lines changed

8 files changed

+321
-3
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,27 @@ BridgedDeclContext BridgedPatternBindingInitializer_asDeclContext(
397397
// MARK: Decls
398398
//===----------------------------------------------------------------------===//
399399

400+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedAccessorKind {
401+
#define ACCESSOR(ID) BridgedAccessorKind##ID,
402+
#include "swift/AST/AccessorKinds.def"
403+
};
404+
405+
struct BridgedAccessorRecord {
406+
BridgedSourceLoc lBraceLoc;
407+
BridgedArrayRef accessors;
408+
BridgedSourceLoc rBraceLoc;
409+
};
410+
411+
SWIFT_NAME("BridgedAccessorDecl.createParsed(_:declContext:kind:storage:"
412+
"declLoc:accessorKeywordLoc:parameterList:asyncSpecifierLoc:"
413+
"throwsSpecifierLoc:thrownType:)")
414+
BridgedAccessorDecl BridgedAccessorDecl_createParsed(
415+
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
416+
BridgedAccessorKind cKind, BridgedAbstractStorageDecl cStorage,
417+
BridgedSourceLoc cDeclLoc, BridgedSourceLoc cAccessorKeywordLoc,
418+
BridgedNullableParameterList cParamList, BridgedSourceLoc cAsyncLoc,
419+
BridgedSourceLoc cThrowsLoc, BridgedNullableTypeRepr cThrownType);
420+
400421
SWIFT_NAME(
401422
"BridgedPatternBindingDecl.createParsed(_:declContext:bindingKeywordLoc:"
402423
"entries:isStatic:isLet:)")
@@ -630,6 +651,22 @@ void BridgedTopLevelCodeDecl_dump(BridgedTopLevelCodeDecl decl);
630651
SWIFT_NAME("BridgedDecl.dump(self:)")
631652
void BridgedDecl_dump(BridgedDecl decl);
632653

654+
//===----------------------------------------------------------------------===//
655+
// MARK: AbstractStorageDecl
656+
//===----------------------------------------------------------------------===//
657+
658+
SWIFT_NAME("BridgedAbstractStorageDecl.setAccessors(self:_:)")
659+
void BridgedAbstractStorageDecl_setAccessors(
660+
BridgedAbstractStorageDecl cStorage, BridgedAccessorRecord accessors);
661+
662+
//===----------------------------------------------------------------------===//
663+
// MARK: AccessorDecl
664+
//===----------------------------------------------------------------------===//
665+
666+
SWIFT_NAME("BridgedAccessorDecl.setParsedBody(self:_:)")
667+
void BridgedAccessorDecl_setParsedBody(BridgedAccessorDecl decl,
668+
BridgedBraceStmt body);
669+
633670
//===----------------------------------------------------------------------===//
634671
// MARK: NominalTypeDecl
635672
//===----------------------------------------------------------------------===//
@@ -662,6 +699,11 @@ SWIFT_NAME("BridgedVarDecl.getUserFacingName(self:)")
662699
BRIDGED_INLINE
663700
BridgedStringRef BridgedVarDecl_getUserFacingName(BridgedVarDecl decl);
664701

702+
SWIFT_NAME("getter:BridgedVarDecl.asAbstractStorageDecl(self:)")
703+
BRIDGED_INLINE
704+
BridgedAbstractStorageDecl
705+
BridgedVarDecl_asAbstractStorageDecl(BridgedVarDecl decl);
706+
665707
//===----------------------------------------------------------------------===//
666708
// MARK: Exprs
667709
//===----------------------------------------------------------------------===//
@@ -1133,6 +1175,9 @@ void BridgedTypeRepr_dump(BridgedTypeRepr type);
11331175
// MARK: Patterns
11341176
//===----------------------------------------------------------------------===//
11351177

1178+
SWIFT_NAME("getter:BridgedPattern.singleVar(self:)")
1179+
BridgedNullableVarDecl BridgedPattern_getSingleVar(BridgedPattern cPattern);
1180+
11361181
SWIFT_NAME("BridgedAnyPattern.createParsed(_:loc:)")
11371182
BridgedAnyPattern BridgedAnyPattern_createParsed(BridgedASTContext cContext,
11381183
BridgedSourceLoc cLoc);

include/swift/AST/ASTBridgingImpl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ BridgedStringRef BridgedVarDecl_getUserFacingName(BridgedVarDecl decl) {
5353
return decl.unbridged()->getBaseName().userFacingName();
5454
}
5555

56+
BridgedAbstractStorageDecl
57+
BridgedVarDecl_asAbstractStorageDecl(BridgedVarDecl decl) {
58+
return decl.unbridged();
59+
}
60+
5661
SWIFT_END_NULLABILITY_ANNOTATIONS
5762

5863
#endif // SWIFT_AST_ASTBRIDGINGIMPL_H

lib/AST/ASTBridging.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ static TypeAttrKind unbridged(BridgedTypeAttrKind kind) {
4848
}
4949
}
5050

51+
static AccessorKind unbridged(BridgedAccessorKind kind) {
52+
return static_cast<AccessorKind>(kind);
53+
}
54+
5155
//===----------------------------------------------------------------------===//
5256
// MARK: Identifier
5357
//===----------------------------------------------------------------------===//
@@ -348,6 +352,19 @@ BridgedDeclContext BridgedPatternBindingInitializer_asDeclContext(
348352
// MARK: Decls
349353
//===----------------------------------------------------------------------===//
350354

355+
BridgedAccessorDecl BridgedAccessorDecl_createParsed(
356+
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
357+
BridgedAccessorKind cKind, BridgedAbstractStorageDecl cStorage,
358+
BridgedSourceLoc cDeclLoc, BridgedSourceLoc cAccessorKeywordLoc,
359+
BridgedNullableParameterList cParamList, BridgedSourceLoc cAsyncLoc,
360+
BridgedSourceLoc cThrowsLoc, BridgedNullableTypeRepr cThrownType) {
361+
return AccessorDecl::createParsed(
362+
cContext.unbridged(), unbridged(cKind), cStorage.unbridged(),
363+
cDeclLoc.unbridged(), cAccessorKeywordLoc.unbridged(),
364+
cParamList.unbridged(), cAsyncLoc.unbridged(), cThrowsLoc.unbridged(),
365+
cThrownType.unbridged(), cDeclContext.unbridged());
366+
}
367+
351368
BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
352369
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
353370
BridgedSourceLoc cBindingKeywordLoc, BridgedArrayRef cBindingEntries,
@@ -870,6 +887,28 @@ BridgedTopLevelCodeDecl BridgedTopLevelCodeDecl_createExpr(
870887
return new (context) TopLevelCodeDecl(declContext, Brace);
871888
}
872889

890+
//===----------------------------------------------------------------------===//
891+
// MARK: AbstractStorageDecl
892+
//===----------------------------------------------------------------------===//
893+
894+
void BridgedAbstractStorageDecl_setAccessors(
895+
BridgedAbstractStorageDecl cStorage, BridgedAccessorRecord accessors) {
896+
cStorage.unbridged()->setAccessors(
897+
accessors.lBraceLoc.unbridged(),
898+
accessors.accessors.unbridged<AccessorDecl *>(),
899+
accessors.rBraceLoc.unbridged());
900+
}
901+
902+
//===----------------------------------------------------------------------===//
903+
// MARK: AccessorDecl
904+
//===----------------------------------------------------------------------===//
905+
906+
void BridgedAccessorDecl_setParsedBody(BridgedAccessorDecl decl,
907+
BridgedBraceStmt body) {
908+
decl.unbridged()->setBody(body.unbridged(),
909+
AbstractFunctionDecl::BodyKind::Parsed);
910+
}
911+
873912
//===----------------------------------------------------------------------===//
874913
// MARK: BridgedNominalTypeDecl
875914
//===----------------------------------------------------------------------===//
@@ -1570,6 +1609,10 @@ BridgedExistentialTypeRepr_createParsed(BridgedASTContext cContext,
15701609
// MARK: Patterns
15711610
//===----------------------------------------------------------------------===//
15721611

1612+
BridgedNullableVarDecl BridgedPattern_getSingleVar(BridgedPattern cPattern) {
1613+
return cPattern.unbridged()->getSingleVar();
1614+
}
1615+
15731616
BridgedAnyPattern BridgedAnyPattern_createParsed(BridgedASTContext cContext,
15741617
BridgedSourceLoc cLoc) {
15751618
return new (cContext.unbridged()) AnyPattern(cLoc.unbridged());

lib/ASTGen/Sources/ASTGen/ASTGen.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,11 @@ extension ASTGenVisitor {
306306
node.map(generate(enumCaseParameterClause:)).asNullable
307307
}
308308

309+
@inline(__always)
310+
func generate(accessorParameters node: AccessorParametersSyntax?) -> BridgedNullableParameterList {
311+
node.map(generate(accessorParameters:)).asNullable
312+
}
313+
309314
@inline(__always)
310315
func generate(inheritedTypeList node: InheritedTypeListSyntax?) -> BridgedArrayRef {
311316
node.map(generate(inheritedTypeList:)) ?? .init()
@@ -346,6 +351,15 @@ extension Collection {
346351
}
347352
}
348353

354+
extension CollectionOfOne {
355+
/// Returns a single element as a `BridgedArrayRef` with a lifetime tied to that of `astgen`.
356+
func bridgedArray(in astgen: ASTGenVisitor) -> BridgedArrayRef {
357+
let buffer = astgen.allocator.allocate(Element.self, count: 1)
358+
_ = buffer.initialize(from: self)
359+
return .init(data: buffer.baseAddress, count: 1)
360+
}
361+
}
362+
349363
extension LazyCollectionProtocol {
350364
/// Returns a copy of the collection's elements as a `BridgedArrayRef` with a lifetime tied to that of `astgen`.
351365
func bridgedArray(in astgen: ASTGenVisitor) -> BridgedArrayRef {

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ extension ASTGenVisitor {
2121
func generate(decl node: DeclSyntax) -> BridgedDecl {
2222
switch node.as(DeclSyntaxEnum.self) {
2323
case .accessorDecl:
24-
break
24+
fatalError("Should be generated as a part of another decl")
2525
case .actorDecl(let node):
2626
return self.generate(actorDecl: node).asDecl
2727
case .associatedTypeDecl(let node):
@@ -288,6 +288,109 @@ extension ASTGenVisitor {
288288
// MARK: - AbstractStorageDecl
289289

290290
extension ASTGenVisitor {
291+
private func generate(accessorSpecifier specifier: TokenSyntax) -> BridgedAccessorKind {
292+
switch specifier.keywordKind {
293+
case .get:
294+
return .get
295+
case .set:
296+
return .set
297+
case .didSet:
298+
return .didSet
299+
case .willSet:
300+
return .willSet
301+
case .unsafeAddress:
302+
return .address
303+
case .addressWithOwner:
304+
return .address
305+
case .addressWithNativeOwner:
306+
return .address
307+
case .unsafeMutableAddress:
308+
return .mutableAddress
309+
case .mutableAddressWithOwner:
310+
return .mutableAddress
311+
case .mutableAddressWithNativeOwner:
312+
return .mutableAddress
313+
case ._read:
314+
return .read
315+
case ._modify:
316+
return .modify
317+
case .`init`:
318+
return .`init`
319+
default:
320+
fatalError("Should have diagnosed this")
321+
}
322+
}
323+
324+
private func generate(
325+
accessorDecl node: AccessorDeclSyntax,
326+
for storage: BridgedAbstractStorageDecl
327+
) -> BridgedAccessorDecl {
328+
let accessor = BridgedAccessorDecl.createParsed(
329+
self.ctx,
330+
declContext: self.declContext,
331+
kind: self.generate(accessorSpecifier: node.accessorSpecifier),
332+
storage: storage,
333+
declLoc: self.generateSourceLoc(node.accessorSpecifier),
334+
accessorKeywordLoc: self.generateSourceLoc(node.accessorSpecifier),
335+
parameterList: self.generate(accessorParameters: node.parameters),
336+
asyncSpecifierLoc: self.generateSourceLoc(node.effectSpecifiers?.asyncSpecifier),
337+
throwsSpecifierLoc: self.generateSourceLoc(node.effectSpecifiers?.throwsClause),
338+
thrownType: self.generate(type: node.effectSpecifiers?.thrownError)
339+
)
340+
if let body = node.body {
341+
self.withDeclContext(accessor.asDeclContext) {
342+
accessor.setParsedBody(self.generate(codeBlock: body))
343+
}
344+
}
345+
return accessor
346+
}
347+
348+
private func generate(
349+
accessorBlock: AccessorBlockSyntax,
350+
for storage: BridgedAbstractStorageDecl
351+
) -> BridgedAccessorRecord {
352+
let leftBrace = self.generateSourceLoc(accessorBlock.leftBrace)
353+
let rightBrace = self.generateSourceLoc(accessorBlock.rightBrace)
354+
355+
// FIXME: We need to handle the diagnostics in ParsedAccessors::classify,
356+
// or defer them to the type-checker.
357+
switch accessorBlock.accessors {
358+
case .accessors(let accessors):
359+
return BridgedAccessorRecord(
360+
lBraceLoc: leftBrace,
361+
accessors: accessors.lazy.map { self.generate(accessorDecl: $0, for: storage) }.bridgedArray(in: self),
362+
rBraceLoc: rightBrace
363+
)
364+
case .getter(let codeBlock):
365+
let accessor = BridgedAccessorDecl.createParsed(
366+
self.ctx,
367+
declContext: self.declContext,
368+
kind: .get,
369+
storage: storage,
370+
declLoc: leftBrace,
371+
accessorKeywordLoc: nil,
372+
parameterList: nil,
373+
asyncSpecifierLoc: nil,
374+
throwsSpecifierLoc: nil,
375+
thrownType: nil
376+
)
377+
self.withDeclContext(accessor.asDeclContext) {
378+
let brace = BridgedBraceStmt.createParsed(
379+
self.ctx,
380+
lBraceLoc: leftBrace,
381+
elements: self.generate(codeBlockItemList: codeBlock),
382+
rBraceLoc: rightBrace
383+
)
384+
accessor.setParsedBody(brace)
385+
}
386+
return BridgedAccessorRecord(
387+
lBraceLoc: leftBrace,
388+
accessors: CollectionOfOne(accessor).bridgedArray(in: self),
389+
rBraceLoc: rightBrace
390+
)
391+
}
392+
}
393+
291394
func generate(patternBinding binding: PatternBindingSyntax) -> BridgedPatternBindingEntry {
292395
let pattern = generate(pattern: binding.pattern)
293396
let equalLoc = generateSourceLoc(binding.initializer?.equal)
@@ -305,6 +408,16 @@ extension ASTGenVisitor {
305408
generate(expr: initializer.value)
306409
}
307410
}
411+
if let accessors = binding.accessorBlock {
412+
// FIXME: We ought to have a better way of converting from the Nullable
413+
// wrapper back to Optional.
414+
if let primaryVar = pattern.singleVar.raw.map(BridgedVarDecl.init) {
415+
let storage = primaryVar.asAbstractStorageDecl
416+
storage.setAccessors(generate(accessorBlock: accessors, for: storage))
417+
} else {
418+
self.diagnose(Diagnostic(node: binding.pattern, message: NonTrivialPatternForAccessorError()))
419+
}
420+
}
308421
return BridgedPatternBindingEntry(
309422
pattern: pattern,
310423
equalLoc: equalLoc,

lib/ASTGen/Sources/ASTGen/Diagnostics.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,9 @@ struct DuplicateSyntaxError: ASTGenError {
9595
"""
9696
}
9797
}
98+
99+
struct NonTrivialPatternForAccessorError: ASTGenError {
100+
var message: String {
101+
"getter/setter can only be defined for a single variable"
102+
}
103+
}

lib/ASTGen/Sources/ASTGen/ParameterClause.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,27 @@ extension ASTGenVisitor {
122122
rightParenLoc: self.generateSourceLoc(node.rightParen)
123123
)
124124
}
125+
126+
func generate(accessorParameters node: AccessorParametersSyntax) -> BridgedParameterList {
127+
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
128+
let param = BridgedParamDecl.createParsed(
129+
self.ctx,
130+
declContext: self.declContext,
131+
specifierLoc: nil,
132+
firstName: nil,
133+
firstNameLoc: nil,
134+
secondName: name,
135+
secondNameLoc: nameLoc,
136+
type: nil,
137+
defaultValue: nil
138+
)
139+
return .createParsed(
140+
self.ctx,
141+
leftParenLoc: self.generateSourceLoc(node.leftParen),
142+
parameters: CollectionOfOne(param).bridgedArray(in: self),
143+
rightParenLoc: self.generateSourceLoc(node.rightParen)
144+
)
145+
}
125146
}
126147

127148
extension ASTGenVisitor {

0 commit comments

Comments
 (0)