@@ -17,12 +17,15 @@ extension UnsafePointer {
1717 }
1818}
1919
20+ // TODO: :(
21+ var declContext : UnsafeMutableRawPointer ! = nil
22+
2023struct ASTGenVisitor : SyntaxTransformVisitor {
2124 let ctx : UnsafeMutableRawPointer
2225 let base : UnsafePointer < CChar >
2326
2427 // TOOD: we need to be up updating this.
25- var declContext : UnsafeMutableRawPointer
28+ // var declContext: UnsafeMutableRawPointer
2629
2730 // TODO: this some how messes up the witness table when I uncomment it locally :/
2831// public func visit<T>(_ node: T?) -> [UnsafeMutableRawPointer]? {
@@ -58,6 +61,48 @@ struct ASTGenVisitor: SyntaxTransformVisitor {
5861 return out
5962 }
6063
64+ public func visit( _ node: MemberDeclListItemSyntax ) -> UnsafeMutableRawPointer {
65+ visit ( Syntax ( node. decl) )
66+ }
67+
68+ public func visit( _ node: StructDeclSyntax ) -> UnsafeMutableRawPointer {
69+ let loc = self . base. advanced ( by: node. position. utf8Offset) . raw
70+ var nameText = node. identifier. text
71+ let name = nameText. withUTF8 { buf in
72+ return SwiftASTContext_getIdentifier ( ctx, buf. baseAddress, buf. count)
73+ }
74+
75+ let out = StructDecl_create ( ctx, loc, name, loc, declContext)
76+ let oldDeclContext = declContext
77+ declContext = out. declContext
78+ defer { declContext = oldDeclContext }
79+
80+ node. members. members. map ( self . visit) . withBridgedArrayRef { ref in
81+ NominalTypeDecl_setMembers ( out. nominalDecl, ref)
82+ }
83+
84+ return out. decl
85+ }
86+
87+ public func visit( _ node: ClassDeclSyntax ) -> UnsafeMutableRawPointer {
88+ let loc = self . base. advanced ( by: node. position. utf8Offset) . raw
89+ var nameText = node. identifier. text
90+ let name = nameText. withUTF8 { buf in
91+ return SwiftASTContext_getIdentifier ( ctx, buf. baseAddress, buf. count)
92+ }
93+
94+ let out = ClassDecl_create ( ctx, loc, name, loc, declContext)
95+ let oldDeclContext = declContext
96+ declContext = out. declContext
97+ defer { declContext = oldDeclContext }
98+
99+ node. members. members. map ( self . visit) . withBridgedArrayRef { ref in
100+ NominalTypeDecl_setMembers ( out. nominalDecl, ref)
101+ }
102+
103+ return out. decl
104+ }
105+
61106 public func visit( _ node: ClosureExprSyntax ) -> UnsafeMutableRawPointer {
62107 let statements = node. statements. map ( self . visit)
63108 let loc = self . base. advanced ( by: node. position. utf8Offset) . raw
@@ -267,14 +312,15 @@ struct ASTGenVisitor: SyntaxTransformVisitor {
267312
268313@_cdecl ( " parseTopLevelSwift " )
269314public func parseTopLevelSwift(
270- buffer: UnsafePointer < CChar > , declContext : UnsafeMutableRawPointer ,
315+ buffer: UnsafePointer < CChar > , dc : UnsafeMutableRawPointer ,
271316 ctx: UnsafeMutableRawPointer ,
272317 outputContext: UnsafeMutableRawPointer ,
273318 callback: @convention ( c) ( UnsafeMutableRawPointer , UnsafeMutableRawPointer ) -> Void
274319) {
275320 let syntax = try ! Parser . parse ( source: String ( cString: buffer) )
276321 dump ( syntax)
277- ASTGenVisitor ( ctx: ctx, base: buffer, declContext: declContext)
322+ declContext = dc
323+ ASTGenVisitor ( ctx: ctx, base: buffer)
278324 . visit ( syntax)
279325 . forEach { callback ( $0, outputContext) }
280326}
0 commit comments