@@ -492,7 +492,7 @@ class EnumElementPattern : public Pattern {
492492 SourceLoc DotLoc;
493493 SourceLoc NameLoc;
494494 Identifier Name;
495- EnumElementDecl *ElementDecl ;
495+ PointerUnion< EnumElementDecl *, Expr*> ElementDeclOrUnresolvedOriginalExpr ;
496496 Pattern /* nullable*/ *SubPattern;
497497
498498public:
@@ -501,10 +501,25 @@ class EnumElementPattern : public Pattern {
501501 Pattern *SubPattern, Optional<bool > Implicit = None)
502502 : Pattern(PatternKind::EnumElement),
503503 ParentType (ParentType), DotLoc(DotLoc), NameLoc(NameLoc), Name(Name),
504- ElementDecl(Element), SubPattern(SubPattern) {
504+ ElementDeclOrUnresolvedOriginalExpr(Element),
505+ SubPattern(SubPattern) {
505506 if (Implicit.hasValue () && *Implicit)
506507 setImplicit ();
507508 }
509+
510+ // / Create an unresolved EnumElementPattern for a `.foo` pattern relying on
511+ // / contextual type.
512+ EnumElementPattern (SourceLoc DotLoc,
513+ SourceLoc NameLoc,
514+ Identifier Name,
515+ Pattern *SubPattern,
516+ Expr *UnresolvedOriginalExpr)
517+ : Pattern(PatternKind::EnumElement),
518+ ParentType(), DotLoc(DotLoc), NameLoc(NameLoc), Name(Name),
519+ ElementDeclOrUnresolvedOriginalExpr(UnresolvedOriginalExpr),
520+ SubPattern(SubPattern) {
521+
522+ }
508523
509524 bool hasSubPattern () const { return SubPattern; }
510525
@@ -524,8 +539,19 @@ class EnumElementPattern : public Pattern {
524539
525540 Identifier getName () const { return Name; }
526541
527- EnumElementDecl *getElementDecl () const { return ElementDecl; }
528- void setElementDecl (EnumElementDecl *d) { ElementDecl = d; }
542+ EnumElementDecl *getElementDecl () const {
543+ return ElementDeclOrUnresolvedOriginalExpr.dyn_cast <EnumElementDecl*>();
544+ }
545+ void setElementDecl (EnumElementDecl *d) {
546+ ElementDeclOrUnresolvedOriginalExpr = d;
547+ }
548+
549+ Expr *getUnresolvedOriginalExpr () const {
550+ return ElementDeclOrUnresolvedOriginalExpr.get <Expr*>();
551+ }
552+ bool hasUnresolvedOriginalExpr () const {
553+ return ElementDeclOrUnresolvedOriginalExpr.is <Expr*>();
554+ }
529555
530556 SourceLoc getNameLoc () const { return NameLoc; }
531557 SourceLoc getLoc () const { return NameLoc; }
0 commit comments