@@ -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
290290extension 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,
0 commit comments