@@ -117,6 +117,14 @@ bool BridgedASTContext_langOptsHasFeature(BridgedASTContext cContext,
117
117
#define ABSTRACT_TYPEREPR (Id, Parent ) TYPEREPR(Id, Parent)
118
118
#include " swift/AST/TypeReprNodes.def"
119
119
120
+ // Define `.asPattern` on each BridgedXXXPattern type.
121
+ #define PATTERN (Id, Parent ) \
122
+ BridgedPattern Bridged##Id##Pattern_asPattern( \
123
+ Bridged##Id##Pattern pattern) { \
124
+ return static_cast <Pattern *>(pattern.unbridged ()); \
125
+ }
126
+ #include " swift/AST/PatternNodes.def"
127
+
120
128
// ===----------------------------------------------------------------------===//
121
129
// MARK: Diagnostics
122
130
// ===----------------------------------------------------------------------===//
@@ -274,18 +282,25 @@ void BridgedDiagnostic_finish(BridgedDiagnostic cDiag) {
274
282
275
283
BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed (
276
284
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
277
- BridgedSourceLoc cBindingKeywordLoc, BridgedExpr nameExpr ,
285
+ BridgedSourceLoc cBindingKeywordLoc, BridgedPattern cPattern ,
278
286
BridgedExpr initExpr, bool isStatic, bool isLet) {
279
287
ASTContext &context = cContext.unbridged ();
280
288
DeclContext *declContext = cDeclContext.unbridged ();
281
289
282
- auto *name = cast<UnresolvedDeclRefExpr>(nameExpr.unbridged ());
283
- auto *varDecl = new (context) VarDecl (
284
- isStatic, isLet ? VarDecl::Introducer::Let : VarDecl::Introducer::Var,
285
- name->getLoc (), name->getName ().getBaseIdentifier (), declContext);
286
- auto *pattern = new (context) NamedPattern (varDecl);
290
+ Pattern *pattern = cPattern.unbridged ();
291
+
292
+ VarDecl::Introducer introducer =
293
+ isLet ? VarDecl::Introducer::Let : VarDecl::Introducer::Var;
294
+
295
+ // Configure all vars.
296
+ pattern->forEachVariable ([&](VarDecl *VD) {
297
+ VD->setStatic (isStatic);
298
+ VD->setIntroducer (introducer);
299
+ });
300
+
287
301
return PatternBindingDecl::create (context,
288
- /* StaticLoc=*/ SourceLoc (), // FIXME
302
+ /* StaticLoc=*/ SourceLoc (),
303
+ // FIXME: 'class' spelling kind.
289
304
isStatic ? StaticSpellingKind::KeywordStatic
290
305
: StaticSpellingKind::None,
291
306
cBindingKeywordLoc.unbridged (), pattern,
@@ -1255,6 +1270,26 @@ BridgedExistentialTypeRepr_createParsed(BridgedASTContext cContext,
1255
1270
ExistentialTypeRepr (cAnyLoc.unbridged (), baseTy.unbridged ());
1256
1271
}
1257
1272
1273
+ // ===----------------------------------------------------------------------===//
1274
+ // MARK: Patterns
1275
+ // ===----------------------------------------------------------------------===//
1276
+
1277
+ BridgedNamedPattern
1278
+ BridgedNamedPattern_createParsed (BridgedASTContext cContext,
1279
+ BridgedDeclContext cDeclContext,
1280
+ BridgedIdentifier name, BridgedSourceLoc loc) {
1281
+ auto &context = cContext.unbridged ();
1282
+ auto *dc = cDeclContext.unbridged ();
1283
+
1284
+ // Note 'isStatic' and the introducer value are temporary.
1285
+ // The outer context should set the correct values.
1286
+ auto *varDecl = new (context) VarDecl (
1287
+ /* isStatic=*/ false , VarDecl::Introducer::Let, loc.unbridged (),
1288
+ name.unbridged (), dc);
1289
+ auto *pattern = new (context) NamedPattern (varDecl);
1290
+ return pattern;
1291
+ }
1292
+
1258
1293
// ===----------------------------------------------------------------------===//
1259
1294
// MARK: Misc
1260
1295
// ===----------------------------------------------------------------------===//
0 commit comments