Skip to content

Commit f4f7f7f

Browse files
CodaFiDougGregor
authored andcommitted
Finish Off ASTGen Implementation for Types
Complete the lowering for the type ASTs present in SwiftSyntax to C++ TypeReprs
1 parent b0de482 commit f4f7f7f

File tree

5 files changed

+313
-11
lines changed

5 files changed

+313
-11
lines changed

include/swift/AST/CASTBridging.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ typedef struct {
4848

4949
typedef void *BridgedIdentifier;
5050

51+
typedef struct {
52+
BridgedIdentifier _Nullable Name;
53+
void *_Nullable NameLoc;
54+
BridgedIdentifier _Nullable SecondName;
55+
void *_Nullable SecondNameLoc;
56+
void *_Nullable UnderscoreLoc;
57+
void *_Nullable ColonLoc;
58+
void *Type;
59+
void *_Nullable TrailingCommaLoc;
60+
} BridgedTupleTypeElement;
5161
#ifdef __cplusplus
5262
extern "C" {
5363

@@ -127,6 +137,22 @@ struct DeclContextAndDecl StructDecl_create(
127137
struct DeclContextAndDecl ClassDecl_create(
128138
void *ctx, void *loc, BridgedIdentifier name, void *nameLoc, void *dc);
129139

140+
void *ArrayTypeRepr_create(void *ctx, void *base, void *lsquareLoc, void *rsquareLoc);
141+
void *DictionaryTypeRepr_create(void *ctx, void *keyType, void *valueType, void *lsquareLoc, void *colonloc, void *rsquareLoc);
142+
void *OptionalTypeRepr_create(void *ctx, void *base, void *questionLoc);
143+
void *ImplicitlyUnwrappedOptionalTypeRepr_create(void *ctx, void *base, void *exclamationLoc);
144+
void *MetatypeTypeRepr_create(void *ctx, void *baseType, void *typeLoc);
145+
void *ProtocolTypeRepr_create(void *ctx, void *baseType, void *protoLoc);
146+
void *PackExpansionTypeRepr_create(void *ctx, void *base, void *ellipsisLoc);
147+
void *TupleTypeRepr_create(void *ctx, BridgedArrayRef elements, void *lParenLoc, void *rParenLoc);
148+
void *IdentTypeRepr_create(void *ctx, BridgedArrayRef components);
149+
void *GenericIdentTypeRepr_create(void *ctx, BridgedIdentifier name, void *nameLoc, BridgedArrayRef genericArgs, void *lAngle, void *rAngle);
150+
void *CompositionTypeRepr_create(void *ctx, BridgedArrayRef types, void *firstTypeLoc);
151+
void *FunctionTypeRepr_create(void *ctx, void *argsTy, void *_Nullable asyncLoc, void *_Nullable throwsLoc, void *arrowLoc, void *returnType);
152+
void *NamedOpaqueReturnTypeRepr_create(void *ctx, void *baseTy);
153+
void *OpaqueReturnTypeRepr_create(void *ctx, void *opaqueLoc, void *baseTy);
154+
void *ExistentialTypeRepr_create(void *ctx, void *anyLoc, void *baseTy);
155+
130156
void TopLevelCodeDecl_dump(void *);
131157
void Expr_dump(void *);
132158
void Decl_dump(void *);

lib/AST/CASTBridging.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,16 @@ void *SimpleIdentTypeRepr_create(void *ctx, void *loc, BridgedIdentifier id) {
225225
DeclNameRef(Identifier::getFromOpaquePointer(id)));
226226
}
227227

228+
229+
void *GenericIdentTypeRepr_create(void *ctx, BridgedIdentifier name, void *nameLoc, BridgedArrayRef genericArgs, void *lAngle, void *rAngle) {
230+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
231+
auto Loc = DeclNameLoc(getSourceLocFromPointer(nameLoc));
232+
auto Name = DeclNameRef(Identifier::getFromOpaquePointer(name));
233+
SourceLoc lAngleLoc = getSourceLocFromPointer(lAngle);
234+
SourceLoc rAngleLoc = getSourceLocFromPointer(rAngle);
235+
return GenericIdentTypeRepr::create(Context, Loc, Name, getArrayRef<TypeRepr *>(genericArgs), SourceRange{lAngleLoc, rAngleLoc});
236+
}
237+
228238
void *UnresolvedDotExpr_create(
229239
void *ctx, void *base, void *dotLoc, BridgedIdentifier name,
230240
void *nameLoc) {
@@ -281,6 +291,104 @@ DeclContextAndDecl ClassDecl_create(
281291
return {(DeclContext *)out, (NominalTypeDecl *)out, (Decl *)out};
282292
}
283293

294+
void *OptionalTypeRepr_create(void *ctx, void *base, void *questionLoc) {
295+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
296+
return new (Context) OptionalTypeRepr((TypeRepr *)base, getSourceLocFromPointer(questionLoc));
297+
}
298+
299+
void *ImplicitlyUnwrappedOptionalTypeRepr_create(void *ctx, void *base, void *exclamationLoc) {
300+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
301+
return new (Context) ImplicitlyUnwrappedOptionalTypeRepr((TypeRepr *)base, getSourceLocFromPointer(exclamationLoc));
302+
}
303+
304+
void *ArrayTypeRepr_create(void *ctx, void *base, void *lsquareLoc, void *rsquareLoc) {
305+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
306+
SourceLoc lSquareLoc = getSourceLocFromPointer(lsquareLoc);
307+
SourceLoc rSquareLoc = getSourceLocFromPointer(rsquareLoc);
308+
return new (Context) ArrayTypeRepr((TypeRepr *)base, SourceRange{lSquareLoc, rSquareLoc});
309+
}
310+
311+
void *DictionaryTypeRepr_create(void *ctx, void *keyType, void *valueType, void *lsquareLoc, void *colonloc, void *rsquareLoc) {
312+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
313+
SourceLoc lSquareLoc = getSourceLocFromPointer(lsquareLoc);
314+
SourceLoc colonLoc = getSourceLocFromPointer(colonloc);
315+
SourceLoc rSquareLoc = getSourceLocFromPointer(rsquareLoc);
316+
return new (Context) DictionaryTypeRepr((TypeRepr *)keyType, (TypeRepr *)valueType, colonLoc, SourceRange{lSquareLoc, rSquareLoc});
317+
}
318+
319+
void *MetatypeTypeRepr_create(void *ctx, void *baseType, void *typeLoc) {
320+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
321+
SourceLoc tyLoc = getSourceLocFromPointer(typeLoc);
322+
return new (Context) MetatypeTypeRepr((TypeRepr *)baseType, tyLoc);
323+
}
324+
325+
void *ProtocolTypeRepr_create(void *ctx, void *baseType, void *protoLoc) {
326+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
327+
SourceLoc protocolLoc = getSourceLocFromPointer(protoLoc);
328+
return new (Context) ProtocolTypeRepr((TypeRepr *)baseType, protocolLoc);
329+
}
330+
331+
void *PackExpansionTypeRepr_create(void *ctx, void *base, void *ellipsisLoc) {
332+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
333+
return new (Context) PackExpansionTypeRepr((TypeRepr *)base, getSourceLocFromPointer(ellipsisLoc));
334+
}
335+
336+
void *TupleTypeRepr_create(void *ctx, BridgedArrayRef elements, void *lParenLoc, void *rParenLoc) {
337+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
338+
SourceLoc lParen = getSourceLocFromPointer(lParenLoc);
339+
SourceLoc rParen = getSourceLocFromPointer(rParenLoc);
340+
SmallVector<TupleTypeReprElement, 8> tupleElements;
341+
for (auto element : getArrayRef<BridgedTupleTypeElement>(elements)) {
342+
TupleTypeReprElement elementRepr;
343+
elementRepr.Name = Identifier::getFromOpaquePointer(element.Name);
344+
elementRepr.NameLoc = getSourceLocFromPointer(element.NameLoc);
345+
elementRepr.SecondName = Identifier::getFromOpaquePointer(element.SecondName);
346+
elementRepr.SecondNameLoc = getSourceLocFromPointer(element.SecondNameLoc);
347+
elementRepr.UnderscoreLoc = getSourceLocFromPointer(element.UnderscoreLoc);
348+
elementRepr.ColonLoc = getSourceLocFromPointer(element.ColonLoc);
349+
elementRepr.Type = (TypeRepr *)element.Type;
350+
elementRepr.TrailingCommaLoc = getSourceLocFromPointer(element.TrailingCommaLoc);
351+
tupleElements.emplace_back(elementRepr);
352+
}
353+
354+
return TupleTypeRepr::create(Context, tupleElements, SourceRange{lParen, rParen});
355+
}
356+
357+
void *IdentTypeRepr_create(void *ctx, BridgedArrayRef components) {
358+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
359+
return IdentTypeRepr::create(Context, getArrayRef<ComponentIdentTypeRepr *>(components));
360+
}
361+
362+
void *CompositionTypeRepr_create(void *ctx, BridgedArrayRef types, void *firstTypeLoc) {
363+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
364+
SourceLoc firstType = getSourceLocFromPointer(firstTypeLoc);
365+
return CompositionTypeRepr::create(Context, getArrayRef<TypeRepr *>(types), firstType, SourceRange{});
366+
}
367+
368+
void *FunctionTypeRepr_create(void *ctx, void *argsTy, void *_Nullable asyncLoc, void *_Nullable throwsLoc, void *arrowLoc, void *returnType) {
369+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
370+
return new (Context) FunctionTypeRepr(nullptr,
371+
(TupleTypeRepr *)argsTy,
372+
getSourceLocFromPointer(asyncLoc),
373+
getSourceLocFromPointer(throwsLoc),
374+
getSourceLocFromPointer(arrowLoc),
375+
(TypeRepr *)returnType);
376+
}
377+
378+
void *NamedOpaqueReturnTypeRepr_create(void *ctx, void *baseTy) {
379+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
380+
return new (Context) NamedOpaqueReturnTypeRepr((TypeRepr *)baseTy, nullptr);
381+
}
382+
383+
void *OpaqueReturnTypeRepr_create(void *ctx, void *opaqueLoc, void *baseTy) {
384+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
385+
return new (Context) OpaqueReturnTypeRepr(getSourceLocFromPointer(opaqueLoc), (TypeRepr *)baseTy);
386+
}
387+
void *ExistentialTypeRepr_create(void *ctx, void *anyLoc, void *baseTy) {
388+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
389+
return new (Context) ExistentialTypeRepr(getSourceLocFromPointer(anyLoc), (TypeRepr *)baseTy);
390+
}
391+
284392
void TopLevelCodeDecl_dump(void *decl) { ((TopLevelCodeDecl *)decl)->dump(llvm::errs()); }
285393

286394
void Expr_dump(void *expr) { ((Expr *)expr)->dump(llvm::errs()); }

lib/ASTGen/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ if (SWIFT_SWIFT_PARSER)
88
Sources/ASTGen/Misc.swift
99
Sources/ASTGen/SourceFile.swift
1010
Sources/ASTGen/Stmts.swift
11+
Sources/ASTGen/Types.swift
1112
)
1213

1314
# Set the appropriate target triple.

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,6 @@ extension ASTGenVisitor {
4141
return SwiftIdentifierExpr_create(ctx, id, loc)
4242
}
4343

44-
public func visit(_ node: SimpleTypeIdentifierSyntax) -> UnsafeMutableRawPointer {
45-
let loc = self.base.advanced(by: node.position.utf8Offset).raw
46-
47-
var text = node.name.text
48-
let id = text.withUTF8 { buf in
49-
return SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
50-
}
51-
52-
return SimpleIdentTypeRepr_create(ctx, loc, id)
53-
}
54-
5544
public func visit(_ node: IdentifierPatternSyntax) -> UnsafeMutableRawPointer {
5645
let loc = self.base.advanced(by: node.position.utf8Offset).raw
5746

lib/ASTGen/Sources/ASTGen/Types.swift

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
import SwiftParser
2+
import SwiftSyntax
3+
4+
import CASTBridging
5+
6+
extension ASTGenVisitor {
7+
public func visit(_ node: SimpleTypeIdentifierSyntax) -> UnsafeMutableRawPointer {
8+
let loc = self.base.advanced(by: node.position.utf8Offset).raw
9+
10+
var text = node.name.text
11+
let id = text.withUTF8 { buf in
12+
return SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
13+
}
14+
15+
return SimpleIdentTypeRepr_create(ctx, loc, id)
16+
}
17+
18+
public func visit(_ node: MemberTypeIdentifierSyntax) -> UnsafeMutableRawPointer {
19+
var path = [(TokenSyntax, GenericArgumentClauseSyntax?)]()
20+
var memberRef: Syntax? = Syntax(node)
21+
while let nestedMember = memberRef?.as(MemberTypeIdentifierSyntax.self) {
22+
path.append((nestedMember.name, nestedMember.genericArgumentClause))
23+
memberRef = Syntax(nestedMember.baseType)
24+
}
25+
26+
if let base = memberRef?.as(SimpleTypeIdentifierSyntax.self) {
27+
path.append((base.name, base.genericArgumentClause))
28+
}
29+
30+
var elements = [UnsafeMutableRawPointer]()
31+
for (pathElement, generics) in path.reversed() {
32+
var nameText = pathElement.text
33+
let name = nameText.withUTF8 { buf in
34+
return SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
35+
}
36+
let nameLoc = self.base.advanced(by: pathElement.position.utf8Offset).raw
37+
38+
elements.append(SimpleIdentTypeRepr_create(self.ctx, nameLoc, name))
39+
}
40+
41+
return elements.withBridgedArrayRef { elements in
42+
return IdentTypeRepr_create(self.ctx, elements)
43+
}
44+
}
45+
46+
public func visit(_ node: ArrayTypeSyntax) -> UnsafeMutableRawPointer {
47+
let elementType = visit(node.elementType)
48+
let lSquareLoc = self.base.advanced(by: node.leftSquareBracket.position.utf8Offset).raw
49+
let rSquareLoc = self.base.advanced(by: node.rightSquareBracket.position.utf8Offset).raw
50+
return ArrayTypeRepr_create(self.ctx, elementType, lSquareLoc, rSquareLoc)
51+
}
52+
53+
public func visit(_ node: DictionaryTypeSyntax) -> UnsafeMutableRawPointer {
54+
let keyType = visit(node.keyType)
55+
let valueType = visit(node.valueType)
56+
let colonLoc = self.base.advanced(by: node.colon.position.utf8Offset).raw
57+
let lSquareLoc = self.base.advanced(by: node.leftSquareBracket.position.utf8Offset).raw
58+
let rSquareLoc = self.base.advanced(by: node.rightSquareBracket.position.utf8Offset).raw
59+
return DictionaryTypeRepr_create(self.ctx, keyType, valueType, colonLoc, lSquareLoc, rSquareLoc)
60+
}
61+
62+
public func visit(_ node: MetatypeTypeSyntax) -> UnsafeMutableRawPointer {
63+
let baseType = visit(node.baseType)
64+
let tyLoc = self.base.advanced(by: node.typeOrProtocol.position.utf8Offset).raw
65+
if node.typeOrProtocol.text == "Type" {
66+
return MetatypeTypeRepr_create(self.ctx, baseType, tyLoc)
67+
} else {
68+
assert(node.typeOrProtocol.text == "Protocol")
69+
return ProtocolTypeRepr_create(self.ctx, baseType, tyLoc)
70+
}
71+
}
72+
73+
public func visit(_ node: ImplicitlyUnwrappedOptionalTypeSyntax) -> UnsafeMutableRawPointer {
74+
let base = visit(node.wrappedType)
75+
let exclaimLoc = self.base.advanced(by: node.exclamationMark.position.utf8Offset).raw
76+
return ImplicitlyUnwrappedOptionalTypeRepr_create(self.ctx, base, exclaimLoc)
77+
}
78+
79+
public func visit(_ node: OptionalTypeSyntax) -> UnsafeMutableRawPointer {
80+
let base = visit(node.wrappedType)
81+
let questionLoc = self.base.advanced(by: node.questionMark.position.utf8Offset).raw
82+
return OptionalTypeRepr_create(self.ctx, base, questionLoc)
83+
}
84+
85+
public func visit(_ node: PackExpansionTypeSyntax) -> UnsafeMutableRawPointer {
86+
let base = visit(node.patternType)
87+
let ellipsisLoc = self.base.advanced(by: node.ellipsis.position.utf8Offset).raw
88+
return PackExpansionTypeRepr_create(self.ctx, base, ellipsisLoc)
89+
}
90+
91+
public func visit(_ node: TupleTypeSyntax) -> UnsafeMutableRawPointer {
92+
return self.withBridgedTupleElements(node.elements) { elements in
93+
let lParenLoc = self.base.advanced(by: node.leftParen.position.utf8Offset).raw
94+
let rParenLoc = self.base.advanced(by: node.rightParen.position.utf8Offset).raw
95+
return TupleTypeRepr_create(self.ctx, elements, lParenLoc, rParenLoc)
96+
}
97+
}
98+
99+
public func visit(_ node: CompositionTypeSyntax) -> UnsafeMutableRawPointer {
100+
assert(node.elements.count > 1)
101+
let types = node.elements.map { visit($0.type) }
102+
let firstTypeLoc = self.base.advanced(by: node.elements.first!.type.position.utf8Offset).raw
103+
return types.withBridgedArrayRef { types in
104+
return CompositionTypeRepr_create(self.ctx, types, firstTypeLoc)
105+
}
106+
}
107+
108+
public func visit(_ node: FunctionTypeSyntax) -> UnsafeMutableRawPointer {
109+
return self.withBridgedTupleElements(node.arguments) { elements in
110+
let lParenLoc = self.base.advanced(by: node.leftParen.position.utf8Offset).raw
111+
let rParenLoc = self.base.advanced(by: node.rightParen.position.utf8Offset).raw
112+
let args = TupleTypeRepr_create(self.ctx, elements, lParenLoc, rParenLoc)
113+
let asyncLoc = node.asyncKeyword.map { self.base.advanced(by: $0.position.utf8Offset).raw }
114+
let throwsLoc = node.throwsOrRethrowsKeyword.map { self.base.advanced(by: $0.position.utf8Offset).raw }
115+
let arrowLoc = self.base.advanced(by: node.arrow.position.utf8Offset).raw
116+
let retTy = visit(node.returnType)
117+
return FunctionTypeRepr_create(self.ctx, args, asyncLoc, throwsLoc, arrowLoc, retTy)
118+
}
119+
}
120+
121+
public func visit(_ node: NamedOpaqueReturnTypeSyntax) -> UnsafeMutableRawPointer {
122+
let baseTy = visit(node.baseType)
123+
return NamedOpaqueReturnTypeRepr_create(self.ctx, baseTy)
124+
}
125+
126+
public func visit(_ node: ConstrainedSugarTypeSyntax) -> UnsafeMutableRawPointer {
127+
let someOrAnyLoc = self.base.advanced(by: node.someOrAnySpecifier.position.utf8Offset).raw
128+
let baseTy = visit(node.baseType)
129+
if node.someOrAnySpecifier.text == "some" {
130+
return OpaqueReturnTypeRepr_create(self.ctx, someOrAnyLoc, baseTy)
131+
} else {
132+
assert(node.someOrAnySpecifier.text == "any")
133+
return ExistentialTypeRepr_create(self.ctx, someOrAnyLoc, baseTy)
134+
}
135+
}
136+
137+
public func visit(_ node: AttributedTypeSyntax) -> UnsafeMutableRawPointer {
138+
// FIXME: Respect the attributes
139+
return visit(node.baseType)
140+
}
141+
}
142+
143+
extension ASTGenVisitor {
144+
private func withBridgedTupleElements<T>(
145+
_ elementList: TupleTypeElementListSyntax,
146+
action: (BridgedArrayRef) -> T
147+
) -> T {
148+
var elements = [BridgedTupleTypeElement]()
149+
for element in elementList {
150+
var nameText = element.name?.text
151+
let name = nameText?.withUTF8 { buf in
152+
return SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
153+
}
154+
let nameLoc = element.name.map { self.base.advanced(by: $0.position.utf8Offset).raw }
155+
var secondNameText = element.secondName?.text
156+
let secondName = secondNameText?.withUTF8 { buf in
157+
return SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
158+
}
159+
let secondNameLoc = element.secondName.map { self.base.advanced(by: $0.position.utf8Offset).raw }
160+
let colonLoc = element.colon.map { self.base.advanced(by: $0.position.utf8Offset).raw }
161+
let type = visit(element.type)
162+
let trailingCommaLoc = element.trailingComma.map { self.base.advanced(by: $0.position.utf8Offset).raw }
163+
164+
elements.append(BridgedTupleTypeElement(
165+
Name: name,
166+
NameLoc: nameLoc,
167+
SecondName: secondName,
168+
SecondNameLoc: secondNameLoc,
169+
UnderscoreLoc: nil, /*N.B. Only important for SIL*/
170+
ColonLoc: colonLoc,
171+
Type: type,
172+
TrailingCommaLoc: trailingCommaLoc))
173+
}
174+
return elements.withBridgedArrayRef { elements in
175+
return action(elements)
176+
}
177+
}
178+
}

0 commit comments

Comments
 (0)