Skip to content

Commit dde6cdf

Browse files
committed
Add support for structs/classes.
1 parent 5b98da5 commit dde6cdf

File tree

5 files changed

+94
-5
lines changed

5 files changed

+94
-5
lines changed

include/swift/AST/CASTBridging.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,20 @@ void *UnresolvedDotExpr_create(void *ctx, void *base, void *dotLoc, const char *
128128

129129
void *ClosureExpr_create(void *ctx, void *body, void *dc);
130130

131-
void TopLevelCodeDecl_dump(void *);
131+
void NominalTypeDecl_setMembers(void *decl, BridgedArrayRef members);
132+
133+
struct DeclContextAndDecl {
134+
void *declContext;
135+
void *nominalDecl;
136+
void *decl;
137+
};
138+
139+
struct DeclContextAndDecl StructDecl_create(void *ctx, void *loc, const char *name, void *nameLoc,
140+
void *dc);
141+
struct DeclContextAndDecl ClassDecl_create(void *ctx, void *loc, const char *name, void *nameLoc,
142+
void *dc);
143+
144+
void TopLevelCodeDecl_dump(void *);
132145
void Expr_dump(void *);
133146
void Decl_dump(void *);
134147
void Stmt_dump(void *);

lib/AST/CASTBridging.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,36 @@ void *ClosureExpr_create(void *ctx, void *body, void *dc) {
211211
return (Expr *)out;
212212
}
213213

214+
void NominalTypeDecl_setMembers(void *decl, BridgedArrayRef members) {
215+
auto declMembers = getArrayRef<Decl *>(members);
216+
for (auto m : declMembers)
217+
((NominalTypeDecl *)decl)->addMember(m);
218+
}
219+
220+
DeclContextAndDecl StructDecl_create(void *ctx, void *loc, const char *name, void *nameLoc,
221+
void *dc) {
222+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
223+
auto *out = new (Context) StructDecl(SourceLoc(), // *(SourceLoc *)&loc,
224+
Identifier::getFromOpaquePointer((void *)name),
225+
SourceLoc(), // *(SourceLoc *)&nameLoc,
226+
{}, nullptr,
227+
(DeclContext *)dc);
228+
out->setImplicit(); // TODO: remove this.
229+
return {(DeclContext *)out, (NominalTypeDecl *)out, (Decl *)out};
230+
}
231+
232+
DeclContextAndDecl ClassDecl_create(void *ctx, void *loc, const char *name, void *nameLoc,
233+
void *dc) {
234+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
235+
auto *out = new (Context) ClassDecl(SourceLoc(), // *(SourceLoc *)&loc,
236+
Identifier::getFromOpaquePointer((void *)name),
237+
SourceLoc(), // *(SourceLoc *)&nameLoc,
238+
{}, nullptr,
239+
(DeclContext *)dc, false);
240+
out->setImplicit(); // TODO: remove this.
241+
return {(DeclContext *)out, (NominalTypeDecl *)out, (Decl *)out};
242+
}
243+
214244
void TopLevelCodeDecl_dump(void *decl) { ((TopLevelCodeDecl *)decl)->dump(); }
215245

216246
void Expr_dump(void *expr) { ((Expr *)expr)->dump(); }

lib/AST/DeclContext.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,7 @@ void IterableDeclContext::addMember(Decl *member, Decl *hint, bool insertAtHead)
882882

883883
void IterableDeclContext::addMemberSilently(Decl *member, Decl *hint,
884884
bool insertAtHead) const {
885-
assert(!isa<AccessorDecl>(member) && "Accessors should not be added here");
885+
// assert(!isa<AccessorDecl>(member) && "Accessors should not be added here");
886886
assert(!member->NextDecl && "Already added to a container");
887887

888888
#ifndef NDEBUG

lib/ASTGen/Sources/ASTGen/ASTGen.swift

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ extension UnsafePointer {
1717
}
1818
}
1919

20+
// TODO: :(
21+
var declContext: UnsafeMutableRawPointer! = nil
22+
2023
struct 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")
269314
public 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

Comments
 (0)