@@ -117,6 +117,14 @@ bool BridgedASTContext_langOptsHasFeature(BridgedASTContext cContext,
117117#define ABSTRACT_TYPEREPR (Id, Parent ) TYPEREPR(Id, Parent)
118118#include " swift/AST/TypeReprNodes.def"
119119
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+
120128// ===----------------------------------------------------------------------===//
121129// MARK: Diagnostics
122130// ===----------------------------------------------------------------------===//
@@ -274,18 +282,25 @@ void BridgedDiagnostic_finish(BridgedDiagnostic cDiag) {
274282
275283BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed (
276284 BridgedASTContext cContext, BridgedDeclContext cDeclContext,
277- BridgedSourceLoc cBindingKeywordLoc, BridgedExpr nameExpr ,
285+ BridgedSourceLoc cBindingKeywordLoc, BridgedPattern cPattern ,
278286 BridgedExpr initExpr, bool isStatic, bool isLet) {
279287 ASTContext &context = cContext.unbridged ();
280288 DeclContext *declContext = cDeclContext.unbridged ();
281289
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+
287301 return PatternBindingDecl::create (context,
288- /* StaticLoc=*/ SourceLoc (), // FIXME
302+ /* StaticLoc=*/ SourceLoc (),
303+ // FIXME: 'class' spelling kind.
289304 isStatic ? StaticSpellingKind::KeywordStatic
290305 : StaticSpellingKind::None,
291306 cBindingKeywordLoc.unbridged (), pattern,
@@ -1255,6 +1270,26 @@ BridgedExistentialTypeRepr_createParsed(BridgedASTContext cContext,
12551270 ExistentialTypeRepr (cAnyLoc.unbridged (), baseTy.unbridged ());
12561271}
12571272
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+
12581293// ===----------------------------------------------------------------------===//
12591294// MARK: Misc
12601295// ===----------------------------------------------------------------------===//
0 commit comments