Skip to content

Commit 227bc1a

Browse files
committed
[ASTGen] Clean up casting with source locations
1 parent 2f61489 commit 227bc1a

File tree

1 file changed

+55
-41
lines changed

1 file changed

+55
-41
lines changed

lib/AST/CASTBridging.cpp

Lines changed: 55 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ inline llvm::ArrayRef<T> getArrayRef(BridgedArrayRef bridged) {
1616
return {static_cast<const T *>(bridged.data), size_t(bridged.numElements)};
1717
}
1818

19+
static SourceLoc getSourceLocFromPointer(void *loc) {
20+
auto smLoc = llvm::SMLoc::getFromPointer((const char *)loc);
21+
return SourceLoc(smLoc);
22+
}
23+
1924
BridgedIdentifier
2025
SwiftASTContext_getIdentifier(void *ctx, const uint8_t *_Nullable str, long len) {
2126
return const_cast<void *>(
@@ -39,23 +44,24 @@ void *SwiftImportDecl_create(void *ctx, void *dc, void *importLoc, char kind,
3944
importPath.push_back(ident, loc);
4045
}
4146
return ImportDecl::create(
42-
Context, static_cast<DeclContext *>(dc), *(SourceLoc *)&importLoc,
43-
static_cast<ImportKind>(kind), *(SourceLoc *)&kindLoc,
47+
Context, static_cast<DeclContext *>(dc),
48+
getSourceLocFromPointer(importLoc),
49+
static_cast<ImportKind>(kind), getSourceLocFromPointer(kindLoc),
4450
std::move(importPath).get());
4551
}
4652

4753
void *BridgedSourceLoc_advanced(void *loc, long len) {
48-
SourceLoc l = ((SourceLoc *)&loc)->getAdvancedLoc(len);
49-
return &l; // TODO: what?
54+
SourceLoc l = getSourceLocFromPointer(loc).getAdvancedLoc(len);
55+
return const_cast<void *>(l.getOpaquePointerValue());
5056
}
5157

5258
void *SwiftTopLevelCodeDecl_createStmt(void *ctx, void *DC, void *startLoc,
5359
void *element, void *endLoc) {
5460
ASTContext &Context = *static_cast<ASTContext *>(ctx);
5561
auto *S = static_cast<Stmt *>(element);
5662
auto Brace =
57-
BraceStmt::create(Context, *(SourceLoc *)&startLoc,
58-
{S}, *(SourceLoc *)&endLoc,
63+
BraceStmt::create(Context, getSourceLocFromPointer(startLoc),
64+
{S}, getSourceLocFromPointer(endLoc),
5965
/*Implicit=*/true);
6066
auto *TLCD =
6167
new (Context) TopLevelCodeDecl(static_cast<DeclContext *>(DC), Brace);
@@ -67,8 +73,8 @@ void *SwiftTopLevelCodeDecl_createExpr(void *ctx, void *DC, void *startLoc,
6773
ASTContext &Context = *static_cast<ASTContext *>(ctx);
6874
auto *E = static_cast<Expr *>(element);
6975
auto Brace =
70-
BraceStmt::create(Context, *(SourceLoc *)&startLoc,
71-
{E}, *(SourceLoc *)&endLoc,
76+
BraceStmt::create(Context, getSourceLocFromPointer(startLoc),
77+
{E}, getSourceLocFromPointer(endLoc),
7278
/*Implicit=*/true);
7379
auto *TLCD =
7480
new (Context) TopLevelCodeDecl(static_cast<DeclContext *>(DC), Brace);
@@ -83,8 +89,8 @@ void *SwiftSequenceExpr_create(void *ctx, BridgedArrayRef exprs) {
8389
void *SwiftTupleExpr_create(void *ctx, void *lparen, BridgedArrayRef subs,
8490
void *rparen) {
8591
return TupleExpr::create(
86-
*static_cast<ASTContext *>(ctx), *(SourceLoc *)&lparen,
87-
getArrayRef<Expr *>(subs), {}, {}, *(SourceLoc *)&rparen,
92+
*static_cast<ASTContext *>(ctx), getSourceLocFromPointer(lparen),
93+
getArrayRef<Expr *>(subs), {}, {}, getSourceLocFromPointer(rparen),
8894
/*Implicit*/ false);
8995
}
9096

@@ -108,7 +114,7 @@ void *SwiftIdentifierExpr_create(void *ctx, BridgedIdentifier base, void *loc) {
108114
auto name = DeclNameRef{
109115
swift::Identifier::getFromOpaquePointer(base)};
110116
Expr *E = new (Context) UnresolvedDeclRefExpr(
111-
name, DeclRefKind::Ordinary, DeclNameLoc{*(SourceLoc *)&loc});
117+
name, DeclRefKind::Ordinary, DeclNameLoc{getSourceLocFromPointer(loc)});
112118
return E;
113119
}
114120

@@ -118,43 +124,46 @@ void *SwiftStringLiteralExpr_create(
118124
ASTContext &Context = *static_cast<ASTContext *>(ctx);
119125
return new (Context) StringLiteralExpr(
120126
StringRef{reinterpret_cast<const char *>(string), size_t(len)},
121-
*(SourceLoc *)&TokenLoc);
127+
getSourceLocFromPointer(TokenLoc));
122128
}
123129

124130
void *SwiftIntegerLiteralExpr_create(
125131
void *ctx, const uint8_t *_Nullable string, long len, void *TokenLoc) {
126132
ASTContext &Context = *static_cast<ASTContext *>(ctx);
127133
return new (Context) IntegerLiteralExpr(
128134
StringRef{reinterpret_cast<const char *>(string), size_t(len)},
129-
*(SourceLoc *)&TokenLoc);
135+
getSourceLocFromPointer(TokenLoc));
130136
}
131137

132138
void *SwiftBooleanLiteralExpr_create(void *ctx, bool value, void *TokenLoc) {
133139
ASTContext &Context = *static_cast<ASTContext *>(ctx);
134-
return new (Context) BooleanLiteralExpr(value, *(SourceLoc *)&TokenLoc);
140+
return new (Context) BooleanLiteralExpr(
141+
value, getSourceLocFromPointer(TokenLoc));
135142
}
136143

137144
void *SwiftVarDecl_create(void *ctx, BridgedIdentifier _Nullable nameId,
138145
void *loc, bool isStatic, bool isLet, void *dc) {
139146
ASTContext &Context = *static_cast<ASTContext *>(ctx);
140147
return new (Context) VarDecl(isStatic,
141148
isLet ? VarDecl::Introducer::Let : VarDecl::Introducer::Var,
142-
*(SourceLoc *)&loc, Identifier::getFromOpaquePointer(nameId),
149+
getSourceLocFromPointer(loc),
150+
Identifier::getFromOpaquePointer(nameId),
143151
reinterpret_cast<DeclContext *>(dc));
144152
}
145153

146154
void *IfStmt_create(void *ctx, void *ifLoc, void *cond, void *_Nullable then, void *_Nullable elseLoc,
147155
void *_Nullable elseStmt) {
148156
ASTContext &Context = *static_cast<ASTContext *>(ctx);
149-
return new (Context) IfStmt(*(SourceLoc *)&ifLoc, (Expr *)cond, (Stmt *)then, *(SourceLoc *)&elseLoc,
150-
(Stmt *)elseStmt, None, Context);
157+
return new (Context) IfStmt(
158+
getSourceLocFromPointer(ifLoc), (Expr *)cond, (Stmt *)then,
159+
getSourceLocFromPointer(elseLoc), (Stmt *)elseStmt, None, Context);
151160
}
152161

153162
void *BraceStmt_createExpr(void *ctx, void *lbloc, BridgedArrayRef elements, void *rbloc) {
154163
ASTContext &Context = *static_cast<ASTContext *>(ctx);
155-
return BraceStmt::create(Context, *(SourceLoc *)&lbloc,
164+
return BraceStmt::create(Context, getSourceLocFromPointer(lbloc),
156165
getArrayRef<ASTNode>(elements),
157-
*(SourceLoc *)&rbloc);
166+
getSourceLocFromPointer(rbloc));
158167
}
159168

160169
void *BraceStmt_createStmt(void *ctx, void *lbloc, BridgedArrayRef elements, void *rbloc) {
@@ -164,9 +173,9 @@ void *BraceStmt_createStmt(void *ctx, void *lbloc, BridgedArrayRef elements, voi
164173
}
165174

166175
ASTContext &Context = *static_cast<ASTContext *>(ctx);
167-
return BraceStmt::create(Context, *(SourceLoc *)&lbloc,
176+
return BraceStmt::create(Context, getSourceLocFromPointer(lbloc),
168177
Context.AllocateCopy(nodes),
169-
*(SourceLoc *)&rbloc);
178+
getSourceLocFromPointer(rbloc));
170179
}
171180

172181
void *ParamDecl_create(
@@ -175,9 +184,10 @@ void *ParamDecl_create(
175184
void *_Nullable paramLoc, BridgedIdentifier _Nullable paramName,
176185
void *declContext) {
177186
ASTContext &Context = *static_cast<ASTContext *>(ctx);
178-
return new (Context) ParamDecl(*(SourceLoc *)&loc, *(SourceLoc *)&argLoc,
187+
return new (Context) ParamDecl(getSourceLocFromPointer(loc),
188+
getSourceLocFromPointer(argLoc),
179189
Identifier::getFromOpaquePointer(argName),
180-
*(SourceLoc *)&paramLoc,
190+
getSourceLocFromPointer(paramLoc),
181191
Identifier::getFromOpaquePointer(paramName),
182192
(DeclContext *)declContext);
183193
}
@@ -190,16 +200,18 @@ void *FuncDecl_create(void *ctx, void *staticLoc, bool isStatic, void *funcLoc,
190200
void *_Nullable body, void *_Nullable returnType,
191201
void *declContext) {
192202
auto *paramList = ParameterList::create(
193-
*static_cast<ASTContext *>(ctx), *(SourceLoc *)&paramLLoc,
194-
getArrayRef<ParamDecl *>(params), *(SourceLoc *)&paramRLoc);
203+
*static_cast<ASTContext *>(ctx), getSourceLocFromPointer(paramLLoc),
204+
getArrayRef<ParamDecl *>(params), getSourceLocFromPointer(paramRLoc));
195205
auto declName =
196206
DeclName(*static_cast<ASTContext *>(ctx),
197207
Identifier::getFromOpaquePointer(name), paramList);
198208
auto *out = FuncDecl::create(
199-
*static_cast<ASTContext *>(ctx), *(SourceLoc *)&staticLoc,
209+
*static_cast<ASTContext *>(ctx), getSourceLocFromPointer(staticLoc),
200210
isStatic ? StaticSpellingKind::KeywordStatic : StaticSpellingKind::None,
201-
*(SourceLoc *)&funcLoc, declName, *(SourceLoc *)&nameLoc, isAsync,
202-
*(SourceLoc *)&asyncLoc, throws, *(SourceLoc *)&throwsLoc, nullptr,
211+
getSourceLocFromPointer(funcLoc), declName,
212+
getSourceLocFromPointer(nameLoc), isAsync,
213+
getSourceLocFromPointer(asyncLoc), throws,
214+
getSourceLocFromPointer(throwsLoc), nullptr,
203215
paramList, (TypeRepr *)returnType, (DeclContext *)declContext);
204216
out->setBody((BraceStmt *)body, FuncDecl::BodyKind::Parsed);
205217

@@ -208,17 +220,19 @@ void *FuncDecl_create(void *ctx, void *staticLoc, bool isStatic, void *funcLoc,
208220

209221
void *SimpleIdentTypeRepr_create(void *ctx, void *loc, BridgedIdentifier id) {
210222
ASTContext &Context = *static_cast<ASTContext *>(ctx);
211-
return new (Context) SimpleIdentTypeRepr(DeclNameLoc(*(SourceLoc *)&loc),
212-
DeclNameRef(Identifier::getFromOpaquePointer(id)));
223+
return new (Context) SimpleIdentTypeRepr(
224+
DeclNameLoc(getSourceLocFromPointer(loc)),
225+
DeclNameRef(Identifier::getFromOpaquePointer(id)));
213226
}
214227

215228
void *UnresolvedDotExpr_create(
216229
void *ctx, void *base, void *dotLoc, BridgedIdentifier name,
217230
void *nameLoc) {
218231
ASTContext &Context = *static_cast<ASTContext *>(ctx);
219-
return new (Context) UnresolvedDotExpr((Expr *)base, *(SourceLoc *)&dotLoc,
220-
DeclNameRef(Identifier::getFromOpaquePointer(name)),
221-
DeclNameLoc(*(SourceLoc *)&nameLoc), false);
232+
return new (Context) UnresolvedDotExpr(
233+
(Expr *)base, getSourceLocFromPointer(dotLoc),
234+
DeclNameRef(Identifier::getFromOpaquePointer(name)),
235+
DeclNameLoc(getSourceLocFromPointer(nameLoc)), false);
222236
}
223237

224238
void *ClosureExpr_create(void *ctx, void *body, void *dc) {
@@ -246,9 +260,9 @@ void NominalTypeDecl_setMembers(void *decl, BridgedArrayRef members) {
246260
DeclContextAndDecl StructDecl_create(
247261
void *ctx, void *loc, BridgedIdentifier name, void *nameLoc, void *dc) {
248262
ASTContext &Context = *static_cast<ASTContext *>(ctx);
249-
auto *out = new (Context) StructDecl(SourceLoc(), // *(SourceLoc *)&loc,
263+
auto *out = new (Context) StructDecl(getSourceLocFromPointer(loc),
250264
Identifier::getFromOpaquePointer(name),
251-
SourceLoc(), // *(SourceLoc *)&nameLoc,
265+
getSourceLocFromPointer(nameLoc),
252266
{}, nullptr,
253267
(DeclContext *)dc);
254268
out->setImplicit(); // TODO: remove this.
@@ -258,17 +272,17 @@ DeclContextAndDecl StructDecl_create(
258272
DeclContextAndDecl ClassDecl_create(
259273
void *ctx, void *loc, BridgedIdentifier name, void *nameLoc, void *dc) {
260274
ASTContext &Context = *static_cast<ASTContext *>(ctx);
261-
auto *out = new (Context) ClassDecl(SourceLoc(), // *(SourceLoc *)&loc,
275+
auto *out = new (Context) ClassDecl(getSourceLocFromPointer(loc),
262276
Identifier::getFromOpaquePointer(name),
263-
SourceLoc(), // *(SourceLoc *)&nameLoc,
277+
getSourceLocFromPointer(nameLoc),
264278
{}, nullptr,
265279
(DeclContext *)dc, false);
266280
out->setImplicit(); // TODO: remove this.
267281
return {(DeclContext *)out, (NominalTypeDecl *)out, (Decl *)out};
268282
}
269283

270-
void TopLevelCodeDecl_dump(void *decl) { ((TopLevelCodeDecl *)decl)->dump(); }
284+
void TopLevelCodeDecl_dump(void *decl) { ((TopLevelCodeDecl *)decl)->dump(llvm::errs()); }
271285

272-
void Expr_dump(void *expr) { ((Expr *)expr)->dump(); }
273-
void Decl_dump(void *expr) { ((Decl *)expr)->dump(); }
274-
void Stmt_dump(void *expr) { ((Stmt *)expr)->dump(); }
286+
void Expr_dump(void *expr) { ((Expr *)expr)->dump(llvm::errs()); }
287+
void Decl_dump(void *expr) { ((Decl *)expr)->dump(llvm::errs()); }
288+
void Stmt_dump(void *expr) { ((Stmt *)expr)->dump(llvm::errs()); }

0 commit comments

Comments
 (0)