@@ -74,46 +74,6 @@ static bool mergeRepresentativeEquivalenceClasses(ConstraintSystem &CS,
74
74
return false ;
75
75
}
76
76
77
- // / Find the next element in a chain of members. If this expression is (or
78
- // / could be) the base of such a chain, this will return \c nullptr.
79
- static Expr *getMemberChainSubExpr (Expr *expr) {
80
- assert (expr && " getMemberChainSubExpr called with null expr!" );
81
- if (auto *UDE = dyn_cast<UnresolvedDotExpr>(expr)) {
82
- return UDE->getBase ();
83
- } else if (auto *CE = dyn_cast<CallExpr>(expr)) {
84
- return CE->getFn ();
85
- } else if (auto *BOE = dyn_cast<BindOptionalExpr>(expr)) {
86
- return BOE->getSubExpr ();
87
- } else if (auto *FVE = dyn_cast<ForceValueExpr>(expr)) {
88
- return FVE->getSubExpr ();
89
- } else if (auto *SE = dyn_cast<SubscriptExpr>(expr)) {
90
- return SE->getBase ();
91
- } else {
92
- return nullptr ;
93
- }
94
- }
95
-
96
- // / Returns the base of a chain of member accesses/method calls. Most
97
- // / expressions do not participate in member chains, and just return \c this.
98
- static UnresolvedMemberExpr *getUnresolvedMemberChainBase (Expr *expr) {
99
- if (auto *subExpr = getMemberChainSubExpr (expr))
100
- return getUnresolvedMemberChainBase (subExpr);
101
- else
102
- return dyn_cast<UnresolvedMemberExpr>(expr);
103
- }
104
-
105
- // / Whether this expression is a member of a member chain.
106
- static bool isMemberChainMember (Expr *expr) {
107
- return getMemberChainSubExpr (expr) != nullptr ;
108
- }
109
- // / Whether this expression sits at the end of a chain of member accesses.
110
- static bool isMemberChainTail (Expr *expr, Expr *parent) {
111
- assert (expr && " isMemberChainTail called with null expr!" );
112
- // If this expression's parent is not itself part of a chain (or, this expr
113
- // has no parent expr), this must be the tail of the chain.
114
- return parent == nullptr || !isMemberChainMember (parent);
115
- }
116
-
117
77
namespace {
118
78
119
79
// / Internal struct for tracking information about types within a series
@@ -836,10 +796,6 @@ namespace {
836
796
// / found during our walk.
837
797
llvm::MapVector<UnresolvedMemberExpr *, Type> UnresolvedBaseTypes;
838
798
839
- // / A map from the tail of each unresolved member chain to the respective
840
- // / base of the chain.
841
- llvm::MapVector<Expr *, UnresolvedMemberExpr *>UnresolvedChainBases;
842
-
843
799
// / Returns false and emits the specified diagnostic if the member reference
844
800
// / base is a nil literal. Returns true otherwise.
845
801
bool isValidBaseOfMemberRef (Expr *base, Diag<> diagnostic) {
@@ -1480,16 +1436,6 @@ namespace {
1480
1436
assert (result != UnresolvedBaseTypes.end ());
1481
1437
return result->second ;
1482
1438
}
1483
-
1484
- void setUnresolvedChainBase (Expr *tail, UnresolvedMemberExpr *base) {
1485
- UnresolvedChainBases.insert ({tail, base});
1486
- }
1487
-
1488
- UnresolvedMemberExpr *getUnresolvedChainBase (Expr *tail) {
1489
- auto result = UnresolvedChainBases.find (tail);
1490
- assert (result != UnresolvedChainBases.end ());
1491
- return result->second ;
1492
- }
1493
1439
1494
1440
virtual Type visitUnresolvedMemberExpr (UnresolvedMemberExpr *expr) {
1495
1441
auto baseLocator = CS.getConstraintLocator (
@@ -1564,7 +1510,7 @@ namespace {
1564
1510
" Unexpected expression at end of unresolved member chain" );
1565
1511
1566
1512
auto memberTy = CS.getType (tail);
1567
- auto *base = getUnresolvedChainBase (tail);
1513
+ auto *base = TypeChecker::getUnresolvedMemberChainBase (tail);
1568
1514
1569
1515
// Copy any type variable options from the result of the tail member to
1570
1516
// the result of the entire chain.
@@ -3839,26 +3785,6 @@ namespace {
3839
3785
if (auto *assignment = dyn_cast<AssignExpr>(expr))
3840
3786
CG.markAcceptableDiscardExprs (assignment->getDest ());
3841
3787
3842
- // If we find an unresolved member chain, wrap it in an
3843
- // UnresolvedMemberChainResultExpr (unless this has already been done)
3844
- // and generate constraints for the wrapped expression.
3845
- auto *parent = Parent.getAsExpr ();
3846
- if (isMemberChainTail (expr, parent)) {
3847
- if (auto *UME = getUnresolvedMemberChainBase (expr)) {
3848
- CG.setUnresolvedChainBase (expr, UME);
3849
- if (!parent || !isa<UnresolvedMemberChainResultExpr>(parent)) {
3850
- auto &cs = CG.getConstraintSystem ();
3851
- auto &context = cs.getASTContext ();
3852
- auto typeInfo = cs.getContextualTypeInfo (expr);
3853
- expr = new (context) UnresolvedMemberChainResultExpr (expr);
3854
- if (typeInfo) {
3855
- cs.setContextualType (expr, (*typeInfo).typeLoc ,
3856
- (*typeInfo).purpose );
3857
- }
3858
- }
3859
- }
3860
- }
3861
-
3862
3788
return { true , expr };
3863
3789
}
3864
3790
0 commit comments